SPAN vs DIV (khối nội tuyến)


140

Có bất kỳ lý do để sử dụng <div style="display:inline-block">thay vì <span>để bố trí một trang web?

Tôi có thể đặt nội dung lồng trong khoảng không? Cái gì hợp lệ và cái gì không?

Bạn có thể sử dụng cái này để tạo một bảng 3x2 như bố cục không?

<div>
   <span> content1(divs,p, spans, etc) </span>
   <span> content2(divs,p, spans, etc) </span>
   <span> content3(divs,p, spans, etc) </span>
</div>
<div>
   <span> content4(divs,p, spans, etc) </span>
   <span> content5(divs,p, spans, etc) </span>
   <span> content6(divs,p, spans, etc) </span>
</div>

16
Nếu bạn đang tìm một tài liệu xhtml hợp lệ thì bạn không thể đặt các phần tử mức khối bên trong các phần tử nội tuyến.
moorej

1
wiki trên các phần tử html en.wikipedia.org/wiki/HTML_element
moorej

Câu trả lời:


187

Theo thông số kỹ thuật HTML , <span>là một yếu tố nội tuyến và <div>là một yếu tố khối. Bây giờ có thể thay đổi bằng thuộc tính displayCSS nhưng có một vấn đề: về mặt xác thực HTML, bạn không thể đặt các phần tử khối bên trong các phần tử nội tuyến để:

<p>...<div>foo</div>...</p>

không hoàn toàn hợp lệ ngay cả khi bạn thay đổi <div>thành inlinehoặc inline-block.

Vì vậy, nếu yếu tố của bạn là inlinehoặc inline-blocksử dụng a <span>. Nếu đó là một blockyếu tố cấp độ, sử dụng một <div>.


1
vâng, bạn có thể tạo kiểu cho một nhịp và làm cho nó hoạt động giống như một div
Dave

1
Tôi có xu hướng đồng ý rằng inline-blockcó một mối quan hệ gần gũi inlinehơn block.
Bob Aman

11
Câu hỏi ban đầu hỏi về những gì là hợp lệ và để xác thực, <span><div>thực sự khác nhau, như <span>là một yếu tố nội tuyến ( <p>ví dụ trong một ví dụ), trong khi <div>là một yếu tố khối (không hợp lệ trong a <p>).
Brian Campbell

8
@cletus không phải là <p> một phần tử khối?
Aris

8
<p>là một phần tử khối "không thể chứa các phần tử mức khối" ( liên kết ), vì vậy trong khi ví dụ không hợp lệ thì không phải vì <p>nó là nội tuyến.
Pero P.

19

Nếu bạn muốn có một tài liệu xhtml hợp lệ thì bạn không thể đặt div bên trong đoạn văn.

Ngoài ra, một div với màn hình thuộc tính: khối nội tuyến hoạt động khác với nhịp. Một nhịp mặc định là một phần tử nội tuyến, bạn không thể đặt chiều rộng, chiều cao và các thuộc tính khác được liên kết với các khối. Mặt khác, một phần tử với khối nội tuyến thuộc tính sẽ vẫn "chảy" với bất kỳ văn bản xung quanh nào nhưng bạn có thể đặt các thuộc tính như chiều rộng, chiều cao, v.v. Một khoảng với màn hình thuộc tính: khối sẽ không chảy theo cùng một cách là một yếu tố khối nội tuyến nhưng sẽ tạo ra lợi nhuận vận chuyển và có lề mặc định.

Lưu ý rằng khối nội tuyến không được hỗ trợ trong tất cả các trình duyệt. Chẳng hạn, trong Firefox 2 và ít hơn bạn phải sử dụng:

display: -moz-inline-stack;

hiển thị hơi khác so với phần tử khối nội tuyến trong FF3.

Có một bài viết tuyệt vời ở đây về việc tạo các yếu tố chặn nội tuyến của trình duyệt chéo.


-moz-inline-block không inline-block không.
moorej

Nếu bạn muốn nó hiển thị giống như khối nội tuyến trong FF3, bạn thực sự nên sử dụng stack-inline.
moorej

+1 cho liên kết rất thú vị. Đã có những lúc khối nội tuyến giải quyết được một số vấn đề.
Tom

5
  1. Khối nội tuyến là một nửa điểm giữa việc đặt hiển thị của một thành phần thành nội tuyến hoặc chặn. Nó giữ phần tử trong luồng nội tuyến của tài liệu như display: inline, nhưng bạn có thể thao tác các thuộc tính hộp của phần tử (chiều rộng, chiều cao và lề dọc) như bạn có thể với display: block.

  2. Chúng ta không được sử dụng các phần tử khối trong các phần tử nội tuyến. Điều này là không hợp lệ và không có lý do để thực hiện như vậy.


