Czy istnieje sposób na utworzenie własnego tagu HTML5?

114

Chcę stworzyć coś takiego

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

Czy można to zrobić w HTML5? Wiem, że mogę to zrobić

<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>

ale jest o wiele mniej czytelny :(

Raanan Avidor
źródło
2
co próbujesz zrobić? to, czego szukasz, prawdopodobnie może zostać rozwiązane przez divs z
nazwami klas
11
Możesz również spojrzeć na XML + XSLT, aby sprawdzić, czy lepiej pasuje do Twoich potrzeb. To pozwala ci przekształcić (część xslt) jeden dokument XML (twój) na inny (html)
Michael Haren
1
Wow, opublikowałem to dawno temu :) Biorąc pod uwagę, jak dobrze getElementById () działa w porównaniu z przechwytywaniem według nazwy tagu i jak rzeczy takie jak SVG zapewniają zupełnie nowy zestaw funkcji wraz z ich semantyką, myślę, że niestandardowe tagi mają mniej zastosowań niż ja pierwotnie myśleli. Dziękuję wszystkim za wszystkie przemyślane komentarze i odpowiedzi!
Costa

Odpowiedzi:

155

Możesz używać niestandardowych tagów w przeglądarkach, chociaż nie będą to HTML5 (zobacz Czy elementy niestandardowe są zgodne z HTML5? I specyfikacją HTML5 ).

Załóżmy, że chcesz użyć niestandardowego elementu tagu o nazwie <stack>. Oto, co powinieneś zrobić ...

KROK 1

Normalizuj jego atrybuty w swoim arkuszu stylów CSS (pomyśl o resetowaniu css) - przykład:

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

KROK 2

Aby działał w starszych wersjach Internet Explorera, musisz dołączyć ten skrypt do głowy (ważne, jeśli potrzebujesz go do pracy w starszych wersjach IE!):

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

Następnie możesz swobodnie używać niestandardowego tagu.

<stack>Overflow</stack>

Możesz także ustawić atrybuty ...

<stack id="st2" class="nice"> hello </stack>
Timothy Perez
źródło
21
Absolutnie poprawne. Nie jest to fantastyczny pomysł. Ale absolutnie poprawne. Możesz stworzyć całą armię własnych tagów na swojej stronie i uczynić je wszystkie kompatybilnymi wstecz z IE6, po prostu dodając tablicę wszystkich nazw tagów, których chcesz użyć, a następnie tworząc każdy z nich w pętli for , w nagłówku strony, zanim zaczniesz używać któregokolwiek z nich. Tak właśnie działa html5shim. Po prostu bądź przygotowany na włożenie wysiłku w stylizowanie ich w starym IE. Poza tym, chociaż powiedziałbym, że jest to w porządku do użytku wewnętrznego, nie tak naprawdę chciałbym uczyć ludzi robienia różnych rzeczy. W ogóle.
Norguard,
13
Zgadzam się, pisanie własnych tagów nie jest dla osób o słabym sercu. Upewnij się, że dokładnie to przetestujesz. Chciałbym jednak powiedzieć jedno ... nie pisz CSS dla IE6. Całkowite marnowanie zasobów i umożliwia dalsze korzystanie z tak okropnego produktu, którego nawet Microsoft nie popiera.
Timothy Perez,
2
@alexwells - Chrome, FF, Safari, IE 7-9
Timothy Perez,
5
Bardzo ważna uwaga: chociaż przeglądarki obsługują tworzenie niestandardowego elementu, nie jest on oficjalnie obsługiwany przez standard HTML5. Technicznie rzecz biorąc , elementy niestandardowe są verboten. Możesz to zrobić i sprawić, by twój HTML wyglądał ładnie i semantycznie, ale jeśli to zrobisz, złamiesz standard - jeśli ci zależy. :)
Randolpho
11
Czasami ... trzeba wyznaczyć nowe standardy. ;-)
Timothy Perez
26

