Есть ли способ создать свой собственный тег html в HTML5?

114

Я хочу создать что-то вроде

<menu>
    <lunch>
        <dish>aaa</dish>
        <dish>bbb</dish>
    </lunch>
    <dinner>
        <dish>ccc</dish>
    </dinner>
</menu>

Можно ли это сделать в HTML5? Я знаю, что могу сделать это с

<ul id="menu">
    <li>
        <ul id="lunch">
            <li class="dish">aaa</li>
            <li class="dish">bbb</li>
        </ul>
    </li>
    <li>
        <ul id="dinner">
            <li class="dish">ccc</li>
        </ul>
    </li>    
</ul>

но это намного менее читабельно :(

Раанан Авидор
источник
2
Что ты пытаешься сделать? то, что вам нужно, вероятно, можно решить с помощью divs с
именами классов
11
Вы также можете посмотреть XML + XSLT, чтобы узнать, подходит ли это вам больше. Это позволяет вам преобразовывать (часть xslt) один XML-документ (ваш) в другой (html)
Майкл Харен
1
Ничего себе, я опубликовал это давно :) Учитывая, насколько хорошо getElementById () работает по сравнению с захватом по имени тега, и как такие вещи, как SVG, предоставляют совершенно новый набор функций вместе с их семантикой, я думаю, что пользовательские теги имеют меньше применения, чем я возможно изначально подумал. Спасибо всем за содержательные комментарии и ответы!
Коста

Ответы:

155

Вы можете использовать пользовательские теги в браузерах, хотя они не будут HTML5 (см. Допустимые ли пользовательские элементы HTML5? И спецификацию HTML5 ).

Предположим, вы хотите использовать настраиваемый элемент тега с именем <stack>. Вот что вам следует делать ...

ШАГ 1

Нормализовать его атрибуты в таблице стилей CSS (подумайте об сбросе css) - Пример:

 stack{display:block;margin:0;padding:0;border:0; ... }

ШАГ 2

Чтобы заставить его работать в старых версиях Internet Explorer, вам нужно добавить этот скрипт в заголовок (важно, если он вам нужен для работы в более старых версиях IE!):

 <!--[if lt IE 9]> 
 <script> document.createElement("stack"); </script>
 <![endif]-->

Затем вы можете свободно использовать свой собственный тег.

<stack>Overflow</stack>

Не стесняйтесь также устанавливать атрибуты ...

<stack id="st2" class="nice"> hello </stack>
Тимоти Перес
источник
21
Совершенно верно. Не самая лучшая идея. Но совершенно правильно. Вы можете создать целую армию своих собственных тегов на своей странице и сделать их все обратно совместимыми с IE6, просто добавив массив всех имен тегов, которые вы хотите использовать, а затем создав каждый из них внутри цикла for , в заголовке страницы, прежде чем вы начнете использовать любой из них. Так в первую очередь работает html5shim. Просто будьте готовы приложить усилия, чтобы стилизовать их в старом IE. Кроме того, хотя я бы сказал, что это нормально для внутреннего использования, я бы не хотел учить людей этому делу. Вообще.
Norguard
13
Согласен, написание собственных тегов не для слабонервных. Убедитесь, что вы тщательно его протестировали. Однако я хотел бы сказать одну вещь ... не пишите CSS для IE6. Полная трата ресурсов и позволяет в дальнейшем использовать такой ужасный продукт, который даже не поддерживает Microsoft.
Тимоти Перес
2
@alexwells - Chrome, FF, Safari, IE 7-9
Тимоти Перес,
5
Очень важное замечание: хотя браузеры поддерживают создание настраиваемых элементов, они официально не поддерживаются стандартом HTML5. Технически кастомные элементы запрещены. Вы можете это сделать и сделать так, чтобы ваш HTML выглядел красиво и семантически важным, но если вы это сделаете, вы нарушите стандарт - если вам не все равно. :)
Randolpho
11
Иногда ... необходимо установить новые стандарты. ;-)
Тимоти Перес
26

Я не уверен в этих ответах. Как я только что прочитал: «ПОЛЬЗОВАТЕЛЬСКИЕ ТЭГИ ВСЕГДА ДОПУСКАЮТСЯ В HTML».

http://www.crockford.com/html/

Дело в том, что HTML был основан на SGML. В отличие от XML с его типами документов и схемами, HTML не становится недействительным, если браузер не знает один или два тега. Подумайте о <marquee>. Этого не было в официальном стандарте. Таким образом, хотя его использование сделало вашу HTML-страницу «официально неутвержденной», она также не сломала страницу.