3

Tôi biết Q này đã cũ, nhưng tại sao không sử dụng tất cả các DIV thay vì SPAN? Rồi mọi thứ chơi vui vẻ cùng nhau.

Thí dụ:

<div> 
   <div> content1(divs,p, spans, etc) </div> 
   <div> content2(divs,p, spans, etc) </div> 
   <div> content3(divs,p, spans, etc) </div> 
</div> 
<div> 
   <div> content4(divs,p, spans, etc) </div> 
   <div> content5(divs,p, spans, etc) </div> 
   <div> content6(divs,p, spans, etc) </div> 
</div>

1
Tôi nghĩ rằng mục tiêu là giữ cho mọi thứ gọn gàng và có ngữ nghĩa nhất có thể. Vì vậy, nếu bạn có một tiêu đề và bạn muốn có một div trình bao bọc bên trong - Nó có thể <em> dường như </ em> có nhiều ngữ nghĩa hơn: tiêu đề {} và nhịp tiêu đề {} thì nó sẽ có tiêu đề {} và .inner {} . Tuy nhiên ... nếu bạn sử dụng .inner, bạn có thể sử dụng nó nhiều lần - các nhịp rất có thể phải được tạo kiểu độc lập. Điểm mấu chốt - bạn muốn sử dụng càng ít đánh dấu càng tốt - vì vậy mọi người đang cố gắng tìm ra cách để tránh div> div> div> div> div, v.v.
sheriffderek

3

Tôi nghĩ rằng nó sẽ giúp bạn hiểu được sự khác biệt cơ bản giữa Inline-Elements (ví dụ span) và Block-Elements (ví dụ div), để hiểu lý do tại sao "display: inline-block" lại hữu ích như vậy.

Vấn đề : các phần tử nội tuyến (ví dụ: span, a, nút, đầu vào, v.v.) chỉ lấy "lề" theo chiều ngang (lề trái và lề phải), chứ không phải theo chiều dọc. Khoảng cách dọc chỉ hoạt động trên các thành phần khối (hoặc nếu "display: block" được đặt)

Giải pháp : Chỉ thông qua "display: inline-block" cũng sẽ lấy khoảng cách dọc (trên và dưới). Lý do: Span phần tử nội tuyến, bây giờ hoạt động như một phần tử khối bên ngoài, nhưng giống như một phần tử nội tuyến bên trong

