chevron-left chevron-right

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

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.

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

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

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

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

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.

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

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.

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

Elementy 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):

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;

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

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ść:

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.

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

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.

Pamię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:

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

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

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:

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.

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

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

Position: 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).

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

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

Podsumowanie

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