Затем есть <keygen>, который был специфичным для Netscape, забыт в HTML4, переоткрыт и теперь указан в HTML5. А также у нас теперь есть настраиваемые атрибуты тегов, например data-XyZzz = "...", разрешенные для всех тегов HTML5.

Итак, хотя вам не следует изобретать целый набор собственных нестандартных неуказанных разметок, иметь собственные теги в HTML не запрещено. Однако это так, если вы не хотите отправлять его с + xml Content-Type или встраивать другие пространства имен XML, такие как SVG или MathML. Это применимо только к HTML, ограниченному SGML.

марио
источник
2
Также интересно здесь: librador.com/2009/10/20/Styling-undefined-tag-names-in-HTML «Вы можете использовать любое имя тега в HTML, и оно будет частью DOM и может быть стилизовано».
Марио
5
«Таким образом, при его использовании ваша html-страница стала« официальной неутвержденной », но и сама страница не была повреждена». - ммм, попробуйте стилизовать ваши придуманные элементы в Internet Explorer. Это не сработает. Вы можете не считать это сломанным, но тот факт, что пользовательские теги недействительны и не работают в Internet Explorer, я не понимаю, как вы можете утверждать, что они «разрешены».
Пол Д. Уэйт,
6
То есть, он ничем не подкрепляет свое заявление. То, что это сказал Дуглас Крокфорд, не означает, что это правда.
Пол Д. Уэйт,
8
Вот что говорится в спецификации : «Эта спецификация не определяет, как соответствующие пользовательские агенты обрабатывают ... элементы ... не указанные в этом документе. [...] мы рекомендуем следующее поведение: если пользовательский агент встречает элемент, он не распознает, он должен попытаться отобразить содержимое элемента. [...] авторы и пользователи не должны полагаться на конкретное поведение при исправлении ошибок »- ИМХО, это означает, что Crockfor ошибается, хотя бы раз.
user123444555621 03
4
@Costa: HTML полезен, потому что это набор согласованных значений тегов. Например, браузеры делают ссылки интерактивными, потому что мы согласились (через спецификацию HTML ), что <a>тег является ссылкой на другую страницу. Вы можете создать свой собственный салат из разметки, но он не будет иметь значения ни для кого, кроме вас самих. Для данной цели это может быть хорошо, но вы больше не используете HTML.
Пол Д. Уэйт
6

Как сказал Майкл в комментариях, то, что вы хотите сделать, вполне возможно, но ваша номенклатура неверна. Вы не «добавляете теги в HTML 5», вы создаете новый тип XML-документа со своими собственными тегами.

Я делал это для некоторых проектов на моей последней работе. Несколько практических советов:

  1. Когда вы говорите, что хотите «добавить их в HTML 5», я предполагаю, что на самом деле вы имеете в виду, что вы хотите, чтобы страницы отображались правильно в современном браузере, без необходимости выполнять большую работу на стороне сервера. Этого можно добиться, вставив «инструкцию обработки таблицы стилей» в верхнюю часть файла xml, например <? Xml-stylesheet type = "text / xsl" href = "menu.xsl"?>. Замените «menu.xsl» на путь к таблице стилей XSL, которую вы создаете для преобразования ваших пользовательских тегов в HTML.

  2. Предостережения: ваш файл должен быть правильно сформированным XML-документом с заголовком XML <xml version = "1.0">. XML более разборчив, чем HTML, в таких вещах, как несовпадающие теги. Кроме того, в отличие от HTML, теги чувствительны к регистру. Вы также должны убедиться, что веб-сервер отправляет файлы с соответствующим типом MIME «application / xml». Часто веб-сервер настраивается на это автоматически, если расширение файла - «.xml», но проверьте.

  3. Большое предостережение: наконец, использование автоматического XSL-преобразования браузеров, как я описал, действительно лучше всего только для отладки и для ограниченных приложений, где у вас есть большой контроль. Я успешно использовал его при создании простой интранет-сети у моего последнего работодателя, к которой имели доступ максимум несколько десятков человек. Не все браузеры поддерживают XSL, а те, которые не имеют полностью совместимых реализаций. Поэтому, если ваши страницы должны быть выпущены в «дикую природу», лучше всего преобразовать их все в HTML на стороне сервера, что можно сделать с помощью инструмента командной строки или кнопки во многих редакторах XML.

Дэн Менес
источник
5