Ví dụ mã ở đây:

 /* Inlineelement */

        div,
        span {
            margin: 30px;
        }

        span {
            outline: firebrick dotted medium;
            background-color: antiquewhite;
        }

        span.mitDisplayBlock {
            background: #a2a2a2;
            display: block;
            width: 200px;
            height: 200px;
        }

        span.beispielMargin {
            margin: 20px;
        }

        span.beispielMarginDisplayInlineBlock {
            display: inline-block;
        }

        span.beispielMarginDisplayInline {
            display: inline;
        }

        span.beispielMarginDisplayBlock {
            display: block;
        }

        /* Blockelement */

        div {
            outline: orange dotted medium;
            background-color: deepskyblue;
        }

        .paddingDiv {
            padding: 20px;
            background-color: blanchedalmond;
        }

        .marginDivWrapper {
            background-color: aliceblue;

        }

        .marginDiv {
            margin: 20px;
            background-color: blanchedalmond;
        }
    </style>
    <style>
        /* Nur für das w3school Bild */

        #w3_DIV_1 {
            bottom: 0px;
            box-sizing: border-box;
            height: 391px;
            left: 0px;
            position: relative;
            right: 0px;
            text-size-adjust: 100%;
            top: 0px;
            width: 913.984px;
            perspective-origin: 456.984px 195.5px;
            transform-origin: 456.984px 195.5px;
            background: rgb(241, 241, 241) none repeat scroll 0% 0% / auto padding-box border-box;
            border: 2px dashed rgb(187, 187, 187);
            font: normal normal 400 normal 15px / 22.5px Lato, sans-serif;
            padding: 45px;
            transition: all 0.25s ease-in-out 0s;
        }

        /*#w3_DIV_1*/

        #w3_DIV_1:before {
            bottom: 349.047px;
            box-sizing: border-box;
            content: '"Margin"';
            display: block;
            height: 31px;
            left: 0px;
            position: absolute;
            right: 0px;
            text-align: center;
            text-size-adjust: 100%;
            top: 6.95312px;
            width: 909.984px;
            perspective-origin: 454.984px 15.5px;
            transform-origin: 454.984px 15.5px;
            font: normal normal 400 normal 21px / 31.5px Lato, sans-serif;
        }

        /*#w3_DIV_1:before*/

        #w3_DIV_2 {
            bottom: 0px;
            box-sizing: border-box;
            color: black;
            height: 297px;
            left: 0px;
            position: relative;
            right: 0px;
            text-decoration: none solid rgb(255, 255, 255);
            text-size-adjust: 100%;
            top: 0px;
            width: 819.984px;
            column-rule-color: rgb(255, 255, 255);
            perspective-origin: 409.984px 148.5px;
            transform-origin: 409.984px 148.5px;
            caret-color: rgb(255, 255, 255);
            background: rgb(76, 175, 80) none repeat scroll 0% 0% / auto padding-box border-box;
            border: 0px none rgb(255, 255, 255);
            font: normal normal 400 normal 15px / 22.5px Lato, sans-serif;
            outline: rgb(255, 255, 255) none 0px;
            padding: 45px;
        }

        /*#w3_DIV_2*/

        #w3_DIV_2:before {
            bottom: 258.578px;
            box-sizing: border-box;
            content: '"Border"';
            display: block;
            height: 31px;
            left: 0px;
            position: absolute;
            right: 0px;
            text-align: center;
            text-size-adjust: 100%;
            top: 7.42188px;
            width: 819.984px;
            perspective-origin: 409.984px 15.5px;
            transform-origin: 409.984px 15.5px;
            font: normal normal 400 normal 21px / 31.5px Lato, sans-serif;
        }

        /*#w3_DIV_2:before*/

        #w3_DIV_3 {
            bottom: 0px;
            box-sizing: border-box;
            height: 207px;
            left: 0px;
            position: relative;
            right: 0px;
            text-size-adjust: 100%;
            top: 0px;
            width: 729.984px;
            perspective-origin: 364.984px 103.5px;
            transform-origin: 364.984px 103.5px;
            background: rgb(241, 241, 241) none repeat scroll 0% 0% / auto padding-box border-box;
            font: normal normal 400 normal 15px / 22.5px Lato, sans-serif;
            padding: 45px;
        }

        /*#w3_DIV_3*/

        #w3_DIV_3:before {
            bottom: 168.344px;
            box-sizing: border-box;
            content: '"Padding"';
            display: block;
            height: 31px;
            left: 3.64062px;
            position: absolute;
            right: -3.64062px;
            text-align: center;
            text-size-adjust: 100%;
            top: 7.65625px;
            width: 729.984px;
            perspective-origin: 364.984px 15.5px;
            transform-origin: 364.984px 15.5px;
            font: normal normal 400 normal 21px / 31.5px Lato, sans-serif;
        }

        /*#w3_DIV_3:before*/

        #w3_DIV_4 {
            bottom: 0px;
            box-sizing: border-box;
            height: 117px;
            left: 0px;
            position: relative;
            right: 0px;
            text-size-adjust: 100%;
            top: 0px;
            width: 639.984px;
            perspective-origin: 319.984px 58.5px;
            transform-origin: 319.984px 58.5px;
            background: rgb(191, 201, 101) none repeat scroll 0% 0% / auto padding-box border-box;
            border: 2px dashed rgb(187, 187, 187);
            font: normal normal 400 normal 15px / 22.5px Lato, sans-serif;
            padding: 20px;
        }

        /*#w3_DIV_4*/

        #w3_DIV_4:before {
            box-sizing: border-box;
            content: '"Content"';
            display: block;
            height: 73px;
            text-align: center;
            text-size-adjust: 100%;
            width: 595.984px;
            perspective-origin: 297.984px 36.5px;
            transform-origin: 297.984px 36.5px;
            font: normal normal 400 normal 21px / 73.5px Lato, sans-serif;
        }

        /*#w3_DIV_4:before*/
   <h1> The Box model - content, padding, border, margin</h1>
    <h2> Inline element - span</h2>
    <span>Info: A span element can not have height and width (not without "display: block"), which means it takes the fixed inline size </span>

    <span class="beispielMargin">
        <b>Problem:</b> inline elements (eg span, a, button, input etc.) take "margin" only vertically (margin-left and margin-right)
        on, not horizontal. Vertical spacing works only on block elements (or if display: block is set) </span>

    <span class="beispielMarginDisplayInlineBlock">
        <b>Solution</b> Only through
        <b> "display: inline-block" </ b> will also take the vertical distance (top and bottom). Reason: Inline element Span,
        behaves now like a block element to the outside, but like an inline element inside</span>

    <span class="beispielMarginDisplayInline">Example: here "display: inline". See the margin with Inspector!</span>

    <span class="beispielMarginDisplayBlock">Example: here "display: block". See the margin with Inspector!</span>

    <span class="beispielMarginDisplayInlineBlock">Example: here "display: inline-block". See the margin with Inspector! </span>

    <span class="mitDisplayBlock">Only with the "Display" -property and "block" -Value in addition, a width and height can be assigned. "span" is then like
        a "div" block element.  </span>

    <h2>Inline-Element - Div</h2>
    <div> A div automatically takes "display: block." </ div>
    <div class = "paddingDiv"> Padding is for padding </ div>

    <div class="marginDivWrapper">
