Czy znaczniki samozamykające się są ważne w HTML5?

Walidator W3C nie lubi samozamykających się znaczników (tych, które kończą się "/>") na elementach non-void . (Elementy Void to te, które nigdy nie mogą zawierać żadnej treści.) Czy są one nadal ważne w HTML5?

Kilka przykładów zaakceptowanych elementów void:

<br />
<img src="" />
<input type="text" name="username" />

Niektóre przykłady odrzuconych elementów nie-void:

<div id="myDiv" />
<span id="mySpan" />
<textarea id="someTextMessage" />

Uwaga:
Walidator W3C akceptuje void samozamykające się tagi: the autor początkowo miał problem z powodu prostej literówki (\> zamiast />); jednak znaczniki samozamykające się nie są w 100% poprawne w HTML5 w ogóle, a odpowiedzi omawiają problem samozamykających się znaczników w różnych smakach HTML.

Author: Ardent Coder, 2010-08-24

7 answers

  • W HTML 4, <foo / (tak, Bez > w ogóle) oznacza <foo> (co prowadzi do <br /> znaczenia <br>> (tj. <br>&gt;) i <title/hello/ znaczenia <title>hello</title>). Jest to SGML zasada, że przeglądarki wykonywały bardzo słabą pracę, a spec radzi autorom, aby unikali składni.

  • W XHTML, <foo /> środki <foo></foo>. Jest to reguła XML , która ma zastosowanie do wszystkich dokumentów XML. To powiedziawszy, XHTML jest często serwowany jako text/html które (przynajmniej historycznie) są przetwarzane przez przeglądarki za pomocą innego parsera niż dokumenty podawane jako application/xhtml+xml. W3C dostarcza wytyczne kompatybilności do stosowania dla XHTML jako text/html. (Zasadniczo: używaj składni znacznika samozamykającego się tylko wtedy, gdy element jest zdefiniowany jako pusty (a znacznik końcowy był zabroniony w specyfikacji HTML)).

  • W HTML5 , znaczenie <foo /> zależy od typu elementu .

    • na elementach HTML, które są znaczniki końca są po prostu zabronione, ponieważ są oznaczone jako void elements (zasadniczo "element, który istniał przed HTML5 i którego zawartość była zabroniona"). Ukośnik na końcu znacznika start jest dozwolony, ale nie ma znaczenia. Jest to po prostu cukier składniowy dla osób (i zakreślaczy składni) uzależnionych od XML.
    • w innych elementach HTML Ukośnik jest błędem, ale odzyskiwanie błędów spowoduje, że przeglądarki zignorują go i potraktują znacznik jako zwykły znacznik startowy. To będzie zazwyczaj kończy się brakiem znacznika końcowego, co powoduje, że kolejne elementy są dziećmi zamiast rodzeństwa.
    • elementy obce (importowane z aplikacji XML, takich jak SVG) traktują ją jako składnię samoczynnie zamykającą się.
 1263
Author: Quentin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-20 12:46:19

Jak zauważył Nikita Skvortsov, samozamykający się div nie będzie sprawdzał poprawności. To dlatego, że div jest elementem normalnym , a nie elementem pustym.

Zgodnie z specyfikacją HTML5, znaczniki, które nie mogą mieć żadnej zawartości (znane jako void elements), mogą być samozamykające się*. Obejmuje to następujące tagi:

area, base, br, col, embed, hr, img, input, 
keygen, link, meta, param, source, track, wbr

" / " jest całkowicie opcjonalne dla powyższych tagów, więc {[1] } nie różni się od <img>, ale <img></img> jest niepoprawne.

*Uwaga: obce elementy mogą być również samozamykające się, ale nie sądzę, aby to było w zasięgu tej odpowiedzi.

 414
Author: Red Orca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-28 23:45:00

W praktyce używanie samozamykających się znaczników w HTML powinno działać tak, jak można się tego spodziewać. Ale jeśli martwisz się o pisanie valid HTML5, powinieneś zrozumieć, jak używanie takich znaczników zachowuje się w dwóch różnych formach składni, których możesz użyć. HTML5 definiuje zarówno składnię HTML, jak i składnię XHTML, które są podobne, ale nie identyczne. To, który z nich zostanie użyty, zależy od typu nośnika przesłanego przez serwer WWW.