Nie jestem pewien co do tych odpowiedzi. Jak właśnie przeczytałem: „NIESTANDARDOWE TAGI SĄ ZAWSZE DOZWOLONE W HTML”.

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

Chodzi o to, że HTML był oparty na SGML. W przeciwieństwie do XML-a z jego typami dokumentów i schematami, HTML nie traci ważności, jeśli przeglądarka nie zna jednego lub dwóch znaczników. Pomyśl o <marquee>. To nie było w oficjalnym standardzie. Tak więc jego użycie spowodowało, że Twoja strona HTML została „oficjalnie niezatwierdzona”, ale też nie spowodowała uszkodzenia strony.

Następnie jest <keygen>, który był specyficzny dla Netscape, zapomniany w HTML4 i ponownie odkryty, a teraz określony w HTML5. Ponadto mamy teraz niestandardowe atrybuty tagów, takie jak data-XyZzz = "..." dozwolone we wszystkich tagach HTML5.

Tak więc, chociaż nie powinieneś wymyślać całej własnej, niestandardowej, nieokreślonej tabeli znaczników, nie jest całkowicie zabronione umieszczanie niestandardowych tagów w HTML. Dzieje się tak, chyba że chcesz wysłać go z + xml Content-Type lub osadzić inne przestrzenie nazw XML, takie jak SVG lub MathML. Dotyczy to tylko HTML ograniczonego do SGML.

mario
źródło
2
Ciekawe również tutaj: librador.com/2009/10/20/Styling-undefined-tag-names-in-HTML "Możesz użyć dowolnej nazwy tagu w HTML, a będzie ona częścią DOM i może mieć określony styl."
mario
5
„Tak więc korzystanie z niego sprawiło, że Twoja strona html stała się„ oficjalnie niezatwierdzona ”, ale też jej nie złamało”. - um, spróbuj stylizować swoje wymyślone elementy w przeglądarce Internet Explorer. To nie zadziała. Możesz nie uznać tego za zepsuty, ale fakt, że tagi niestandardowe są nieprawidłowe i nie działają w przeglądarce Internet Explorer, nie widzę, jak możesz argumentować, że są „dozwolone”.
Paul D. Waite
6
To znaczy, on niczym nie popiera swojego oświadczenia. To, że powiedział to Douglas Crockford, nie oznacza, że ​​to prawda.
Paul D. Waite
8
Oto, co mówią specyfikacje : „Ta specyfikacja nie definiuje, w jaki sposób zgodne programy klienckie obsługują ... elementy ... nieokreślone w tym dokumencie. [...] zalecamy następujące zachowanie: Jeśli klient użytkownika napotka element, nie rozpoznaje, powinien spróbować wyrenderować zawartość elementu. [...] autorzy i użytkownicy nie mogą polegać na konkretnych zachowaniach związanych z odzyskiwaniem błędów ”- IMHO oznacza to, że Crockfor choć raz się myli.
user123444555621
4
@Costa: HTML jest przydatny, ponieważ jest to zestaw uzgodnionych znaczeń tagów. Na przykład przeglądarki umożliwiają klikanie linków, ponieważ uzgodniliśmy (za pomocą specyfikacji HTML ), że <a>tag jest łączem do innej strony. Możesz stworzyć własną sałatkę ze znacznikami, ale nie będzie to miało znaczenia dla nikogo poza tobą. W danym celu może to być w porządku, ale tak naprawdę nie używasz już HTML.
Paul D. Waite
6

Jak sugerował Michael w komentarzach, to, co chcesz zrobić, jest całkiem możliwe, ale twoja nomenklatura jest błędna. Nie „dodajesz tagów do HTML 5”, tworzysz nowy typ dokumentu XML z własnymi tagami.

