2009-02-25 12 views
47

najdłużej, chciałem zrozumieć dlaczego przeglądarka dodaje pustą przestrzeń między świadczonych elementów HTML, gdy nie jest nową linią pomiędzy nimi, na przykład:Dlaczego przeglądarka renderuje znak nowej linii jako spację?

<span>Hello</span><span>World</span> 

HTML powyżej wyjścia będzie „HelloWorld” ciąg bez przestrzeń pomiędzy „Hello” i „świat”, jednak w poniższym przykładzie:

<span>Hello</span> 
<span>World</span> 

HTML powyżej wyjściowego bĘDZIE „Hello World” string z przestrzeń pomiędzy „On llo "i" Świat ".

Teraz nie mam problemu z zaakceptowaniem, że jest to po prostu sposób, w jaki działa, ale to, co mnie martwi, to to, że zawsze miałem wrażenie, że spacje (lub znaki nowej linii) między elementami HTML nie mają znaczenia w momencie, gdy przeglądarka renderowała HTML użytkownika.

Moje pytanie brzmi, czy ktokolwiek wie, jaka jest filozoficzna lub techniczna przyczyna tego zachowania.

Dziękuję.

Odpowiedz

44

Przeglądarki skracają wiele białych znaków (w tym znaki nowej linii) do pojedynczej spacji podczas renderowania. Wyjątek stanowią elementy <pre> lub te, które mają zestaw CSS property white-space ustawiony na pre lub pre-wrap. (Lub w XHTML, atrybut xml:space="preserve").

+0

lub 'white-space: pre-line;' –

+0

@AndrewEvt O ile mi wiadomo, 'pre-line' nadal powoduje zwinięcie wielu spacji, z wyjątkiem newlines. Chociaż twój komentarz doprowadził mnie do znalezienia 'pre-wrap'. –

1

Jeśli miałbyś znak "a" między dwoma znacznikami, spodziewałbyś się, że zostanie wyrenderowany. W tym przypadku masz znak "\ n" między dwoma znacznikami; zachowanie jest analogiczne i spójne ("\ n" jest renderowane jako pojedynczy biały znak).

47

Biała spacja między elementami blokowymi są ignorowane. Jednak spacje między elementami śródliniowymi są przekształcane w jedną przestrzeń. Rozumowanie jest takie, że elementy śródliniowe mogą być przeplatane regularnym wewnętrznym tekstem elementu nadrzędnego.

Rozważmy następujący przykład:

<p>This is my colored <span class="red_text">Hello</span> <span class="blue_text">World</span> example</p> 

W idealnym przypadku, chcesz użytkownikowi zobaczyć

This is my colored Hello World example 

Usuwanie spacji między dwoma przęsłami jednak spowodowałoby:

This is my colored HelloWorld example 

Ale ta sama próbka może zostać przepisana przez autora (z OCD o formaterii HTML ng :-)) as:

<p> 
    This is my colored 
    <span class="red_text">Hello</span> 
    <span class="blue_text">World</span> 
    example 
</p> 

Byłoby lepiej, gdyby to zostało wykonane konsekwentnie z poprzednim przykładem.

+0

Właśnie natknąłem się na to, ponieważ mam do czynienia z tym samym problemem. Niezła, wyjaśniająca odpowiedź. Byłoby miło, gdyby przeglądarki wymagały spacji między rozpiętościami w powyższym przykładzie, niezależnie od nowej linii. Wiem, że mogą pojawić się problemy z edytorami tekstu, takimi jak Sublime, których można użyć do przycinania białej przestrzeni, ale miałoby to dla mnie większy sens. Czy to nie może być do doctype (przejściowy, ciąg itp.)? Chodzi mi o to, że obsługujemy wiele stron internetowych, które używają tego samego znacznika, ale na niektórych stronach zauważam dużo więcej niż na innych. Będę miał na to oko, na wypadek gdyby to był typ dokumentu. – ClarkeyBoy

-1

Przeglądarki pomylisz się tutaj:

http://www.w3.org/TR/html4/appendix/notes.html#h-B.3.1

SGML (zobacz [ISO8879], sekcja 7.6.1) określa, że ​​linia przerwać natychmiast po znacznik startu musi być ignorowane, ponieważ muszą przerwa linia bezpośrednio przed tagiem końcowym. Dotyczy to wszystkich elementów HTML bez wyjątku.

+3

Nie, popełniasz błąd tutaj: podział wiersza w przykładzie OP to * po * znaczniku końcowym! –

Powiązane problemy