SPAN 대 DIV (인라인 블록)


140

웹 페이지를 레이아웃하는 데 <div style="display:inline-block">대신 사용할 이유가 <span>있습니까?

범위 내에 중첩 된 내용을 넣을 수 있습니까? 유효하고 무엇이 아닌가?

이것을 사용하여 레이아웃과 같은 3x2 테이블을 만들 수 있습니까?

<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
유효한 xhtml 문서를 사용하려는 경우 블록 레벨 요소를 인라인 요소 안에 넣을 수 없습니다.
moorej

1
HTML 요소에 위키 en.wikipedia.org/wiki/HTML_element
moorej

답변:


187

표시되는 HTML 명세에 따르면 , <span>인라인 요소 및 <div>블록 요소이다. 이제 displayCSS 속성을 사용하여 변경할 수 있지만 한 가지 문제가 있습니다 .HTML 유효성 검사 측면에서 블록 요소를 인라인 요소 안에 넣을 수 없습니다.

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

당신이를 변경하는 경우에도 엄격 유효하지 않습니다 <div>inlineinline-block.

당신의 요소 인 경우, 그래서, inline또는 inline-block를 사용합니다 <span>. 그것은 만약 block레벨 요소가하는을 사용합니다 <div>.


1
예, 스팬을 스타일링하고 div처럼 동작하도록 만들 수 있습니다.
Dave

1
나는 보다 inline-block더 가까운 관계 에 동의하는 경향 inlineblock있습니다.
Bob Aman

11
원래 질문은 유효 무엇인지에 대해 질문하고, 확인을 위해, <span>그리고 <div>로, 실제로 다른 <span>인라인 요소 (A 내에서 유효한 인 <p>반면, 예를 들어) <div>블록 요소 (A 내에서 유효하지입니다 <p>).
Brian Campbell

8
@cletus는 <p> 블록 요소가 아닙니까?
Aris

8
<p>는 "블록 수준 요소를 포함 할 수 없습니다"( link ) 인 블록 요소 이므로 예제가 유효하지 않지만 <p>인라인 이 아니기 때문에 올바르지 않습니다 .
Pero P.

19

유효한 xhtml 문서를 원한다면 단락 안에 div를 넣을 수 없습니다.

또한 속성 표시 : 인라인 블록이있는 div는 범위와 다르게 작동합니다. 범위는 기본적으로 인라인 요소이므로 너비, 높이 및 블록과 관련된 기타 속성을 설정할 수 없습니다. 반면에 인라인 블록 속성을 가진 요소는 여전히 주변 텍스트와 함께 "흐르게"되지만 너비, 높이 등과 같은 속성을 설정할 수 있습니다. 속성 display : block을 사용하는 범위 는 같은 방식으로 흐르지 않습니다. 인라인 블록 요소로 표시되지만 캐리지 리턴을 작성하고 기본 여백을 갖습니다.

모든 브라우저에서 인라인 차단이 지원되는 것은 아닙니다. 예를 들어 Firefox 2 이하에서는 다음을 사용해야합니다.

display: -moz-inline-stack;

FF3의 인라인 블록 요소와 약간 다르게 표시됩니다.

크로스 브라우저 인라인 블록 요소를 만드는 방법에 대한 훌륭한 기사가 있습니다 .


-moz-inline-block은 인라인 블록을하지 않습니다.
moorej

FF3에서 인라인 블록과 같이 더 많이 표시하려면 실제로 인라인 스택도 사용해야합니다.
moorej

매우 흥미로운 링크는 +1입니다. 인라인 블록이 여러 가지 문제를 해결했을 때가있었습니다.
Tom

5
  1. 인라인 블록은 요소의 디스플레이를 인라인 또는 블록으로 설정하는 중간 지점입니다. display : inline처럼 문서의 인라인 흐름에 요소를 유지하지만 display : block과 같이 요소의 상자 속성 (너비, 높이 및 세로 여백)을 조작 할 수 있습니다.

  2. 인라인 요소 내에서 블록 요소를 사용해서는 안됩니다. 이것은 유효하지 않으며 그러한 관행을 수행 할 이유가 없습니다.


3

나는이 Q가 오래되었다는 것을 알고 있지만 SPAN 대신 모든 DIV를 사용하지 않는 이유는 무엇입니까? 그러면 모든 것이 함께 행복해집니다.