Zrobiłem to dla niektórych projektów w mojej ostatniej pracy. Kilka praktycznych porad:

  1. Kiedy mówisz, że chcesz „dodać je do HTML 5”, zakładam, że tak naprawdę masz na myśli to, że chcesz, aby strony wyświetlały się poprawnie w nowoczesnej przeglądarce, bez konieczności wykonywania dużej ilości pracy po stronie serwera. Można to osiągnąć, wstawiając „instrukcję przetwarzania arkusza stylów” u góry pliku xml, na przykład <? Xml-stylesheet type = "text / xsl" href = "menu.xsl"?>. Zastąp „menu.xsl” ścieżką do arkusza stylów XSL, który tworzysz w celu konwersji niestandardowych tagów do formatu HTML.

  2. Ostrzeżenia: Twój plik musi być dobrze sformułowanym dokumentem XML, z nagłówkiem XML <xml version = "1.0">. XML jest trudniejszy niż HTML w przypadku takich rzeczy, jak niedopasowane tagi. Ponadto, w przeciwieństwie do HTML, w tagach jest rozróżniana wielkość liter. Musisz również upewnić się, że serwer WWW wysyła pliki z odpowiednim typem MIME „application / xml”. Często serwer WWW zostanie skonfigurowany tak, aby robił to automatycznie, jeśli rozszerzenie pliku to „.xml”, ale sprawdź.

  3. Duże zastrzeżenie: Wreszcie użycie automatycznej transformacji XSL przeglądarek, jak już opisałem, jest naprawdę najlepsze tylko do debugowania i ograniczonych aplikacji, w których masz dużą kontrolę. Z powodzeniem wykorzystałem go do stworzenia prostego intranetu u mojego ostatniego pracodawcy, do którego dostęp miało najwyżej kilkadziesiąt osób. Nie wszystkie przeglądarki obsługują XSL i te, które nie mają w pełni zgodnych implementacji. Jeśli więc Twoje strony mają zostać udostępnione w „dzikiej” przestrzeni, najlepiej jest przekształcić je wszystkie w HTML po stronie serwera, co można zrobić za pomocą narzędzia wiersza poleceń lub za pomocą przycisku w wielu edytorach XML.

Dan Menes
źródło
5

Tworzenie własnych nazw tagów w HTML nie jest możliwe / nieprawidłowe. Do tego służą XML, SGML i inne ogólne języki znaczników.

To, czego prawdopodobnie chcesz, to

<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>

Albo zamiast <div/>i <span/>coś w rodzaju <ul/>i <li/>.

Aby wyglądał i działał dobrze, po prostu podłącz trochę CSS i JavaScript.

LukeN
źródło
5
Nie, nie jest. SGML powstał na długo przed pojawieniem się XML-a.
Quentin
1
Czy ktoś używa dziś zwykłego SGML? Albo ludzie używają HTML albo XML i wielu jego potomków, ale nigdy nie widziałem SGML na wolności! W każdym razie zaktualizuję moją odpowiedź.
LukeN
Założę się, że wciąż są ludzie używający Docbook SGML do dokumentacji. Z pewnością było ich wiele jeszcze kilka lat temu.
Ken
5

Chcę tylko dodać do poprzednich odpowiedzi, że ma sens używanie tylko dwuskładnikowych tagów dla niestandardowych elementów. Nigdy nie powinny być standaryzowane.


Na przykład chcesz użyć tagu <icon>, ponieważ nie lubisz <img>, ani też nie lubisz <i>...

Cóż, pamiętaj, że nie jesteś jedyny. Być może w przyszłości w3c i / lub przeglądarki określą / zaimplementują ten tag.

Obecnie przeglądarki prawdopodobnie zaimplementują styl natywny dla tego tagu, a projekt Twojej witryny może się zepsuć.

Więc proponuję użyć (zgodnie z tym przykładem) <img-icon>.


W rzeczywistości znacznik <menu>jest dobrze zdefiniowany, tj. Nie jest tak używany, ale zdefiniowany. Powinien zawierać takie, <menuitem>które zachowują się jak <li>.

