2012-06-26 10 views
8

Wziąłem stronę, której DTD było przejściowe w HTML4 i zmieniłem typ dokumentu na <!DOCTYPE html> i pojawiła się dodatkowa przestrzeń między h1 i div pod nią. Nie wprowadziłem ŻADNYCH innych zmian w znacznikach lub CSS.HTML5 vs HTML4 - znacznik h1 renderowany z dodatkową przestrzenią - jak usunąć?

Przykład JSFiddle: http://jsfiddle.net/ngordon/vSqkg/3/.

Jeśli zmienisz typ dokumentu z HTML5 na HTML4 Transitional, zobaczysz dodatkową przestrzeń pojawiającą się i znikającą, mimo że znaczniki i CSS są dokładnie takie same.

Każdy pomysł, jak pozbyć się tego miejsca?

Odpowiedz

11

HTML 4.01 Transitional doctype powoduje niemal trybie standardowym w przeglądarkach. Doctype HTML5 powoduje tryb standardów.

W tym artykule Microsoft wyjaśnia różnicę: http://msdn.microsoft.com/en-us/library/ff405794%28v=vs.85%29.

Mówi, że dla trybu Prawie normami:

elementy Inline przyczynić się do linii wysokość tylko wtedy, gdy jeden z poniższych stwierdzeń jest prawdziwe.

Jeśli element:

  • Zawiera znaki tekstowe

  • Ma szerokość granicy niezerowe

  • ma niezerowy marginesu

  • ma niezerową wyściółka

  • Has obraz tła

  • Has vertical-align ustawiony na wartość inną niż bazowym

pamiętać, że przerwa linia nie jest uważana za znak tekstu dla tej definicji, chyba że jest to jedyna treść pole liniowe. W takim przypadku wysokość linii prostokąta pozostanie najwyżej położoną górną krawędzią pola liniowego i najniższym położonym dolnym dnem linii na linii, niezależnie od podanej wysokości linii .

Jeśli element img jest jedyną zawartością komórki tabeli, to pole liniowe wysokości wysokości komórki linii komórki jest ustawione na zero.

Najbardziej krytycznie w Twoim przypadku, to znaczy, że obliczenie wysokości wiersza zawierającego obraz nie obejmuje strut, wyimaginowany inline element, który powinien zwiększyć wysokość wiersza do wartości liniowego wysokości element h1.

Ten jsfiddle pokazuje prawdziwe span elementu z &nbsp; jako realnej zawartości tekstowej stojącego za rozporki i widać, że układ jest taki sam zarówno w HTML 4.01 Transitional DOCTYPE i DOCTYPE HTML5.

Ten jsfiddle przedstawia ten sam pomysł, tylko tym razem rozporka jest wytwarzany za pomocą CSS, np:

h1:before { 
    content: '\A0'; 
} 

W przypadku odpowiedzi Khurram za to, co robi jest zmniejszenie line-height h1 iw związku z tym, w trybie standardów, wysokość kolumny jest mniejsza niż wysokość obrazu. Oznacza to, że wysokość linii jako całości zależy od wysokości obrazu, a nie od wysokości kolumny. Wysokość obrazu jest taka sama zarówno w standardach, jak iw trybie prawie standardowym, więc znowu nie widać różnic w renderowaniu między trybami.

Co do tego dlaczego ustawienie wysokości linii h1 w celu dopasowania do wysokości obrazu (25 pikseli) nie działa, ale ustawienie na 12 pikseli powoduje, że kolumna ustanawia nie tylko wierzchołek i spód, ale także linia bazowa dla linii. Linia bazowa znajduje się nieco powyżej dna, aby umożliwić tekstowe zmniejszanie, dla tekstu o normalnym rozmiarze, który zwykle ma około 3 pikseli. Obraz domyślnie znajduje się na linii bazowej, więc odstęp między linią podstawową a dolną jest dodawany do wysokości obrazu w celu ustalenia wysokości linii.

Można to rozwiązać, przesuwając obraz poza linię bazową, używając img { vertical-align: top }, który jest przedstawiony w tym jsfiddle.Jeśli będziesz majstrować z wysokością linii h1, zobaczysz, że wartości większe niż 25 pikseli zwiększają odstępy między liniami, ale wartości 25 pikseli lub mniej nie zmieniają tych odstępów.

+2

Świetna odpowiedź, dobrze zbadana i rozwiązuje problem. – ForOhFor

+0

Rozwiązałem to, ustawiając css obrazu na "display: block;" ... jednak w innym kontekście może to nie być możliwe. – KnF

2

wystarczy podać line-height:12px; lub co chcesz.
ZOBACZ:JSFIDDLE. modyfikacja twojego kodu.

+0

Dziękujemy! Działa ... ale tak naprawdę tylko oszukuje przeglądarkę. Ten element ma zdecydowanie więcej niż 12 pikseli. Zastanawiam się, dlaczego ta przestrzeń pojawia się w pierwszej kolejności i czy istnieje lepszy sposób na usunięcie. – ForOhFor

3

Twój błąd dotyczy domyślnej wysokości linii.

Przejściowy HTML4 ignoruje zawartość twojej wysokości wiersza H1, tworząc element o wysokości 25 pikseli. HTML5 respektuje wysokość linii znacznika H1, który wynosi 29 pikseli.

+0

Ale jednoznacznie określając wysokość linii 25px nie działa. (Działa, gdy zmienisz go na 12px, ale wydaje się, że to raczej hack). Czemu? – ForOhFor

0

Właśnie dlatego płyta główna HTML5 ma reset CSS.

Możesz także ustawić div na margin: 0; padding: 0;, ale będziesz musiał zrobić to dla każdego elementu, dopóki nie trafisz ich wszystkich. Odpowiedź na pytanie o resetowanie CSS przez Meyera w tym wątku jest poprawna.

Oto przykład z obejścia: http://jsfiddle.net/mikelegacy/vSqkg/5/

Powiązane problemy