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
wiki บนองค์ประกอบ html en.wikipedia.org/wiki/HTML_element
moorej

คำตอบ:


187

ตามสเปคของ HTML , <span>เป็นองค์ประกอบแบบอินไลน์และ<div>เป็นองค์ประกอบบล็อก ตอนนี้สามารถเปลี่ยนแปลงได้โดยใช้displayคุณสมบัติ CSS แต่มีปัญหาหนึ่งประการ: ในแง่ของการตรวจสอบความถูกต้องของ HTML คุณไม่สามารถใส่องค์ประกอบบล็อกไว้ในองค์ประกอบอินไลน์ได้ดังนั้น:

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

ไม่ถูกต้องอย่างเคร่งครัดแม้ว่าคุณจะเปลี่ยน<div>ไปหรือinlineinline-block

ดังนั้นถ้าองค์ประกอบของคุณinlineหรือการใช้งานinline-block <span>ถ้ามันเป็นองค์ประกอบระดับใช้block<div>


1
ใช่คุณสามารถจัดรูปแบบช่วงและทำให้มันทำงานเช่นเดียวกับ div
เดฟ

1
ฉันมักจะเห็นด้วยที่inline-blockมีความสัมพันธ์ใกล้ชิดกับinlineblockกว่า
Bob Aman

11
คำถามเดิมถามเกี่ยวกับสิ่งที่ถูกต้องและสำหรับการตรวจสอบ<span>และ<div>แตกต่างกันอย่างแน่นอนเช่นเดียวกับ<span>องค์ประกอบอินไลน์ (ใช้ได้ภายใน<p>, ตัวอย่างเช่น) ในขณะที่<div>เป็นองค์ประกอบบล็อก (ไม่ถูกต้องภายใน<p>)
ไบรอันแคมป์เบล

8
@cletus ไม่ใช่องค์ประกอบบล็อกหรือไม่
Aris

8
<p>เป็นองค์ประกอบบล็อกที่ "ไม่สามารถมีองค์ประกอบระดับบล็อก" ( ลิงก์ ) ดังนั้นในขณะที่ตัวอย่างไม่ถูกต้องเนื่องจากไม่ใช่<p>แบบอินไลน์
Pero P.

19

หากคุณต้องการมีเอกสาร xhtml ที่ถูกต้องคุณจะไม่สามารถใส่ div ไว้ในย่อหน้า

นอกจากนี้ div ที่มีการแสดงคุณสมบัติ: inline-block ยังทำงานแตกต่างจากการขยาย การขยายโดยปริยายจะเป็นองค์ประกอบอินไลน์คุณไม่สามารถตั้งค่าความกว้างความสูงและคุณสมบัติอื่น ๆ ที่เกี่ยวข้องกับบล็อกได้ ในทางกลับกันองค์ประกอบที่มีคุณสมบัติ inline-block จะยังคง "ไหล" พร้อมกับข้อความที่อยู่รอบ ๆ แต่คุณอาจตั้งค่าคุณสมบัติเช่นความกว้างความสูง ฯลฯ ช่วงที่มีการแสดงคุณสมบัติ: บล็อกจะไม่ไหลในลักษณะเดียวกัน เป็นองค์ประกอบแบบอินไลน์บล็อก แต่จะสร้างการขึ้นบรรทัดใหม่และมีระยะห่างเริ่มต้น

โปรดทราบว่าเบราว์เซอร์ทั้งหมดไม่รองรับ inline-block เช่นใน Firefox 2 และน้อยกว่าคุณต้องใช้:

display: -moz-inline-stack;

ซึ่งแสดงแตกต่างจากองค์ประกอบบล็อกแบบอินไลน์เล็กน้อยใน FF3

มีบทความที่ดีคือที่นี่ในการสร้างเบราว์เซอร์ข้ามองค์ประกอบแบบอินไลน์บล็อก


-moz-inline-block ไม่ได้ inline-block ไม่ได้
moorej

หากคุณต้องการให้มันแสดงเช่น inline block ใน FF3 คุณควรใช้ inline-stack เช่นกัน
moorej

+1 สำหรับลิงก์ที่น่าสนใจมาก มีหลายครั้งที่บล็อกแบบอินไลน์จะแก้ไขปัญหาได้จำนวนหนึ่ง
Tom

5
  1. Inline-block เป็นจุดกึ่งกลางระหว่างการตั้งค่าการแสดงองค์ประกอบเป็นแบบอินไลน์หรือเพื่อบล็อก มันช่วยให้องค์ประกอบในการไหลแบบอินไลน์ของเอกสารเช่น display: inline ทำ แต่คุณสามารถจัดการคุณสมบัติกล่ององค์ประกอบ (ความกว้างความสูงและระยะขอบแนวตั้ง) เช่นเดียวกับ display: block

  2. เราจะต้องไม่ใช้องค์ประกอบของบล็อกภายในองค์ประกอบแบบอินไลน์ สิ่งนี้ไม่ถูกต้องและไม่มีเหตุผลที่จะทำเช่นนั้น