Bardziej niż prawdopodobne, Twoje strony są serwowane jako text/html, które postępuje zgodnie z łagodniejszą składnią HTML. W takich przypadkach HTML5 pozwala niektórym znacznikom startowym na opcjonalne / przed zakończeniem >. W takich przypadkach / jest opcjonalne i ignorowane, więc <hr> i <hr /> są identyczne. Specyfikacja HTML nazywa te "puste elementy" i podaje listę ważnych elementów. Ściśle mówiąc, opcjonalne / jest ważne tylko w znacznikach startowych tych pustych elementów; na przykład, <br /> i {[2] } są poprawne HTML5, ale <p /> nie jest.

Specyfikacja HTML5 jasno rozróżnienie między tym, co jest poprawne dla autorów HTML i dla twórców przeglądarek internetowych, przy czym druga grupa jest zobowiązana do zaakceptowania wszystkich rodzajów nieprawidłowej "starszej" składni. W tym przypadku oznacza to, że przeglądarki zgodne z HTML5 będą akceptować nielegalne samozamykające się znaczniki, takie jak <p />, i renderować je zgodnie z oczekiwaniami. Ale dla autora ta strona byłaby , a nie prawidłowym HTML5. (Co ważniejsze, Drzewo DOM, które uzyskasz z używania tego rodzaju nielegalnej składni, może być poważnie spieprzone; samo-zamknięte <span /> tagi, na przykład, mają tendencję do bałagan rzeczy dużo ).

(w nietypowym przypadku, gdy twój serwer wie, jak wysyłać pliki XHTML jako typ MIME XML, strona musi być zgodna ze składnią XHTML DTD i XML. Oznacza to, że znaczniki samozamykające są wymagane dla elementów zdefiniowanych jako takie.)

 64
Author: Michael Edenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-24 10:33:53

HTML5 zasadniczo zachowuje się tak, jakby nie było końcowego ukośnika. Nie ma czegoś takiego jak samozamykający się znacznik w składni HTML5.

  • Samozamykające się znaczniki na non-void elementy takie jak <p/>, <div/> nie zadziała. Końcowy ukośnik będzie ignorowany, a te będą traktowane jako znaczniki otwierające. Może to prowadzić do problemów z gniazdowaniem.

    To prawda, niezależnie od tego, czy przed ukośnikiem znajduje się Spacja: <p /> i <div /> również nie będą działać dla z tego samego powodu.

  • Samozamykające się znaczniki na void elementy takie jak <br/> lub <img src="" alt=""/> będzie działać, ale tylko dlatego, że końcowy Ukośnik jest ignorowany i w tym przypadku powoduje to prawidłowe zachowanie.

Rezultatem jest to, że wszystko, co działało w Twoim starym "XHTML 1.0 served as text / html"będzie nadal działać tak, jak wcześniej: końcowe ukośniki na znacznikach nie-void również nie zostały tam zaakceptowane, podczas gdy końcowy ukośnik na elementach void zadziałało.

Jeszcze jedna uwaga: możliwe jest reprezentowanie dokumentu HTML5 jako XML, a to jest czasami nazywane "XHTML 5.0". W tym przypadku stosuje się reguły XML, a znaczniki samozamykające się zawsze będą obsługiwane. Zawsze musi być obsługiwany z typem mime XML.

 14
Author: thomasrutter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Samozamykające się znaczniki są ważne w HTML5, ale nie są wymagane.

<br> i <br /> są w porządku.

 6
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-24 16:16:03

Byłbym bardzo ostrożny z samozamykającymi się tagami, jak pokazuje ten przykład:

var a = '<span/><span/>';
var d = document.createElement('div');
d.innerHTML = a
console.log(d.innerHTML) // "<span><span></span></span>"

Moje przeczucie byłoby <span></span><span></span> zamiast

 5
Author: Andreas Herd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-20 19:09:10

Jednak-tak dla przypomnienia - jest to niepoprawne:

<address class="vcard">
  <svg viewBox="0 0 800 400">
    <rect width="800" height="400" fill="#000">
  </svg>
</address>

I Ukośnik tutaj sprawi, że znów będzie ważny:

    <rect width="800" height="400" fill="#000"/>
 0
Author: Leo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-12 00:39:55