В чем разница между тегами HTML ‹div› и ‹span›?

Я хотел бы попросить несколько простых примеров, показывающих использование <div> и <span>.
Я видел, как они оба использовались для пометки раздела страницы знаком id или class, но мне интересно знать, бывают ли случаи, когда одно предпочтительнее другого.


person JSchaefer    schedule 08.10.2008    source источник


Ответы (13)


Это означает, что для их семантического использования следует использовать блоки div для обертывания разделов документа, а интервалы - для обертывания небольших частей текста, изображений и т. Д.

Например:

<div>This a large main division, with <span>a small bit</span> of spanned text!</div>

Обратите внимание, что размещение блочного элемента внутри встроенного элемента запрещено, поэтому:

<div>Some <span>text that <div>I want</div> to mark</span> up</div>

... незаконно.


РЕДАКТИРОВАТЬ: Начиная с HTML5, некоторые элементы блока могут быть размещены внутри некоторых встроенных элементов. См. Справку по MDN здесь для довольно четкого списка. Вышеупомянутое по-прежнему является незаконным, поскольку <span> принимает только фразовое содержимое, а <div> является потоковым содержимым.


Вы просили привести несколько конкретных примеров, например, один взят с моего веб-сайта по боулингу, BowlSK:

<div id="header">
  <div id="userbar">
    Hi there, <span class="username">Chris Marasti-Georg</span> |
    <a href="/edit-profile.html">Profile</a> |
    <a href="https://www.bowlsk.com/_ah/logout?...">Sign out</a>
  </div>
  <h1><a href="/">Bowl<span class="sk">SK</span></a></h1>
</div>

Хорошо, что происходит?

At the top of my page, I have a logical section, the "header". Since this is a section, I use a div (with an appropriate id). Within that, I have a couple of sections: the user bar and the actual page title. The title uses the appropriate tag, h1. The userbar, being a section, is wrapped in a div. Within that, the username is wrapped in a span, so that I can change the style. As you can see, I have also wrapped a span around 2 letters in the title - this allows me to change their color in my stylesheet.

Также обратите внимание, что HTML5 включает в себя широкий новый набор элементов, которые определяют общие структуры страниц, такие как статья, раздел, навигация и т. Д.

В разделе 4.4 рабочего проекта HTML 5 они перечислены и даны советы по их использованию. . HTML5 все еще является рабочей спецификацией, так что еще нет ничего "окончательного", но очень сомнительно, что какой-либо из этих элементов куда-то изменится. Если вы хотите стилизовать эти элементы в какой-либо более старой версии IE, вам понадобится взлом javascript - вам нужно создать один из каждого элемента, используя document.createElement, прежде чем любой из этих элементов будет указан в вашем источнике. Есть несколько библиотек, которые позаботятся об этом за вас - быстрый поиск в Google показал html5shiv .