Создание собственных имен тегов в HTML невозможно / недопустимо. Вот для чего нужны XML, SGML и другие общие языки разметки.

Вы, вероятно, хотите

<div id="menu">
    <div id="lunch">
        <span class="dish">aaa</span>
        <span class="dish">bbb</span>
    </div>
    <div id="dinner">
        <span class="dish">ccc</span>
    </div>
</div>

Или вместо <div/>а <span/>что-то вроде <ul/>и <li/>.

Чтобы он выглядел и функционировал правильно, просто подключите немного CSS и Javascript.

LukeN
источник
5
Нет, это не так. SGML был создан для этого задолго до появления XML.
Квентин
1
Кто-нибудь сегодня использует простой SGML? Либо люди используют HTML, либо XML и многие его потомки, но я никогда не видел SGML вживую! В любом случае, я обновлю свой ответ.
LukeN
Бьюсь об заклад, есть еще люди, использующие Docbook SGML для документации. Конечно, всего несколько лет назад их было много.
Кен
5

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


Например, вы хотите использовать тег <icon>, потому что вам не нравится <img>, и вам не нравится <i>ни то, ни другое ...

Что ж, имейте в виду, что вы не единственный. Возможно, в будущем w3c и / или браузеры будут указывать / реализовывать этот тег.

В настоящее время браузеры, вероятно, будут реализовывать собственный стиль для этого тега, и дизайн вашего веб-сайта может нарушиться.

Поэтому я предлагаю использовать (в соответствии с этим примером) <img-icon>.


Фактически, тег <menu>определен четко, т.е. не используется, а определен. Он должен содержать <menuitem>какие-то файлы <li>.

лазурит
источник
4

Пользовательские теги можно использовать в Safari, Chrome, Opera и Firefox, по крайней мере, если они используются вместо "class = ...".

зеленый {color: green} в css работает для

<green>This is some text.</green>
Чес
источник
Вы правы @chas, но этот метод не рекомендуется, и он попадет в категорию «Уловки и хитрости» ...
Пиюш Кумар Балиян
2

Для встраивания метаданных вы можете попробовать использовать микроданные HTML , но они даже более подробны, чем использование имен классов.

<div itemscope>
    <p>My name is <span itemprop="name">Elizabeth</span>.</p>
</div>

<div itemscope>
    <p>My name is <span itemprop="name">Daniel</span>.</p>
</div>
Ионуй Г. Стан
источник
2

Помимо написания таблицы стилей XSL, как я описал ранее, существует другой подход, по крайней мере, если вы уверены, что будет использоваться Firefox или другой полноценный браузер XML (т.е. НЕ Internet Explorer). Пропустите преобразование XSL и напишите полную таблицу стилей CSS, которая сообщает браузеру, как напрямую форматировать XML. Плюс в том, что вам не придется изучать XSL, который многие люди считают сложным и нелогичным языком. Обратной стороной является то, что ваш CSS должен будет очень полно определять стиль, включая то, что такое блочные узлы, что является встроенным и т. Д. Обычно при написании CSS вы можете предположить, что браузер "знает" этот <em>, например, является встроенным узлом, но он не знает, что делать с <dish>.

Наконец, прошло несколько лет с тех пор, как я пробовал это, но я помню, что IE (по крайней мере, несколько версий назад) отказался применять таблицы стилей CSS непосредственно к XML-документам.

Дэн Менес
источник
Да, я думаю, что IE переходит в специальный режим рендеринга XML и в значительной степени показывает вам усовершенствованную, сворачиваемую версию документа XML.
Пол Д. Уэйт,
2

Суть HTML заключается в том, что теги, включенные в язык, имеют согласованное значение, что каждый в мире может использовать и принимать решения - например, стиль по умолчанию, или создание интерактивных ссылок, или отправка формы, когда вы нажимаете на <input type="submit">.

Выдуманные теги, подобные вашей, отлично подходят для людей (потому что мы можем изучать английский и, таким образом, знать или, по крайней мере, догадываться, что означают ваши теги), но не так хороши для машин.

Пол Д. Уэйт
источник
1

Это не вариант ни в одной спецификации HTML :)

Вы, вероятно, можете делать то, что хотите, с <div>элементами и классами, из вопроса, я не уверен, что именно вам нужно, но нет, создание собственных тегов не вариант.

Ник Крейвер
источник
4
Теперь это вариант: dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/…
Starx
1

Как сказал Ник, пользовательские теги не поддерживаются ни одной версией HTML.

