chevron-left chevron-right

Piotr Nalepa Frontend, architecture and AI

[HTML][CSS] Dlaczego pisanie kodu HTML i CSS nas wkurza?

This version
blog.piotrnalepa.pl/2014/05/27/html-css-dlaczego-pisanie-kodu-html-i-css-nas-wkurza
Published
Author
, Staff Software Engineer
Category
CSS
Feedback
Write to me · Post on X

This post is 12 years old. Browsers and tools may have changed since then, so check the code against current documentation before you use it.

Będąc webmasterami bardzo często musimy walczyć z "dziwnym" zachowaniem przeglądarek, co potrafi doprowadzić spokojnego człowieka do szału. W tym wpisie przedstawię listę rzeczy z którymi webmasterzy najczęściej się borykają w swojej pracy.

Section 1Zawsze deklaruj DOCTYPE

Jest to rzecz, która się wydaje oczywista. Lecz brak takiej deklaracji czasem pojawia się w różnych generatorach stron co często powoduje dziwne zachowanie się kodu i powoduje rozpacz webmasterów. W dzisiejszych czasach stosujemy już DOCTYPE dla HTML5, czyli:

Example 1HTML
1
2
3
4
5
<!DOCTYPE html>
<html>
<head></head>
<body></body>
</html>

Pominięcie deklaracji DOCTYPE sprawi, że przeglądarka wejdzie w tryb quirks mode co sprawi, że przeglądarka zacznie wyświetlać stronę niepoprawnie lub niezgodnie z zamierzeniami twórcy, np:

  • tabele będą źle wyświetlane,
  • kolory mogą być niewłaściwie interpretowane,
  • wysokość elementów może być źle obliczana,
  • może powodować wiele, wiele innych problemów

Section 2Problemy z modelem pudełka - box model

Przed tak zwaną "erą responsywności" twórcy stron internetowych korzystali z klasycznego modelu CSS pudełka (CSS box model), to znaczy ustalali szerokość elementu, a wartość padding i wartość border-width były dodawane do szerokości elementu przez co element ostatecznie był szerszy. Co sprawiało webmasterom dużo problemów.

Dzisiaj można korzystać z dobrodziejstw jakie daje wykorzystanie reguły CSS box-sizing: border-box. Dzięki temu, element ma niezmienną, faktyczną szerokość, a wartości padding i border-width są zawierane w szerokości elementu. Jest to genialne rozwiązanie, które pozwala nam zachować większą kontrolę nad układem strony. I co ważne, działa od IE8 wzwyż, czyli działa już wszędzie.

Section 3Elementy z float powinny być pierwsze w strukturze strony

Ile to już razy na różnych forach webmasterskich ludzie szukali pomocy z rozjeżdżającym się layoutem? Takich pytań jest pełno. Jedną z fundamentalnych rzeczy w pisaniu kodu HTML i CSS jest dbanie o to, aby elementy które będą miały ustawiony float były umiejscowione w strukturze jako pierwsze. Dzięki temu, unikniemy problemu ze "spadającymi" elementami, które pojawiają się poniżej docelowego miejsca.

Example 2HTML
1
2
3
4
5
<div class="wrapper">
  <div class="floated">Lewy sidebar</div>
  <div class="floated">Prawy sidebar</div>
  <div class="content">Treść</div>
</div>

W powyższym przypadku, element o klasie .content będzie wchodził w wolną przestrzeń między dwoma "floatowanymi" elementami w przypadku gdy ten elementy z klasą .floated mają zdefiniowaną szerokość a elementowi z klasą .content przypiszemy wartość overflow: hidden.

Section 4Czyszczenie floatów

Jeśli korzystamy z właściwości float, to musimy pamiętać o tym, aby resetować zachowanie layoutu w momencie gdy już nie chcemy by kolejne elementy zachowywały się jak elementy z float. W tym celu stosujemy tzw. clearfix:

Example 3CSS
1
2
3
4
5
6
7
8
.row:before,
.row:after {
  display: table;
  content: '';
}
.row:after {
  clear: both;
}

W wielu miejscach w Internecie powyższy kod znajdziecie pod nazwą .clearfix, ale ja go w swoim kodzie lubię nazywać jako .row. Ewentualnie, zamiast dopisywać klasę .row możesz dać własność overflow: hidden do kontenera nadrzędnego, np. tak jak w przykładzie wyżej możesz dodać tą własność do elementu z klasą .wrapper.

Section 5Element zawierający floatowane elementy a jego wysokość

Kolejna rada odnośnie elementów z własnością CSS float. Kontener zawierający elementy z float domyślnie ma wysokość obliczoną na 0 - height: 0. To może powodować różnego rodzaju problemy, w szczególności jeśli chcemy aby układ strony nie skakał w momencie dynamicznie dodawanych nowych elementów lub gdy chcemy określić obszar w którym np. klikanie będzie dawało określony efekt.

