#html #css #semantic-markup
#HTML #css #семантическая разметка
Вопрос:
В моем HTML мне было любопытно, семантически правильно ли использовать уникальные идентификаторы, такие как <toys>
вместо <h1>
. Например:
Я хотел иметь:
<toys class="grid_4 push_2">amp;nbsp;</toys>
С помощью CSS:
toys {
background: url("toys.png") no-repeat scroll 0 0 transparent;
width: 181px;
height: 93px;
margin-top: -8px;
}
В настоящее время у меня есть:
<h1 class="grid_4 push_2">amp;nbsp;</h1>
С помощью CSS:
h1.push_2 {
background: url("toys.png") no-repeat scroll 0 0 transparent;
width: 181px;
height: 93px;
margin-top: -8px;
}
Является ли использование уникальных идентификаторов типа <toys>
семантически правильным?
Комментарии:
1. если оставить в стороне большие вопросы об обслуживании, если он правильно отображается для вашей целевой аудитории, это действительный и семантически корректный html.
2. При компонентном подходе, да, это так (возьмем, к примеру, компоненты React и AngularJS). Однако я бы не рекомендовал его для общего использования (т. Е. Просто выбрасывать новые теги на ветер без концепции для его поддержки)
3. ваш пользовательский тег (элемент) не должен называть «toys», а <the-toys> чтобы избежать столкновения с будущим стандартом именования, имя вашего пользовательского элемента должно содержать дефис ( w3.org/TR/custom-elements/#custom-element-conformance );
Ответ №1:
Большинство этих ответов являются хорошими общими советами, но не правильными ответами на вопрос, который, я думаю, совершенно законен.
HTML5 уже является движущейся целью; браузеры внедряют спецификации и внедряют инновации разными темпами. Не существует единой вещи, называемой «допустимый HTML», по крайней мере, такой, которую стоит использовать. Если вы создаете общедоступную страницу для каждого пользователя и бота / сканера на планете, то вам уже нужно либо А) определить клиента и соответствующим образом настроить для сложных / продвинутых страниц, либо Б) сделать это действительно простым и понятный. С другой стороны, если вы размещаете его в локальной сети или скрываете за стеной входа в систему, или разрабатываете на самом переднем крае и планируете частые обновления в любом случае, тогда вы можете свободно вносить некоторые новшества по своему усмотрению. Разработчики браузеров и разработчики спецификаций учитывают их потребности, вы можете сделать то же самое.
Итак, если вам нужен пользовательский тег, выбирайте тщательно (здесь я укажу, что вероятность того, что он когда-либо станет частью официальной спецификации реализации браузера, совершенно ничтожна), затем дерзайте. Однако, чтобы заставить ваш CSS работать в IE, вам придется поступить так, как это делает html5shim, и вызвать document.createElement(‘toys’) в вашем javascript.
Я должен также добавить, что пользовательские элементы получают свои собственные стандарты и поддержку, но в настоящее время консенсус заключается в том, что все они должны иметь ‘-‘ в названии. Поэтому я бы порекомендовал что-то вроде ‘x-toys’ или ‘my-toys’ вместо просто ‘игрушки’. Лично я не в восторге от соглашения, но я понимаю причины.
Комментарии:
1. Отличный ответ, особенно немного о вызове createElement() для браузеров Internet Explorer.
2. Цитата: «Теги содержат название тега, указывающее имя элемента. Все HTML-элементы имеют имена, в которых используются только символы в диапазоне от U 0030 НУЛЕВОЙ ЦИФРЫ (0) до U 0039 ДЕВЯТОЙ ЦИФРЫ (9), от U 0061 ЛАТИНСКОЙ СТРОЧНОЙ БУКВЫ A до U 007A ЛАТИНСКОЙ СТРОЧНОЙ БУКВЫ Z и от U 0041 ЛАТИНСКОЙ ЗАГЛАВНОЙ БУКВЫ A до U 005A ЛАТИНСКОЙ ЗАГЛАВНОЙ БУКВЫ Z. В синтаксисе HTML имена тегов, даже для иностранных элементов, могут быть написаны любым сочетанием строчных и прописных букв, которые при преобразовании во все строчные буквы соответствуют имени тега элемента; имена тегов не чувствительны к регистру. » w3.org/TR/2011/WD-html5-20110525/syntax.html#elements-0
3. Похоже, что знак минус официально не разрешен. Однако это может сработать в некоторых браузерах.
4. Просто
toys-
прекрасно, поскольку сами W3C используют<c->
для выделения кода.
Ответ №2:
Лучше избегать использования пользовательских тегов, поскольку вы никогда не знаете, когда эти теги могут стать стандартизированными и иметь специальное применение в будущем.
Лучшее, что можно сделать для вашего примера, если вы хотите избежать использования тегов заголовка, это следующее:
<div class="toys grid_4 push_2">amp;nbsp</div>
.toys {
background: url("toys.png") no-repeat scroll 0 0 transparent;
width: 181px;
height: 93px;
margin-top: -8px;
}
В дополнение:
Если вы не используете стандартные html-теги при проектировании страниц, они не будут отображаться каким-либо организованным образом, когда стили отключены. В дальнейшем это не проблема, но если по какой-либо причине вам понадобилось просмотреть список «игрушек» без стилей, вам не повезло, если вы не используете теги <ul>
или <ol>
с <li>
.
Обновить:
Как указал Флимзи в комментариях, пользовательские HTML-элементы теперь имеют свою собственную спецификацию W3C. Однако они еще не полностью поддерживаются.
- Спецификация: https://www.w3.org/TR/custom-elements /
- Поддержка: http://caniuse.com/#feat=custom-elements
Комментарии:
1. Спасибо за это. Вы разъяснили проблемы, которые могут возникнуть в результате использования пользовательских тегов html.
2. итак, я спрашиваю.. какой смысл вообще иметь теги? разве они не должны обеспечивать семантическое значение? Забавно, что XHTML расшифровывается как EXTENSIBLE HTML, и все же все всегда волновались, когда вы расширяли его, а ваша разметка не проверялась.
3. Я не знаю ни одного замечательного веб-разработчика, который считает, что XHTML лучше стандартного, правильно отформатированного HTML с закрытыми тегами. На самом деле, я уверен, что многие новые разработчики думают, что XHTML расшифровывается как XML-HTML, поскольку он более точно соответствует стандартам XML, чем предыдущие стандарты HTML. Отвечая на ваш вопрос, теги на самом деле обеспечивают семантическое значение. HTML-документ — это представление некоторых данных. Это не сами данные. Таким образом, теги обеспечивают семантическое значение способа отображения данных, которые они представляют. «div» означает разделение, «p» означает абзац, «section» означает раздел и т.д.
4. По той же логике я должен избегать использования функций и переменных в C, потому что я никогда не знаю, когда эти символы могут стать зарезервированными словами в будущем. Я сомневаюсь, что «toys» когда-либо станет стандартным тегом HTML, и если это так, мы можем надеяться, что инициативному и способному веб-мастеру будет легко
s/toys/my-toys/g
. Использование пользовательских тегов может значительно упростить и уточнить разметку.5.
It is best to avoid using custom tags, as you never know when those tags may become standardized...
это (и, следовательно, большая часть остального этого ответа) в настоящее время является устаревшим советом, поскольку пользовательские теги явно разрешены, а использование ‘-‘ в названии гарантирует, что они никогда не станут стандартизированными.
Ответ №3:
Вы, конечно, можете; однако, как правило, это не очень хорошая идея делать это. Во многих отношениях HTML5 движется к чему-то подобному, но обобщенному; наличие определенных тегов, хотя и поддерживаемых, может привести к очень разным результатам в разных браузерах.
Ответ №4:
ОБНОВИТЬ (поскольку все ответы старые):
Поскольку API веб-компонентов внедряется в каждом крупном браузере, на мой взгляд, вы не сможете избежать использования пользовательских тегов в будущем. Я думаю, веб-компоненты легко станут мейнстримом. На этом построена вся теория: пользовательские теги, пользовательские атрибуты, пользовательский JS, прикрепленный к этим элементам.
Итак, что я говорю: в наши дни неплохо использовать свои собственные теги, но вам все еще нужно подумать о создании, связанном с SEO.
Ответ №5:
Конечно, если вы определяете тег, а также определяете в своей таблице стилей, что он должен делать, это должно связать его? Даже если ваш новый тег позже станет стандартизированным, ваша таблица стилей переопределит стандарт — в конце концов, для этого и существуют таблицы стилей.
Например, мне часто нужно контролировать разрывы строк на моих страницах. Вместо того, чтобы использовать неуклюжий
<span style="white-space:nowrap">bla bla bla</span>
каждый раз я помещаю свой неповрежденный текст в свои собственные теги и определяю в своей таблице стилей:
nbr {
white-space:nowrap;
}
итак
<p> This is some text. <nbr>This is some more text.</nbr></p>
появится в одной строке, если есть место, в противном случае второе предложение появится в следующей строке. Или, если быть точным, во всех браузерах, кроме старых версий IE. Чтобы все было гладко, я добавил следующее в раздел каждой страницы [head] (в WordPress нужно добавить только в раздел темы header.php ):-
<!--[if lt IE 9]>
<script> document.createElement('nbr'); </script>
<![endif]-->
Или я что-то упускаю?
Комментарии:
1. Да, вы чего-то не понимаете. «Даже если ваш новый тег позже станет стандартизированным, ваша таблица стилей переопределит стандарт» — это очень наивно. В качестве реального примера давайте возьмем
<picture>
элемент. Если у вас есть только что-то вродеwhite-space:nowrap
в вашей таблице стилей, вы не переопределите все стили этого элемента по умолчанию, и ваш документ будет ужасно ломаться в новых браузерах, которые его поддерживают. Так что не делайте этого. Либо используйте рекомендуемый протокол именования для элементов, которые вы разрабатываете самостоятельно (например, с тире,<n-br>
), либо поместите их в пространство имен по вашему собственному выбору (<my:nbr>
).2. Я согласен, что делаю это для тега «layout», который мне нравится иметь определенные свойства.
Ответ №6:
Да, это было бы семантически правильно.
Однако это недопустимый синтаксис, поскольку HTML имеет определенный набор тегов.
Вы можете обойти это в некоторых браузерах.
Тем не менее, в чем выгода от этого? Это действительно пошло бы на пользу только тому, кто должен поддерживать исходный код.
К вашему сведению, то, что вы предлагаете, в значительной степени похоже на XML.
Ответ №7:
Я согласен с @superUntiled, вы должны хорошо использовать селекторы CSS (классы и идентификаторы). Итак, если у вас есть объект типа «toy», вам следует создать класс для этого объекта. Тогда вы могли бы выбрать все свои cars
с помощью CSS, просто используя селектор .toy
.
Что-то вроде этого:
<style>
.toy {
color: red;
}
</style>
<p class="toy">My little car</p>
Ответ №8:
Я также согласен с оригинальным постером в том, что пользовательские элементы могли бы быть лучшим способом, чем классы и идентификаторы CSS. Например, у меня есть друг, который управляет своим инвентарем и контентом для своего веб-сайта в Google Таблицах. Вывод массива Google sheets представляет собой обычный текст. (Интерфейс HTML использует JS для извлечения содержимого из GSheets). Поэтому я устанавливаю пользовательские теги, такие как <sale>
, для изменения цвета и стиля шрифта, чтобы мой друг, который не разбирается в программировании, мог просто вставить эти теги в Google sheet для настройки шрифта. Это потрясающе.
Ответ №9:
Если для вашего doctype установлено значение XHTML, все должно быть в порядке. Но обычно это недопустимо для типов документов HTML.
Комментарии:
1. XHTML — это старый стиль. Проверьте спецификации HTML5.
2. @BerggreenDK: Я понимаю это и никогда не рекомендовал его использовать.
Ответ №10:
Вы не хотите создавать свои собственные теги.
HTML-теги определены в спецификации HTML.
Вместо:
<h1 class="grid_4 push_2">amp;nbsp</h1>
Вы должны сделать что-то вроде:
<h1 class="toys">amp;nbsp</h1>
Однако вы можете создавать свои собственные теги, если это XML.
Но, пожалуйста, обратите внимание, что не все браузеры поддерживают ваш тег, и вы не сможете оформить их с помощью CSS.
То же самое происходит с новыми тегами HTML5