3

ฉันรู้ว่า Q นี้เก่า แต่ทำไมไม่ใช้ DIV ทั้งหมดแทน SPAN จากนั้นทุกอย่างเล่นด้วยกันอย่างมีความสุข

ตัวอย่าง:

<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 wrapper ภายใน - <em> ดูเหมือน </em> จะมีความหมายมากกว่านี้: header {} และ header span {} ดังนั้นมันจะมี header {} และ .inner {} . อย่างไรก็ตาม ... หากคุณใช้. ภายในคุณสามารถใช้งานได้หลายครั้ง - ช่วงเวลาที่มีแนวโน้มว่าจะต้องมีการกำหนดสไตล์อิสระ บรรทัดล่างสุด - คุณต้องการใช้มาร์กอัปให้น้อยที่สุดเท่าที่จะทำได้ดังนั้นผู้คนจึงพยายามหาวิธีที่จะหลีกเลี่ยง div> div> div> div> div> div เป็นต้น
sheriffderek

3

ฉันคิดว่ามันจะช่วยให้คุณเข้าใจความแตกต่างพื้นฐานระหว่าง Inline-Elements (เช่น span) และ Block-Elements (เช่น div) เพื่อที่จะเข้าใจว่าทำไม "display: inline-block" จึงมีประโยชน์

ปัญหา : องค์ประกอบแบบอินไลน์ (เช่น span, a, ปุ่ม, อินพุต ฯลฯ ) ใช้ "ระยะขอบ" ในแนวนอนเท่านั้น (ระยะขอบซ้ายและระยะขอบขวา) บนไม่ใช่แนวตั้ง ระยะห่างแนวตั้งใช้งานได้เฉพาะกับองค์ประกอบบล็อก (หรือหากตั้งค่า "display: block")

วิธีแก้ไข : เฉพาะผ่าน "จอแสดงผล: บล็อกแบบอินไลน์" เท่านั้นที่จะใช้ระยะทางแนวตั้ง (บนและล่าง) เหตุผล: องค์ประกอบ Inline Span ตอนนี้ทำงานเหมือนองค์ประกอบบล็อกด้านนอก แต่เหมือนองค์ประกอบอินไลน์ภายใน

ตัวอย่างโค้ดที่นี่:

 /* 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ได้ ส่วนใหญ่ไหลเนื้อหาเช่นdivและliสามารถมีทุกประเภทของเนื้อหาการไหล (เช่นเดียวกับถ้อยคำเนื้อหา) แต่มีข้อยกเว้นบางประการ: p, preและthเป็นตัวอย่างของเนื้อหาการไหลที่ไม่ใช่ถ้อยคำ (“องค์ประกอบของบล็อก”) ที่สามารถเพียง แต่มีการใช้ถ้อยคำ เนื้อหา (“ องค์ประกอบแบบอินไลน์”) และแน่นอนว่ามีข้อ จำกัด องค์ประกอบปกติเช่นdlและtableอนุญาตให้มีองค์ประกอบบางอย่างเท่านั้น

ในขณะที่ทั้งสองdivและpไม่ใช่เนื้อหาการไหลของคำศัพท์divสามารถมีลูกเนื้อหาการไหลอื่น ๆ (รวมถึงdivs และps เพิ่มเติม) ในทางกลับกันpอาจมีเด็กเนื้อหาที่ใช้ถ้อยคำเท่านั้น นั่นหมายความว่าคุณไม่สามารถใส่divข้างในได้pได้แม้ว่าทั้งคู่จะเป็นองค์ประกอบการไหลที่ไม่ใช้ถ้อยคำก็ตาม

ตอนนี้ที่นี่เป็นนักเตะ ข้อมูลจำเพาะเชิงความหมายเหล่านี้ไม่เกี่ยวข้องกับการแสดงองค์ประกอบ ดังนั้นหากคุณมีส่วนdivในspanคุณจะได้รับข้อผิดพลาดในการตรวจสอบแม้ว่าคุณจะมีspan {display: block;}และdiv {display: inline;}ใน CSS ของคุณ


สิ่งที่เกี่ยวกับ inline-block ข้างใน inline และ block ข้างใน inline-block
user764754

@ user764754 ตราบใดที่คุณปฏิบัติตามข้อกำหนดคุณสามารถจัดองค์ประกอบตามที่คุณต้องการและจะยังคงใช้งานได้ ( inline-blockเป็นรูปแบบ CSS ไม่ใช่ประเภทขององค์ประกอบหรือรูปแบบเนื้อหา)
chharvey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.