person Chris Marasti-Georg    schedule 08.10.2008
comment
Крис, в вашем тексте ошибка: даже если вы установите стиль диапазона на «блок», по-прежнему незаконно оборачивать его вокруг элемента уровня блока! - person Konrad Rudolph; 08.10.2008
comment
Вы не можете использовать div и span семантически, поскольку они не имеют никакого значения. div - это бессмысленные общие элементы уровня блока, а span - бессмысленный универсальный встроенный элемент. - person apnerve; 17.10.2011
comment
@apnerve У них все еще есть семантика в этом блоке, а встроенные элементы означают разные вещи для потока документов, как с точки зрения синтаксического анализа, так и с точки зрения чтения этого источника, чтобы выяснить, что происходит в перспективе. - person Chris Marasti-Georg; 17.10.2011
comment
@ ChrisMarasti-Georg: Нет. Это не семантика. Разметка что-то значит, когда мы можем ее идентифицировать и делать с ней полезные вещи. Какую разницу вы видите, когда сталкиваетесь с <div>hello</div> и <span>hello</span>. Он одинаково хорош как для людей, так и для компьютеров. - person apnerve; 17.10.2011
comment
У вас был я в div, это блочный элемент, span - встроенный. :) - person Matical; 12.06.2013
comment
Есть ли хорошая книга, объясняющая, как правильно использовать элементы html в разных ситуациях. - person mko; 05.10.2015
comment
действителен ли этот ответ даже после HTML5, поскольку он позволяет записывать некоторые из block elements внутри inline элементов. как <h1> допускается внутри тега <a> - person Deepak Yadav; 04.04.2017
comment
Ваше изменение, что «div внутри диапазона теперь допустимо», кажется неправильным. Это конкретное вложение все еще недопустимо в HTML5. Я бы сказал, что HTML5 больше не использует термины «блочные и встроенные элементы». Теперь они классифицируются по их логической роли, а не по внешнему виду. - person Ilya Streltsyn; 19.07.2018
comment
что в данном контексте означает незаконное? @KonradRudolph - person Honey; 14.08.2018
comment
@Honey В нарушение правил, изложенных в спецификации, недействителен. Это означает, что нет никакой гарантии, что клиенты обработают его правильно. - person Konrad Rudolph; 14.08.2018
comment
Вы абсолютно можете использовать div и span семантически, если вы предоставите атрибут role с одной из стандартных неабстрактных ролей aria в качестве значения. Обычно предпочтительно использовать правильный семантический элемент HTML, но есть некоторые роли, которые (пока) не имеют соответствующего элемента HTML, например toolbar. Есть также некоторая семантика HTML, не имеющая соответствующих ролей (например, <dl>). Многие семантические элементы, появившиеся в HTML5, начали свою жизнь как атрибуты ролей, так что вы можете утверждать, что использование чего-то вроде <div role="toolbar"> семантически опережает игру. - person brennanyoung; 18.10.2019
comment
Для тех, кому интересно узнать о ролях ARIA, обсуждаемых в Комментарий автор: brennayoung, см. спецификацию W3C: Доступные полнофункциональные интернет-приложения (WAI-ARIA) 1.0, раздел 5. Модель для подражания. - person Basil Bourque; 26.10.2019
comment
Могу ли я быть арестован за использование <span><div></div></span>? - person Phani Rithvij; 29.05.2020
comment
@PhaniRithvij Большинство браузеров выдают предупреждение. - person Chris Marasti-Georg; 29.05.2020
comment
@ ChrisMarasti-Georg Браузеры просто не будут отображать его так, как вы хотите, и он не сможет пройти проверку w3c. - person Justin Liu; 07.06.2020
comment
@ ChrisMarasti-Georg Вот пример . - person Justin Liu; 07.06.2020

Для полноты картины предлагаю вам подумать об этом так:

  • В HTML определено множество блочных элементов (разрывы строк до и после), а также множество встроенных тегов (без разрывов строк).
  • Но в современном HTML все элементы должны иметь значения: <p> - это абзац, <li> - это элемент списка и т. Д., И мы должны использовать правильный тег для правильной цели - - не так, как раньше, когда мы использовали <blockquote> отступ независимо от того, было ли содержание цитатой или нет.
  • Итак, что вы делаете, когда не смысла в том, что вы пытаетесь сделать? В столбце шириной 400 пикселей нет значения, не так ли? Вам просто нужно, чтобы ваш столбец текста был шириной 400 пикселей, потому что это соответствует вашему дизайну.
  • По этой причине они добавили в HTML еще два элемента: общие или бессмысленные элементы <div> и <span>, потому что в противном случае люди вернулись бы к злоупотреблению элементами, которые действительно имеют значение.
person AmbroseChapel    schedule 09.10.2008
comment
Это правильное объяснение. Интересно, почему это не было принято в качестве ответа. - person apnerve; 17.10.2011
comment
потому что это слишком далеко на странице - person King Friday; 02.04.2012
comment
То, что хороший ответ не был принят, не означает, что вы не можете проголосовать за него. +1 за полезное разъяснение. - person CyberFonic; 24.12.2012
comment
Приятно знать, но он не отвечает на исходный вопрос, поскольку не объясняет различия между элементами div и span. - person tehvan; 30.08.2017

Здесь уже есть хорошие подробные ответы, но нет наглядных примеров, поэтому вот небольшая иллюстрация:

разница между div и span

<div>This is a div.</div>
<div>This is a div.</div>
<div>This is a div.</div>
<span>This is a span.</span>
<span>This is a span.</span>
<span>This is a span.</span>

<div> - это тег блока, а <span> - встроенный тег.

person Brian    schedule 07.10.2013
comment
Они по-разному влияют на макет, даже без CSS! Я впервые это вижу! - person GreenAsJade; 10.12.2014
comment
Спасибо, я поддерживаю этот ответ, потому что он очень быстро отвечает, что у div есть следующая строка - person Script Kitty; 04.06.2016
comment
спасибо, что объяснили новичкам вроде меня наглядно :-) - person Aritra Chatterjee; 17.09.2017

<div> - это элемент уровня блока, а <span> - встроенный элемент.

Если вы хотите сделать что-то со встроенным текстом, <span> - это то, что вам нужно, поскольку он не вводит разрывы строк, как <div>.


Как отмечали другие, есть некоторая семантика, подразумеваемая каждым из них, наиболее важным является тот факт, что <div> подразумевает логическое разделение в документе, подобное, может быть, разделу документа или чему-то еще, а-ля:

<div id="Chapter1">
   <p>Lorem ipsum dolor sit amet, <span id="SomeSpecialText1">consectetuer adipiscing</span> elit. Duis congue vehicula purus.</p>
   <p>Nam <span id="SomeSpecialText2">eget magna nec</span> sapien fringilla euismod. Donec hendrerit.</p> 
</div>
person Jason Bunting    schedule 08.10.2008
comment
div можно сделать встроенными (display: inline;) и наоборот для диапазона, но это лучшее объяснение. Это теги-оболочки, span обычно используется для предложений или выделения текста, div для разделов. - person Ross; 08.10.2008
comment
Я знаю, что вы можете изменить это с помощью CSS, но это вводит другую технологию. HTML может существовать сам по себе, и когда это происходит, div не является встроенным и не предназначен для этого в чистом виде. - person Jason Bunting; 08.10.2008
comment
Есть ли хорошая книга, объясняющая, как правильно использовать элементы html в разных ситуациях. - person mko; 05.10.2015
comment
@mko - не знаю, если честно. Опыт лучший учитель. В конце концов, нет правильного ответа, есть просто то, что работает для вашей ситуации и ваших целей. ;) - person Jason Bunting; 10.11.2015

Настоящая важная разница уже упоминается в ответе Криса. Однако последствия будут очевидны не для всех.

В качестве встроенного элемента <span> может содержать только другие встроенные элементы. Следовательно, следующий код неверен:

<span><p>This is a paragraph</p></span>

Приведенный выше код недействителен. Чтобы обернуть элементы уровня блока, необходимо использовать другой элемент уровня блока (например, <div>). С другой стороны, <div> можно использовать только в тех местах, где разрешены элементы уровня блока.

Более того, эти правила зафиксированы в (X) HTML, и они не изменяются присутствием правил CSS! Значит, следующие коды тоже неверны!

<span style="display: block"><p>Still wrong</p></span>
<span><p style="display: inline">Just as wrong</p></span>
person Konrad Rudolph    schedule 08.10.2008
comment
@Faizan Как это имеет отношение? Это также неправильно: не каждый браузер дает одинаковые результаты для этой разметки. В зависимости от используемого вами типа документа (и, опять же, браузера) это может даже не работать, а скорее приведет к ошибке проверки. - person Konrad Rudolph; 05.03.2013
comment
Я вижу, что некоторые браузеры достаточно эффективны, чтобы запускать недействительный код. вот почему он побежал. Можете ли вы порекомендовать мне хороший валидатор для HTML? - person Faizan; 06.03.2013
comment
Будьте консервативны в том, что вы делаете, и либерально в том, что вы принимаете en.wikipedia.org/wiki/Robustness_principle - person jldupont; 28.03.2013
comment
Добро пожаловать в столовую. Браузеры, потребляющие недействительный HTML, являются той самой причиной, по которой сильно оптимизированные, но придирчивые парсеры HTML не являются нормой. Каждый заслуживающий внимания браузер (то есть совместимый с «HTML») использует некоторую внутреннюю библиотеку типа «суп», чтобы сделать его приемлемым. - person ack; 09.12.2013

Значение «блочного элемента» подразумевается, но никогда не указывается явно. Если игнорировать всю теорию (теория - это хорошо), то следующее сравнение будет прагматичным. Следующий:

<p>This paragraph <span>has</span> a span.</p>
<p>This paragraph <div>has</div> a div.</p>

производит:

This paragraph has a span.

This paragraph

has
a div.

Это показывает, что не только следует не использовать div в строке, это просто не приведет к желаемому эффекту.

person user34660    schedule 08.03.2016

Как упоминалось в других ответах, по умолчанию div будет отображаться как элемент блока, а span будет отображаться встроенным в его контексте. Но ни то, ни другое не имеет смысловой ценности; они существуют, чтобы позволить вам применить стиль и идентичность к любому заданному фрагменту контента. Используя стили, вы можете заставить div действовать как span и наоборот.

Один из полезных стилей для div - inline-block

Примеры:

  1. http://dustwell.com/div-span-inline-block.html

  2. Отображение CSS: встроенный или встроенный блок

Я использовал inline-block с большим успехом в игровых веб-проектах.

person Eric R. Rath    schedule 08.10.2008
comment
Если бы они не имели смысловой ценности, был бы только один из них. Один предназначен для разделения уровня блока, другой - встроенного диапазона. - person Chris Marasti-Georg; 08.10.2008

Div - это блочный элемент, а span - это встроенный элемент, и его ширина зависит от его содержимого, где div не

person Jagannath Samanta    schedule 18.05.2013