예:

<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
목표는 모든 것을 가능한 한 간결하고 의미있게 유지하는 것입니다. 따라서 헤더가 있고 내부 래퍼 div를 원한다면 헤더 {} 및 헤더 범위 {}가 더 의미 론적으로 <em> 보여 </ em>있을 수 있습니다. 그러면 헤더 {} 및 .inner {}가 있습니다. . 그러나 .... inner를 사용하면 여러 번 사용할 수 있습니다. 스팬은 독립적으로 스타일을 지정해야 할 것입니다. 결론-가능한 한 적은 마크 업을 사용하기를 원하므로 사람들은 div> div> div> div> div 등을 피하는 방법을 알아 내려고 노력하고 있습니다.
sheriffderek

3

왜 "display : inline-block"이 유용한 지 이해하기 위해 인라인 요소 (예 : 스팬)와 블록 요소 (예 : div)의 기본적인 차이점을 이해하는 데 도움이 될 것입니다.

문제 : 인라인 요소 (예 : 스팬, a, 버튼, 입력 등)는 세로가 아닌 가로 (여백-왼쪽 및 여백-오른쪽)에서만 "여백"을 가져옵니다. 수직 간격은 블록 요소에서만 작동합니다 ( "display : block"이 설정된 경우).

해결책 : "디스플레이 : 인라인 블록"을 통해서만 수직 거리 (상단 및 하단)를 사용합니다. 이유 : 인라인 요소 스팬, 이제 외부의 블록 요소처럼 작동하지만 내부의 인라인 요소처럼 작동 함

여기 코드 예제들 :

 /* 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

다른 사람들이 대답했듯이… div“블록 요소”(현재 흐름 내용으로 재정의 )이고 span“인라인 요소”( 구문 내용) )입니다. 예, 이러한 요소의 기본 표현을 변경할 수 있지만 "흐름"과 "차단"및 "구문"과 "인라인"사이에는 차이가 있습니다.

흐름 내용으로 분류 된 요소 는 흐름 내용이 예상되는 곳에서만 사용될 수 있고 , 표현 내용으로 분류 된 요소 는 표현 내용이 예상되는 곳에 사용될 수 있습니다. 모든 문구 내용 흐름 내용이므로, 흐름 요소가 예상되는 곳이면 어디든지 문구 요소를 사용할 수 있습니다. 사양은 더 자세한 정보를 제공합니다 .

모든 말씨의 같은 요소, strong그리고 em, 수 다른 말씨 요소를 포함 : 당신이를 넣을 수 없습니다 table돌며 cite예를 들면. 대부분이 같은 내용의 흐름 divli흐름 모든 유형의 콘텐츠를 포함 할 수 있습니다 (물론 컨텐츠를 같이 분석 등),하지만 몇 가지 예외가 있습니다 p, pre그리고 th비 같이 분석 흐름 콘텐츠의 예는 수 ( "블록 요소")입니다 말씨를 포함 내용 ( "인라인 요소"). 물론 같은 일반적인 요소 제한이 dltable 특정 요소를 포함하도록 허용하고는.

이 두 가지 방법 모두 div하고 p있는 흐름의 내용을 비 같이 분석의이 div(을 포함한 다른 흐름 컨텐츠의 아이로 포함 할 수 있습니다 div들과 p들). 다른 한편으로, p표현 콘텐츠 만 포함 할 수 있습니다. 즉 , 둘 다 구문이 아닌 흐름 요소이지만 div내부를에 넣을 수 없습니다 p.

이제 키커가 있습니다. 이러한 의미 사양은 요소가 표시되는 방법과 관련이 없습니다. 따라서 div내부 에가 있으면 CSS에 있고 있는 span경우에도 유효성 검사 오류가 발생 합니다.span {display: block;}div {display: inline;}


인라인 블록 내부의 인라인 블록과 인라인 블록 내부의 블록은 어떻습니까?
user764754

@ user764754 스펙을 준수하는 한 원하는대로 요소를 스타일링 할 수 있으며 여전히 유효합니다. ( inline-block요소 또는 컨텐츠 모델의 유형이 아닌 CSS 스타일입니다.)
chharvey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.