long-lazuli
źródło
4

Niestandardowe znaczniki mogą być używane w Safari, Chrome, Opera i Firefox, przynajmniej o ile używa się ich zamiast „class = ...”.

green {color: green} w css działa

<green>This is some text.</green>
Chas
źródło
Masz rację @chas, ale ta metoda nie jest zalecana i będzie należała do kategorii „Hacki i sztuczki” ...
Piyush Kumar Baliyan
2

Do osadzania metadanych możesz spróbować użyć mikrodanych HTML , ale jest to nawet bardziej szczegółowe niż używanie nazw klas.

<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>
Ionuț G. Stan
źródło
2

Oprócz pisania arkusza stylów XSL, jak opisałem wcześniej, istnieje inne podejście, przynajmniej jeśli masz pewność, że zostanie użyty Firefox lub inna pełnoprawna przeglądarka XML (tj. NIE Internet Explorer). Pomiń transformację XSL i napisz kompletny arkusz stylów CSS, który powie przeglądarce, jak bezpośrednio sformatować XML. Plusem jest to, że nie musiałbyś uczyć się XSL, który wielu ludzi uważa za trudny i sprzeczny z intuicją. Wadą jest to, że twój CSS będzie musiał bardzo dokładnie określić styl, w tym co to są węzły blokowe, co to są inline, itp. Zwykle pisząc CSS można założyć, że przeglądarka „wie”, że <em> na przykład jest węzłem wbudowanym, ale nie będzie miał pojęcia, co zrobić z <dish>.

W końcu minęło kilka lat, odkąd to wypróbowałem, ale przypominam sobie, że IE (przynajmniej kilka wersji wstecz) odmówił stosowania arkuszy stylów CSS bezpośrednio do dokumentów XML.

Dan Menes
źródło
Tak, myślę, że IE przechodzi w specjalny tryb renderowania XML i prawie pokazuje upiększoną, zwijaną wersję dokumentu XML.
Paul D. Waite
2

Celem HTML jest to, że tagi zawarte w języku mają uzgodnione znaczenie, na którym każdy na świecie może używać i podejmować decyzje - takie jak domyślny styl, tworzenie klikalnych linków lub przesyłanie formularza po kliknięciu <input type="submit"> .

Zrobione tagi, takie jak Twoje, są świetne dla ludzi (ponieważ możemy nauczyć się angielskiego i dzięki temu wiemy, lub przynajmniej zgadnąć, co oznaczają Twoje tagi), ale nie są tak dobre dla maszyn.

Paul D. Waite
źródło
1

To nie jest opcja w żadnej specyfikacji HTML :)

Prawdopodobnie możesz robić, co chcesz z <div>elementami i klasami, z pytania nie jestem pewien, czego dokładnie szukasz, ale nie, tworzenie własnych tagów nie wchodzi w grę.

Nick Craver
źródło
1

Jak powiedział Nick, tagi niestandardowe nie są obsługiwane w żadnej wersji HTML.

Ale nie spowoduje to żadnego błędu, jeśli użyjesz takich znaczników w swoim kodzie HTML.

Wygląda na to, że chcesz utworzyć listę. Możesz użyć listy nieuporządkowanej, <ul>aby utworzyć elementy rool i użyć <li>tagu dla elementów poniżej.

Jeśli to nie jest to, co chcesz osiągnąć, określ dokładnie, czego chcesz. Wtedy możemy znaleźć odpowiedź.