Я бы сказал, что если вы немного знаете испанский, посмотрите эту страницу, где правильно объяснено.

Тем не менее, быстрое определение будет заключаться в том, что div предназначен для разделения секций, а span - для применения какого-либо стиля к элементу в другом элементе блока, таком как div.

person Pablo Herrero    schedule 08.10.2008
comment
Не нужно знать испанский, английская версия - ‹span› - HTML | MDN. - person user34660; 08.03.2016

Просто хотел добавить исторический контекст к тому, как возникло span против div

История span:

3 июля 1995 г. Бенджамин С. В. Ситтлер предлагает общий тег текстового контейнера для применения стилей к определенным блокам текста. Рендеринг является нейтральным, за исключением случаев, когда он используется вместе со таблицей стилей. Есть споры о читабельности, значении. Берт Бос упоминает о расширяемости элемента через атрибут класса (с такими значениями, как город, человек, дата и т. Д.). Пол Прескод обеспокоен злоупотреблением обоими элементами. Он выступает против текста, в котором упоминается, что «любой новый элемент должен быть на старом», и добавляется: «Если мы создадим тег без семантики, его можно будет использовать где угодно, не ошибаясь. Мы должны заставить авторов правильно помечать теги. семантика их документа. Мы должны заставить поставщиков редакторов сделать этот выбор явным в своих интерфейсах ".

- Источник (w3 wiki)

Из черновика RFC, который вводит span:

Во-первых, общий контейнер необходим для переноса атрибутов LANG и BIDI в случаях, когда никакой другой элемент не подходит; Для этой цели введен элемент SPAN.

- Источник (проект IETF)

История div:

Элементы DIV можно использовать для структурирования HTML-документов в виде иерархии разделов.

...

CENTER был представлен Netscape до того, как они добавили поддержку элемента HTML 3.0 DIV. Он сохранен в HTML 3.2 из-за его широкого распространения.

HTML 3.2 Spec

Короче говоря, оба элемента возникли из-за потребности в более семантически универсальном контейнере. Span был предложен как более общая замена элемента <text> для стилизации текста. Div был предложен как общий способ разделения страниц и имел дополнительное преимущество в виде замены тега <center> для выравнивания содержимого по центру. Div всегда был блочным элементом из-за его истории как разделителя страниц. Span всегда был встроенным элементом, потому что его первоначальная цель заключалась в стилизации текста, а сегодня div и span стали универсальными элементами со свойствами блока по умолчанию и встроенного отображения соответственно.

person Alex W    schedule 15.05.2018

В HTML есть теги, которые добавляют к содержимому структуру или семантику. Например, тег <p> используется для идентификации абзаца. Другой пример - тег <ol> для упорядоченного списка.

Когда в HTML нет подходящего тега, как показано выше, обычно используются теги <div> и <span>.

Тег <div> используется для идентификации раздела / раздела документа на уровне блока, у которого есть разрыв строки как до, так и после него.

Примерами использования тегов div являются заголовки, нижние колонтитулы, элементы навигации и т. Д. Однако в HTML 5 эти теги уже предусмотрены.

Тег <span> используется для обозначения встроенного раздела / раздела документа.

Например, тег span можно использовать для добавления встроенных пиктограмм к элементу.

person Robert Rocha    schedule 27.02.2016

Помните, что в основном и они сами не выполняют никаких функций. Их функциональность не определяется только своими тегами.

Их можно настроить только с помощью CSS.

Теперь, что касается вашего вопроса:

Тег SPAN вместе с некоторыми стилями будет полезен при удерживании внутри строки, например, в абзаце в html. Это своего рода уровень строки или уровень оператора в HTML.

Пример:

<p>Am writing<span class="time">this answer</span> in my free time of my day.</p>

Функциональность тега DIV, как уже говорилось, может быть видна только при наличии стиля, может содержать большие фрагменты HTML-кода.

DIV - уровень блока

Пример:

    <div class="large-time">
    <p>Am writing <span class="time"> this answer</span> in my free time of my day. 
    </p>
    </div>

У обоих есть свое время и случай, когда их следует использовать, в зависимости от ваших требований.

Надеюсь, ответ ясен. Спасибо.

person yatheendra k v    schedule 03.12.2018

Все просто и понятно.

  • использование span не влияет на макет, потому что он встроенный (in line (не следует путать, потому что вещи могут быть упакованы))
  • использование div влияет на макет, содержимое внутри отображается в новой строке (block element), когда элемент, который вы хотите добавить, не имеет особого семантического значения, и вы хотите, чтобы он отображался в новой строке, используйте <div>.
person Vivek Mahajan    schedule 18.06.2020