Но, если вы используете такую ​​разметку в своем HTML, это не приведет к ошибке.

Похоже, вы хотите создать список. Вы можете использовать неупорядоченный список <ul>для создания элементов rool и использовать <li>тег для элементов внизу.

Если это не то, чего вы хотите достичь, укажите, что именно вы хотите. Тогда мы сможем дать ответ.

Киртан
источник
2
Это не приведет к ошибке в браузере, но IE странным образом обрабатывает CSS для неизвестных тегов.
ceejayoz
Хммм, теперь я этого не знала! Я знал, что неизвестные имена CSS обрабатываются странно (это ошибка). Но вы уверены, что он тоже странно обрабатывает неизвестные теги? Разве он не отображает их просто без текста в <>тегах?
Киртан
1
вы не можете применить CSS к неизвестным элементам в Internet Explorer. Попробуйте стилизовать <abbr>элемент в IE 7. Это не сработает, потому что IE 7 не реализован <abbr>(хотя он входит в стандарт!). Я тихонько хихикаю, когда люди слепо говорят, что нестандартный код не вызовет никаких ошибок. Как, черт возьми, вы знаете, что это не вызовет никаких ошибок? Достаточно сложно заставить работать стандартный код, не говоря уже о нестандартном коде.
Пол Д. Уэйт,
1
Пол, ищите решение в html5shim. Вы не получите преимущества настраиваемой функциональности, но если вы ищете контейнер, все, что вам нужно сделать, это добавить document.createElement ("MyNewTagName"); в голову (или, по крайней мере, выше, где вы хотите разместить стилизованную версию этого тега). Даже создайте их массив и перебирайте, создавая их в JS - никакого DOM-присоединения не требуется, просто создайте его и забросьте. Просто будьте готовы стилизовать их так, как если бы они были блочными и на 100% неизвестными.
Norguard
1

Вы можете добавить настраиваемый атрибут через данные HTML 5 - Атрибуты. Например: Сообщение, которое действительно для HTML 5. См. Http://ejohn.org/blog/html-5-data-attributes/ для получения подробной информации.

Алекс Ян
источник
1

Полимерные или X-теги позволяют создавать свои собственные HTML-теги. Он основан на «теневой модели DOM» собственного браузера.

винилл
источник
1

Вы можете просто настроить стили css, это создаст тег, который сделает цвет фона красным:

redback {background-color:red;}
 

<redback>This is red</redback>

TorKitten
источник
1

В некоторых случаях может показаться, что создание собственных имен тегов просто отлично.
Однако это всего лишь процедуры обработки ошибок вашего браузера. И проблема в том, что разные браузеры имеют разные процедуры обработки ошибок!

См. Этот пример.
Первая строка содержит два выдуманных элемента, whatи ever, и они по-разному обрабатываются разными браузерами. Текст отображается красным в IE11 и Edge, но черным в других браузерах.
Для сравнения, вторая строка похожа, за исключением того, что она содержит только допустимые элементы HTML, и поэтому она будет выглядеть одинаково во всех браузерах.

body {color:black; background:white;} /* reset */

what, ever:nth-of-type(2) {color:red}
code, span:nth-of-type(2) {color:red}
<p><what></what> <ever>test</ever></p>

<p><code></code> <span>test</span></p>

Еще одна проблема с вымышленными элементами заключается в том, что вы не знаете, что ждет вас в будущем. Если вы создали сайт пару лет назад с именами тегов , как picture, dialog, details, slot, и templateт.д., ожидая , что они ведут себя как пролеты, ты в беде сейчас

Г-н Листер
источник
1

вы можете использовать это:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>MyExample</title>
  <style>
    bloodred {color: red;}
  </style>
</head>
<body>
  <bloodred>
    this is BLOODRED (not to scare you)
  </bloodred>
</body>
<script>
  var btn = document.createElement("BLOODRED")
</script>
</html>
Лоуренс Тюркотт
источник
0

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

Пользовательские элементы: определение новых элементов в HTML

код-суши
источник
-1

<head>
  <lunch>
    <style type="text/css">
      lunch{
        color:blue;
        font-size:32px;
        }
      </style>
    </lunch>
  </head>

<body>
  <lunch>
    This is how you create custom tags like what he is asking for its very simple just do what i wrote it works yeah no js or convoluted work arounds needed this lets you do exactly what he wrote.
    </lunch>
  </body>

Rezoundr
источник
Блестяще. Есть идеи, почему это не было одобрено или принято?
rnso 07