Wrapper encapsulates the example "marginDiv" to clarify the "margin" (distance from inner element "marginDiv" to the text)
        of the outer element "marginDivWrapper". Here 20px;)
        
    <div class = "marginDiv"> margin is for the margins </ div>
        And there, too, 20px;
    </div>

    <h2>w3school sample image </h2>
    source:
    <a href="https://www.w3schools.com/css/css_boxmodel.asp">CSS Box Model</a>
    <div id="w3_DIV_1">
        <div id="w3_DIV_2">
            <div id="w3_DIV_3">
                <div id="w3_DIV_4">
                </div>
            </div>
        </div>
    </div>


2

Như những người khác đã trả lời ... divlà một “yếu tố ngăn chặn” (nay là định nghĩa lại như nội dung luồng ) và spanlà một “yếu tố inline” ( phân nhịp Content ). Có, bạn có thể thay đổi cách trình bày mặc định của các yếu tố này, nhưng có một sự khác biệt giữa dòng chảy giữa dòng và so với khối khối, và nhịp phrasing với so với dòng nội tuyến.

Một phần tử được phân loại là nội dung luồng chỉ có thể được sử dụng ở nơi dự kiến ​​nội dung luồng và một phần tử được phân loại là nội dung cụm từ có thể được sử dụng ở nơi dự kiến ​​nội dung phrasing. Vì tất cả nội dung cụm từ nội dung luồng, nên một yếu tố phân cụm cũng có thể được sử dụng ở bất kỳ nơi nào có nội dung luồng được mong đợi. Thông số kỹ thuật cung cấp thông tin chi tiết hơn .

Tất cả các thành phần cụm từ, chẳng hạn như strongem, chỉ có thể chứa các thành phần cụm từ khác: bạn không thể đặt một tablebên trong một citeví dụ. Hầu hết các dòng chảy nội dung như divlicó thể chứa tất cả các loại nội dung dòng chảy (cũng như phân nhịp nội dung), nhưng có một vài trường hợp ngoại lệ: p, pre, và thlà ví dụ về phân nhịp không có nội dung dòng chảy ( “yếu tố khối”) có thể chỉ chứa phân nhịp nội dung (các yếu tố nội tuyến của trực tuyến. Và tất nhiên, có những hạn chế yếu tố bình thường như dltablechỉ được phép chứa một số yếu tố nhất định.

Trong khi cả hai divplà nội dung luồng không phrasing, divcó thể chứa các nội dung luồng khác (bao gồm nhiều divs và ps). Mặt khác, pchỉ có thể chứa nội dung phrasing trẻ em. Điều đó có nghĩa là bạn không thể đặt divbên trong a p, mặc dù cả hai đều là các phần tử dòng không phrasing.

Bây giờ đây là kicker. Các thông số kỹ thuật ngữ nghĩa này không liên quan đến cách hiển thị phần tử. Do đó, nếu bạn có một divbên trong a span, bạn sẽ gặp lỗi xác thực ngay cả khi bạn có span {display: block;}div {display: inline;}trong CSS của mình.


Điều gì về khối nội tuyến bên trong nội tuyến và khối bên trong khối nội tuyến?
user764754

@ user764754 miễn là bạn tuân thủ các thông số kỹ thuật, bạn có thể tạo kiểu cho bất kỳ yếu tố nào bạn muốn và nó vẫn sẽ hợp lệ. ( inline-blocklà kiểu CSS, không phải là kiểu phần tử hoặc mô hình nội dung.)
chharvey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.