Использование пользовательских HTML-тегов

#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. Однако они еще не полностью поддерживаются.

Комментарии:

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