Kirtan
źródło
2
Nie spowoduje to błędu w przeglądarce, ale IE dziwnie obsługuje CSS na nieznanych tagach.
ceejayoz
Hmmm, teraz tego nie wiedziałem! Wiedziałem, że nieznane nazwy CSS są obsługiwane dziwnie (to błąd). Ale czy na pewno dziwnie obsługuje również nieznane tagi? Czy nie renderuje ich po prostu bez tekstu w <>tagach?
Kirtan
1
nie możesz zastosować CSS do nieznanych elementów w Internet Explorerze. Spróbuj stylizować <abbr>element w IE 7. To nie zadziała, ponieważ IE 7 nie zaimplementował <abbr>(mimo że jest w standardzie!). Mam do siebie ponury chichot, gdy ludzie na ślepo mówią, że niestandardowy kod nie spowoduje żadnych błędów. Skąd wiesz, że nie spowoduje to żadnych błędów? Wystarczająco trudno jest uruchomić standardowy kod, nie mówiąc już o niestandardowym kodzie.
Paul D. Waite
1
Paul, poszukaj rozwiązania w html5shim. Nie uzyskasz korzyści z niestandardowej funkcjonalności, ale jeśli szukasz kontenera, wszystko, co musisz zrobić, to otworzyć document.createElement ("MyNewTagName"); w głowę (lub przynajmniej powyżej miejsca, w którym chcesz umieścić stylizowaną wersję tego tagu). Nawet stwórz ich tablicę i iteruj, tworząc je w JS - nie jest potrzebne żadne podłączenie DOM, po prostu utwórz jeden i wrzuć go. Po prostu przygotuj się na stylizowanie ich tak, jakby były układem blokowym iw 100% nieznane.
Norguard,
1

Możesz dodać atrybut niestandardowy za pomocą atrybutów danych HTML 5. Na przykład: Wiadomość, która dotyczy HTML 5. Zobacz http://ejohn.org/blog/html-5-data-attributes/, aby uzyskać szczegółowe informacje.

Alex Yang
źródło
1

Znaczniki polimerowe lub X umożliwiają tworzenie własnych tagów HTML. Opiera się na natywnym modelu „shadow DOM” przeglądarki.

Vinyll
źródło
1

Możesz po prostu dostosować styl css, utworzy to tag, który sprawi, że kolor tła będzie czerwony:

redback {background-color:red;}
 

<redback>This is red</redback>

TorKitten
źródło
1

W pewnych okolicznościach może się wydawać, że tworzenie własnych nazw tagów po prostu działa dobrze.
Jednak to tylko procedury obsługi błędów przeglądarki w pracy. Problem w tym, że różne przeglądarki mają różne procedury obsługi błędów!

Zobacz ten przykład.
Pierwsza linia zawiera dwa wymyślone elementy whati ever, które są różnie traktowane przez różne przeglądarki. Tekst jest czerwony w IE11 i Edge, ale czarny w innych przeglądarkach.
Dla porównania, druga linia jest podobna, z tym że zawiera tylko prawidłowe elementy HTML i dlatego będzie wyglądać tak samo we wszystkich przeglądarkach.

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>

Kolejny problem z elementami gotowymi polega na tym, że nie wiesz, co przyniesie przyszłość. Jeśli utworzono stronę internetową kilka lat temu z nazwy znaczników takich jak picture, dialog, details, slot, templateetc, je spodziewa się zachowywać jak przęseł, jesteś w tarapatach teraz!

Panie Lister
źródło
1

możesz użyć tego:

<!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>
Lawrence Turcotte
źródło
0

Znalazłem ten artykuł o tworzeniu niestandardowych tagów HTML i ich tworzeniu. Upraszcza proces i dzieli go na terminy, które każdy może zrozumieć i wykorzystać od razu - ale nie jestem do końca pewien, czy zawarte w nim próbki kodu są prawidłowe we wszystkich przeglądarkach, więc należy ostrzec je i dokładnie przetestować. Niemniej jednak jest to świetne wprowadzenie do tematu na początek.

Elementy niestandardowe: definiowanie nowych elementów w HTML

code-sushi
źródło
-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
źródło
Znakomity. Masz jakiś pomysł, dlaczego to nie zostało przegłosowane lub zaakceptowane?
rnso