SPAN - DIV (вбудований блок)


140

Чи є причина використовувати компоновку веб-сторінки <div style="display:inline-block">замість <span>а?

Чи можна розмістити вміст, вкладений всередині проміжку? Що є дійсним, а що ні?

Це нормально використовувати це, щоб зробити таблицю 3х2, як макет?

<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>є блоковим елементом. Тепер це можна змінити за допомогою displayвластивості CSS, але є одна проблема: що стосується перевірки HTML, ви не можете розміщувати блокові елементи всередині вбудованих елементів так:

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

не є строго дійсним, навіть якщо ви змінили <div>на inlineабо inline-block.

Отже, якщо ваш елемент є inlineабо ви inline-blockвикористовуєте <span>. Якщо це blockелемент рівня, використовуйте a <div>.


1
так, ви можете накреслити проміжок і змусити його поводитись так само, як дива
Дейв

1
Я схильний погоджуватися, що inline-blockмає більш тісний зв’язок із inlineчим block.
Боб Аман

11
Оригінальне запитання, що задається питанням про те, що є дійсним, і для перевірки, <span>і <div>чи дійсно відрізняється, як <span>і вбудований елемент (дійсний, наприклад, в межах <p>, наприклад), в той час <div>як блоковий елемент (не вірно в межах а <p>).
Брайан Кемпбелл

8
@cletus не є <p> блочним елементом?
Аріс

8
<p>- це блок-елемент, який "не може містити елементів рівня блоку" ( посилання ), тож приклад недійсний, це не тому, що <p>є вбудованим.
Перо П.

19

Якщо ви хочете мати дійсний документ у форматі xhtml, то ви не можете ввести розділ всередині абзацу.

Також div з відображенням властивості: вбудований блок працює інакше, ніж проміжок. Проміжок за замовчуванням є вбудованим елементом, ви не можете встановити ширину, висоту та інші властивості, пов’язані з блоками. З іншого боку, елемент з властивістю вбудованого блоку все ще буде "перетікати" з будь-яким оточуючим текстом, але ви можете встановити такі властивості, як ширина, висота тощо. Проміжок із відображенням властивості: блок не буде текти однаково як елемент вбудованого блоку, але створить повернення каретки та матиме за замовчуванням поле.

Зауважте, що вбудований блок підтримується не в усіх браузерах. Наприклад, у Firefox 2 і менше ви повинні використовувати:

display: -moz-inline-stack;

який відображає дещо інший елемент вбудованого блоку в FF3.

Існує велика стаття тут на створенні крос - браузер елементів рядний блок.


-moz-inline-block робить inline-block не робить.
moorej

Якщо ви хочете, щоб він відображався більше як вбудований блок у FF3, ви також повинні використовувати Inline-stack.
moorej

+1 за дуже цікаве посилання. Були випадки, коли вбудований блок вирішив би низку проблем.
Том

5
  1. Вбудований блок - це половина шляху між встановленням відображення елемента на вбудований або блокуваний. Він зберігає елемент у вбудованому потоці документа, як-от дисплей: вбудований, але ви можете маніпулювати атрибутами поля (ширина, висота та вертикальні поля), як ви можете, з показом: блок.

  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
Я думаю, що мета полягає в тому, щоб все було максимально худорлявим і смисловим. Тож якщо у вас є заголовок, і ви хочете, щоб внутрішня оболонка дівила - <em> здасться </em> більш семантичним мати: заголовок {} і проміжок заголовка {}, тоді він матиме заголовок {} та .inner {} . Однак ... якщо ви використовуєте .inner, ви можете використовувати його багато разів - проміжки, швидше за все, доведеться самостійно стилювати. Підсумок - ви хочете використовувати якомога менше розмітки - тому люди намагаються з'ясувати способи уникнути div> div> div> div> div тощо
sheriffderek

3

Я думаю, це допоможе вам зрозуміти основні відмінності між елементами Inline-Elements (наприклад, span) та Block-Elements (наприклад, div), щоб зрозуміти, чому "display: inline-block" настільки корисний.

Проблема : вбудовані елементи (наприклад, span, a, кнопка, введення тощо) беруть "margin" лише горизонтально (margin-left та margin-right), а не вертикально. Вертикальний інтервал працює лише на елементах блоку (або якщо встановлено "display: block")

Рішення : Тільки через "display: inline-block" також буде проходити вертикальне відстань (верхній і нижній). Причина: вбудований елемент 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всередині a span, ви отримаєте помилку перевірки, навіть якщо у вас є span {display: block;}і div {display: inline;}у вашому CSS.


Що щодо вбудованого блоку всередині вбудованого і блоку всередині вбудованого блоку?
user764754

@ user764754, якщо ви дотримуєтесь специфікацій, ви можете стилювати будь-який елемент, як вам завгодно, і він все одно буде дійсним. ( inline-blockце стиль CSS, а не тип елемента чи
вмістової
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.