By sprawić, że kontener z elementami będzie miał wyliczoną wysokość wystarczy dodać clearfix o którym wspomniałem wyżej. Tym samym układ strony się nie rozjedzie.

Section 6Elementy z float są domyślnie elementami blokowymi

W starszym kodzie CSS jak również w kodzie pisanym przez osoby dopiero poznające tajniki pisania kodu CSS bardzo często można spotkać się z zapisem (lub podobnym):

Example 4CSS
1
2
3
4
.floated {
  float: left;
  display: block;
}

Taki zapis nie zepsuje nam układu strony, ale jest niepotrzebny. Dzieje się tak dlatego, że elementy z float domyślnie są elementami blokowymi. Nawet wymuszanie innej wartości dla display, na przykład: display: inline; lub display: table; nie zmieni tego stanu. Elementy z float są elementami blokowymi i dlatego wystarczy dać tylko float: left;

Section 7Stylowanie wierszy w tabeli

Stylowanie elementów tabeli może być czasem zaskakującym zajęciem. Warto zapamiętać, że element <tr> nie zaakceptuje stylów CSS wykonanych za pomocą własności border, dopóki tabela w której znajduje się wiersz nie będzie miała własności border-collapse: collapse;.

Co ciekawsze, jeśli elementy <tr>, <td> lub <th> będą miały tą samą szerokość zdefiniowaną w border-width, na przykład:

Example 5CSS
1
2
3
tr { border: 2px solid #b30; } /* kolor wiersza będzie niewidoczny */
td { border: 2px solid #cde; }
th { border: 2px solid #000; }

To kolor obramowania wiersza nie będzie widoczny. Aby kolor obramowania wiersza był widoczny, to trzeba zwiększyć jego wielkość:

Example 6CSS
1
2
3
tr { border: 3px solid #b30; } /* kolor wiersza będzie już widoczny */
td { border: 2px solid #cde; }
th { border: 2px solid #000; }

Tym samym, kolory obramowania wszystkich elementów są widoczne na stronie.

Section 8Oznaczanie przycisku jako zaznaczonego w Firefox

Aby zwiększyć dostępność elementów strony Firefox dodaje wewnętrze obramowanie do elementów <input> oraz <button>. Dzięki temu łatwiej jest korzystać z nich za pomocą np. klawiatury. Niestety, nie zawsze jest to pożądany efekt. Na szczęście możemy to zmienić za pomocą następującego kodu:

Example 7CSS
1
2
3
4
5
input::-moz-focus-inner,
button::-moz-focus-inner {
  padding: 0;
  border: 0;
}

Tym samym wyłączymy oznaczanie aktywnego przycisku. Dobrym zwyczajem jest jednak zapewnienie jakiegokolwiek zamiennego sposobu na oznaczanie aktywnego elementu.

Section 9Pamiętaj by poprawnie definiować typ przycisku w HTML

Warto pamiętać o tym, aby definiować poprawny typ przycisku - <button>, w kodzie HTML. Brak zdefiniowanego typu będzie oznaczał dla przeglądarki, że przycisk przyjmie domyślną wartość submit. Co może spowodować, że w momencie gdy mamy więcej niż jeden przycisk w formularzu, to naciśnięcie któregokolwiek z nich spróbuje wysłać dane formularza na serwer, a co jest niepożądanym zachowaniem.

Poniżej przykładowa poprawna implementacja formularza z dwoma przyciskami: jeden do wysłania formularza a drugi do jakiejkolwiek innej akcji, np. do zresetowania pól formularzy:

Example 8HTML
1
2
3
4
5
<form action="akcja.php" method="post">
  <input type="text" name="wartosc" />
  <button type="submit">Wyślij</button>
  <button type="button">Wyczyść pole</button>
</form>

Co ważne, dobrym zwyczajem jest określanie znacznika <button>, a nie na przykład za pomocą <a>. Dzięki temu czytniki dla osób niedowidzących lub niewidomych będą w stanie poprawnie zlokalizować przycisk akcji, a nie pusty link do którego jest przypisana jakaś akcja w JS. Warto o tym pamiętać.

Dla przycisków znajdujących się poza formularzem należy stosować zapis <button type="button">Przycisk</button>.

Section 10Limit selektorów i arkuszy w IE9 i w starszych

Przy pracy nad naprawdę dużym projektami, które są w trakcie totalnej renowacji strony wizualnej (czyli od nowa jest pisany kod HTML i kod CSS) można natknąć się na problem z kodem CSS niedziałającym w przeglądarkach Internet Explorer. Może to być spowodowane limitem, który wynosi 4096 selektorów na arkusz stylów.

Należy pamiętać o tym, że selektorem nie jest zestaw reguł dla wybranych elementów, na przykład:

Example 9CSS
1
2
3
4
5
.elem1,
.elem2,
.elem3 .text { font-size: 20px; }
 
.elem2 { color: #000; }

W powyższym przypadku mamy do czynienia z czterema selektorami, a nie dwoma. Przeglądarka taki zapis interpretuje jako:

Example 10CSS
1
2
3
4
5
.elem1       { font-size: 20px; }
.elem2       { font-size: 20px; }
.elem3 .text { font-size: 20px; }
 
.elem2 { color: #000; }

Oprócz limitu selektorów jest też limit arkuszy stylów zarówno tych ładowanych za pomocą <link rel="stylesheet" href="style.css" /> jak i za pomocą <style>/* CSS */</style>. Limit wynosi 31 arkuszy stylów, w sumie dla obydwu sposobów ich ładowania.

Section 11Rodzaje pozycji elementów strony

Bardzo często na forach można się spotkać z problemem, że jakiś element (z własnością position: absolute; nie chce się pojawić w wybranym miejscu tylko znajduje się totalnie gdzieś indziej. Jest to związane z tym, że elementy z tą własnością ustawiają się względem ich najbliższego rodzica/kontenera, który ma ustawioną jedną z własności: position: relative;, position: absolute; lub position: fixed;. Własność position: static; jest wartością domyślną dla każdego elementu strony i można jej użyć do resetowania zachowania elementu.

Należy też pamiętać, że elementy które mają zaimplementowaną własność position: fixed; są ustawiane tylko i wyłącznie względem okna przeglądarki. To oznacza, że podczas przewijania strony element będzie zawsze widoczny, bo okno przeglądarki samo w sobie nie zmienia pozycji.

Section 12Pozycja elementu a jego szerokość

Nie ma potrzeby dawania własności width: 100% elementom z własnością position: absolute; lub position: fixed;, jeśli mają ustawione własności left: 0; oraz right: 0;, ponieważ to są zamienne sposoby na osiągnięcie tego samego.

Section 13Position: fixed i transformacje

Jeśli bawisz się animacjami CSS, to mogłeś/aś się spotkać z przypadkiem gdy element z własnością CSS position: fixed; zachowuje się jakby jego własność miała wartość position: absolute;. Jest to spowodowane tym, że wykorzystanie właśności transform na kontenerze który zawiera element z position: fixed; sprawia, że kontener zachowuje się jakby miał ustawioną własność position: relative;, a element z position: fixed; jest traktowany jak element z position: absolute. Można poczytać o tym w artykule Erica Meyera (jednego z magów CSS).

Section 14Optymalizacja animacji CSS

Jako że ostatnimi czasy bardzo na topie są animacje CSS, to warto zadbać o to, aby strona która posiada ich mnóstwo np. w postaci płynnych przejść stanów przycisków lub posiadająca płynnie zmieniające swoją formę elementy, była odpowiednio zoptymalizowana. Można tego dokonać poprzez dodanie następujących własności w kodzie CSS odpowiedzialnym za animacje:

Example 11CSS
1
2
3
4
.animowany-element {
  transform: translate3d(0,0,0);
  -webkit-transform: translate3d(0,0,0);
}

Dzięki temu, wymusisz wykorzystanie procesora graficznego zamiast normalnego procesora urządzenia. Procesory graficzne są znacznie efektywniejsze w generowaniu grafiki stron. Ponadto, dzięki temu, w szczególności na urządzeniach mobilnych, poprawisz wydajność swojej strony oraz sprawisz, że korzystanie z Twojej strony lub aplikacji nie będzie takie "bateriożerne".

Section 15Podsumowanie

To był długi wpis, ale zawiera szereg użytecznych porad o których warto pamiętać podczas tworzenia kodu strony internetowej czy też aplikacji internetowej. Dzięki temu, unikniesz kłopotliwych sytuacji i Twoje życie będzie przyjemniejsze.
Jeśli znasz inne ciekawe problemy związane z kodem HTML lub CSS oraz sposoby ich rozwiązania, to zapraszam do podzielenia się swoimi spostrzeżeniami w komentarzach pod tym wpisem.

źródło

Share
Feedback

About the author

Staff Software Engineer

I've been writing this blog since 2009 and building for the web professionally for 14 years. Today I lead the frontend of the Cosmos platform at Bishop Fox, where I've been since day one of the project. Before that I worked at OLX, KUDO, Auto1 and eZ Systems. Here I write about what I've learned in practice: JavaScript, TypeScript, React, CSS and frontend architecture. I've also spoken at conferences across Poland and Europe. Got a question or an idea for a post? Let me know!