HTML

Co robi DOCTYPE?

DOCTYPE to skrót od Document Type (Typ dokumentu). DOCTYPE jest zawsze powiązany z DTD - Document Type Definition (Definicją Typu Dokumentu).

DTD definiuje, w jaki sposób dokumenty danego typu powinny być strukturyzowane (np. button może zawierać span, ale nie div), podczas gdy DOCTYPE deklaruje, jaką DTD dokument rzekomo respektuje (np. ten dokument respektuje DTD HTML).

W przypadku stron internetowych deklaracja DOCTYPE jest wymagana. Służy ona do informowania agentów użytkownika, jaką wersję specyfikacji HTML respektuje Twój dokument. Gdy agent użytkownika rozpozna prawidłowy DOCTYPE, uruchomi tryb bez dziwactw (no-quirks mode) odpowiadający temu DOCTYPE do odczytu dokumentu. Jeśli agent użytkownika nie rozpozna prawidłowego DOCTYPE, uruchomi tryb dziwactw (quirks mode).

Deklaracja DOCTYPE dla standardów HTML5 to <!DOCTYPE html>.

Jak serwować stronę z treścią w wielu językach?

Zakładam, że pytanie dotyczy najczęstszego przypadku, czyli sposobu serwowania strony z treścią dostępną w wielu językach, ale treść na stronie powinna być wyświetlana tylko w jednym spójnym języku.

Kiedy do serwera wysyłane jest żądanie HTTP, agent użytkownika zazwyczaj wysyła informacje o preferencjach językowych, np. w nagłówku Accept-Language. Serwer może następnie wykorzystać te informacje do zwrócenia wersji dokumentu w odpowiednim języku, jeśli taka alternatywa jest dostępna. Zwrócony dokument HTML powinien również deklarować atrybut lang w znaczniku <html>, np. <html lang="en">...</html>.

Oczywiście jest to bezużyteczne dla poinformowania wyszukiwarki, że ta sama treść jest dostępna w różnych językach, dlatego należy również użyć atrybutu hreflang w <head>. Np. <link rel="alternate" hreflang="de" href="http://de.example.com/page.html" />

W zapleczu, kod HTML będzie zawierał symbole zastępcze i18n i treść dla danego języka przechowywaną w formatach YML lub JSON. Serwer następnie dynamicznie generuje stronę HTML z treścią w tym konkretnym języku, zazwyczaj za pomocą frameworka back-endowego.

Na jakie rzeczy należy uważać podczas projektowania lub tworzenia witryn wielojęzycznych?

  • Używaj atrybutu lang w swoim HTML.
  • Kierowanie użytkowników do ich języka ojczystego - Umożliwienie użytkownikowi łatwej i bezproblemowej zmiany kraju/języka.
  • Tekst w obrazach rastrowych (np. png, gif, jpg itp.) nie jest skalowalnym podejściem - Umieszczanie tekstu w obrazie jest nadal popularnym sposobem na wyświetlanie ładnych, niestandardowych czcionek na dowolnym komputerze. Jednak, aby przetłumaczyć tekst obrazu, każdy ciąg tekstowy będzie musiał mieć osobny obraz utworzony dla każdego języka. Coś więcej niż garstka takich zamienników może szybko wymknąć się spod kontroli.
  • Ograniczająca długość słów/zdań - Niektóre treści mogą być dłuższe po napisaniu w innym języku. Należy uważać na problemy z układem lub przepełnieniem w projekcie. Najlepiej unikać projektowania, w którym ilość tekstu decydowałaby o sukcesie lub porażce projektu. Liczba znaków wchodzi w grę w przypadku nagłówków, etykiet i przycisków. Są one mniejszym problemem w przypadku swobodnego tekstu, takiego jak tekst główny lub komentarze.
  • Pamiętaj o tym, jak postrzegane są kolory - Kolory są postrzegane różnie w różnych językach i kulturach. Projekt powinien odpowiednio używać kolorów.
  • Formatowanie dat i walut - Daty kalendarzowe są czasami przedstawiane w różny sposób. Np. „31 maja 2012” w USA vs „31 May 2012” w częściach Europy.
  • Nie łącz przetłumaczonych ciągów - Nie rób nic w stylu "Data dzisiaj to " + data. To spowoduje błąd w językach o innym szyku zdań. Zamiast tego użyj szablonu ciągu z podstawieniem parametrów dla każdego języka. Na przykład, spójrz na następujące dwa zdania w języku angielskim i chińskim odpowiednio: I will travel on {% date %} i {% date %} 我会出发. Zauważ, że położenie zmiennej jest inne ze względu na zasady gramatyczne języka.
  • Kierunek czytania języka - W języku angielskim czytamy od lewej do prawej, od góry do dołu, w tradycyjnym języku japońskim tekst czytany jest od góry do dołu, od prawej do lewej.
  • Przydatne do posiadania - uwzględnij locale w ścieżce (np. en_US, zh_CN itp.).

Do czego służą atrybuty `data-`?

Zanim frameworki JavaScript stały się popularne, programiści front-end używali atrybutów data- do przechowywania dodatkowych danych w samym DOM, bez innych haków, takich jak niestandardowe atrybuty, dodatkowe właściwości w DOM. Jest on przeznaczony do przechowywania niestandardowych danych prywatnych dla strony lub aplikacji, dla których nie ma bardziej odpowiednich atrybutów lub elementów.

W dzisiejszych czasach używanie atrybutów data- jest generalnie niezalecane. Jednym z powodów jest to, że użytkownicy mogą łatwo modyfikować atrybut danych za pomocą elementu inspect w przeglądarce. Model danych jest lepiej przechowywany w samym JavaScript i aktualizowany w DOM za pomocą wiązania danych, być może za pośrednictwem biblioteki lub frameworka.

Jednakże, jednym z doskonale prawidłowych zastosowań atrybutów danych jest dodanie haka dla frameworków testowych end-to-end, takich jak Selenium i Capybara, bez konieczności tworzenia bezsensownych klas lub atrybutów ID. Element potrzebuje sposobu na znalezienie przez konkretną specyfikację Selenium, a coś takiego jak data-selector='the-thing' jest prawidłowym sposobem na to, nie komplikując przy tym znacząco znaczników semantycznych.

Rozważ HTML5 jako otwartą platformę internetową. Jakie są bloki konstrukcyjne HTML5?

  • Semantyka - Pozwala precyzyjniej opisywać zawartość.
  • Łączność - Pozwala komunikować się z serwerem w nowy i innowacyjny sposób.
  • Tryb offline i przechowywanie danych - Pozwala stronom internetowym przechowywać dane lokalnie po stronie klienta i działać w trybie offline bardziej efektywnie.
  • Multimedia - Uczynienie wideo i audio pełnoprawnymi elementami otwartej sieci.
  • Grafika 2D/3D i efekty - Pozwala na znacznie bardziej zróżnicowany zakres opcji prezentacji.
  • Wydajność i integracja - Zapewnia większą optymalizację szybkości i lepsze wykorzystanie sprzętu komputerowego.
  • Dostęp do urządzeń - Pozwala na korzystanie z różnych urządzeń wejścia i wyjścia.
  • Stylizacja - Pozwala autorom pisać bardziej wyrafinowane motywy.

Opisz różnicę między `cookie`, `sessionStorage` i `localStorage`.

Wszystkie wymienione powyżej technologie to mechanizmy przechowywania klucz-wartość po stronie klienta. Są one w stanie przechowywać wartości tylko jako ciągi znaków.

| | cookie | localStorage | sessionStorage | | --- | --- | --- | --- | | Inicjator | Klient lub serwer. Serwer może użyć nagłówka Set-Cookie | Klient | Klient | | Ważność | Ustawiana ręcznie | Na zawsze | Po zamknięciu karty | | Trwałość między sesjami przeglądarki | Zależy od tego, czy ustawiono wygaśnięcie | Tak | Nie | | Wysyłane do serwera z każdym żądaniem HTTP | Cookies są automatycznie wysyłane za pośrednictwem nagłówka Cookie | Nie | Nie | | Pojemność (na domenę) | 4kb | 5MB | 5MB | | Dostępność | Dowolne okno | Dowolne okno | Ta sama karta |

Uwaga: Jeśli użytkownik zdecyduje się wyczyścić dane przeglądania za pomocą dowolnego mechanizmu udostępnianego przez przeglądarkę, spowoduje to wyczyszczenie wszystkich przechowywanych cookie, localStorage lub sessionStorage. Ważne jest, aby o tym pamiętać podczas projektowania dla lokalnej trwałości, zwłaszcza w porównaniu z alternatywami, takimi jak przechowywanie po stronie serwera w bazie danych lub podobne (które oczywiście będą trwałe niezależnie od działań użytkownika).

Opisz różnicę między `<script>`, `<script async>` i `<script defer>`.

  • <script> - Parsowanie HTML jest blokowane, skrypt jest pobierany i wykonywany natychmiast, parsowanie HTML wznawia się po wykonaniu skryptu.
  • <script async> - Skrypt zostanie pobrany równolegle do parsowania HTML i wykonany, gdy tylko będzie dostępny (potencjalnie przed zakończeniem parsowania HTML). Użyj async, gdy skrypt jest niezależny od innych skryptów na stronie, na przykład analityki.
  • <script defer> - Skrypt zostanie pobrany równolegle do parsowania HTML i wykonany, gdy strona zostanie w pełni sparsowana. Jeśli jest ich wiele, każdy odroczony skrypt jest wykonywany w kolejności, w jakiej został napotkany w dokumencie. Jeśli skrypt zależy od w pełni sparsowanego DOM, atrybut defer będzie przydatny w zapewnieniu, że HTML jest w pełni sparsowany przed wykonaniem. Odroczony skrypt nie może zawierać document.write.

Uwaga: Atrybuty async i defer są ignorowane dla skryptów, które nie mają atrybutu src.

Dlaczego zazwyczaj dobrym pomysłem jest umieszczanie `<link>` CSS między `<head></head>`, a `<script>` JS tuż przed `</body>`? Czy znasz jakieś wyjątki?

Umieszczanie <link>ów w <head>

Umieszczanie <link>ów w <head> jest częścią właściwej specyfikacji w budowaniu zoptymalizowanej witryny. Kiedy strona jest ładowana po raz pierwszy, HTML i CSS są parsowane jednocześnie; HTML tworzy DOM (Document Object Model), a CSS tworzy CSSOM (CSS Object Model). Oba są potrzebne do stworzenia wizualizacji na stronie internetowej, co pozwala na szybkie uzyskanie czasu "pierwszego znaczącego malowania". To progresywne renderowanie to kategoria, w której optymalizacyjne witryny są mierzone pod kątem ich wydajności. Umieszczanie arkuszy stylów na dole dokumentu to to, co uniemożliwia progresywne renderowanie w wielu przeglądarkach. Niektóre przeglądarki blokują renderowanie, aby uniknąć konieczności ponownego malowania elementów strony, jeśli ich style się zmieniają. Użytkownik jest wtedy zmuszony do oglądania pustej, białej strony. Innym razem mogą wystąpić błyski nieostylowanej zawartości (FOUC), które pokazują stronę internetową bez zastosowanych stylów.

Umieszczanie <script>ów tuż przed </body>

Znaczniki <script> blokują parsowanie HTML podczas pobierania i wykonywania, co może spowolnić Twoją stronę. Umieszczenie skryptów na dole pozwoli na wcześniejsze sparsowanie i wyświetlenie HTML użytkownikowi.

Wyjątkiem od umieszczania <script>ów na dole jest sytuacja, gdy skrypt zawiera document.write(), ale w dzisiejszych czasach nie jest to dobra praktyka. Ponadto, umieszczenie <script>ów na dole oznacza, że przeglądarka nie może rozpocząć pobierania skryptów, dopóki cały dokument nie zostanie sparsowany. Zapewnia to, że kod, który musi manipulować elementami DOM, nie zgłosi błędu i nie zatrzyma całego skryptu. Jeśli musisz umieścić <script>y w <head>, użyj atrybutu defer, który osiągnie ten sam efekt uruchomienia skryptu dopiero po sparsowaniu HTML, ale przeglądarka może pobrać skrypt wcześniej.

Pamiętaj, że umieszczenie skryptów tuż przed zamykającym znacznikiem </body> stworzy iluzję szybszego ładowania strony na pustej pamięci podręcznej (ponieważ skrypty nie będą blokować pobierania reszty dokumentu). Jednakże, jeśli masz jakiś kod, który chcesz uruchomić podczas ładowania strony, zacznie on być wykonywany dopiero po załadowaniu całej strony. Jeśli umieścisz te skrypty w znaczniku <head>, zaczną one być wykonywane wcześniej - więc na przygotowanej pamięci podręcznej strona faktycznie wydawałaby się ładować szybciej.

Znaczniki <head> i <body> są teraz opcjonalne

Zgodnie ze specyfikacją HTML5, niektóre znaczniki HTML, takie jak <head> i <body>, są opcjonalne. Przewodnik stylów Google nawet zaleca ich usunięcie, aby zaoszczędzić bajty. Jednakże, ta praktyka nadal nie jest szeroko przyjęta, a zysk na wydajności jest prawdopodobnie minimalny i dla większości witryn prawdopodobnie nie będzie miał znaczenia.

Co to jest progresywne renderowanie?

Progresywne renderowanie to nazwa nadana technikom używanym do poprawy wydajności strony internetowej (w szczególności poprawy postrzeganego czasu ładowania) w celu jak najszybszego renderowania treści do wyświetlenia.

Kiedyś było to znacznie bardziej rozpowszechnione w czasach przed szerokopasmowym internetem, ale nadal jest używane w nowoczesnym rozwoju, ponieważ mobilne połączenia danych stają się coraz bardziej popularne (i zawodne)!

Przykłady takich technik:

  • Leniwe ładowanie obrazów - Obrazy na stronie nie są ładowane wszystkie naraz. JavaScript będzie używany do ładowania obrazu, gdy użytkownik przewinie do części strony, która wyświetla obraz.
  • Priorytetowanie widocznej zawartości (lub renderowanie powyżej zagięcia) - Uwzględnij tylko minimalne CSS/treść/skrypty niezbędne dla części strony, która zostanie wyświetlona w przeglądarce użytkownika, aby wyświetlić się jak najszybciej, a następnie możesz użyć odroczonych skryptów lub nasłuchiwać zdarzenia DOMContentLoaded/load, aby załadować inne zasoby i treści.
  • Fragmenty HTML asynchroniczne - Wypłukiwanie części HTML do przeglądarki w miarę konstruowania strony na zapleczu. Więcej szczegółów na temat techniki można znaleźć.

Dlaczego używałbyś atrybutu `srcset` w tagu obrazu? Wyjaśnij proces, którego używa przeglądarka podczas oceny zawartości tego atrybutu.

Użyłbyś atrybutu srcset, gdy chcesz serwować różne obrazy użytkownikom w zależności od szerokości wyświetlacza ich urządzenia - serwowanie obrazów wyższej jakości urządzeniom z wyświetlaczami Retina poprawia wrażenia użytkownika, podczas gdy serwowanie obrazów o niższej rozdzielczości urządzeniom niższej klasy zwiększa wydajność i zmniejsza marnowanie danych (ponieważ serwowanie większego obrazu nie będzie miało żadnej widocznej różnicy). Na przykład: <img srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 2000w" src="..." alt=""> informuje przeglądarkę, aby wyświetliła małą, średnią lub dużą grafikę .jpg w zależności od rozdzielczości klienta. Pierwsza wartość to nazwa obrazu, a druga to szerokość obrazu w pikselach. Dla szerokości urządzenia 320px wykonuje się następujące obliczenia:

  • 500 / 320 = 1,5625
  • 1000 / 320 = 3,125
  • 2000 / 320 = 6,25

Jeśli rozdzielczość klienta wynosi 1x, najbliższe jest 1,5625, a 500w odpowiadające small.jpg zostanie wybrane przez przeglądarkę.

Jeśli rozdzielczość jest Retina (2x), przeglądarka użyje najbliższej rozdzielczości powyżej minimum. Oznacza to, że nie wybierze 500w (1,5625), ponieważ jest to większe niż 1, a obraz może wyglądać źle. Przeglądarka wybrałaby wtedy obraz z wynikowym współczynnikiem bliższym 2, czyli 1000w (3,125).

srcset rozwiązuje problem, w którym chcesz serwować mniejsze pliki obrazów urządzeniom z wąskimi ekranami, ponieważ nie potrzebują one ogromnych obrazów, tak jak wyświetlacze komputerów stacjonarnych — a także opcjonalnie chcesz serwować obrazy o różnej rozdzielczości na ekrany o wysokiej/niskiej gęstości pikseli.

Czy używałeś wcześniej różnych języków szablonów HTML?

Tak, Pug (wcześniej Jade), ERB, Slim, Handlebars, Jinja, Liquid i EJS to tylko niektóre z nich. Moim zdaniem są one mniej więcej takie same i zapewniają podobną funkcjonalność uciekania od treści i pomocne filtry do manipulowania wyświetlanymi danymi. Większość silników szablonów pozwoli również na wstrzyknięcie własnych filtrów w przypadku, gdy potrzebujesz niestandardowego przetwarzania przed wyświetleniem.

Jaka jest różnica między canvas a SVG?

Canvas jest oparty na rastrach, działa z pikselami, podczas gdy SVG jest oparty na wektorach, wykorzystując matematyczne opisy kształtów. Canvas wykorzystuje imperatywne rysowanie, gdzie każdy krok jest określany za pomocą JavaScriptu, idealne do dynamicznych i interaktywnych grafik, takich jak animacje i gry.

Z kolei SVG wykorzystuje deklaratywne rysowanie, z kształtami i ścieżkami zdefiniowanymi bezpośrednio w HTML, co czyni go bardziej dostępnym i przyjaznym dla SEO. Canvas jest optymalny do złożonych scen ze względu na mniejszy narzut, ale skalowanie może prowadzić do utraty jakości obrazu. SVG, będąc niezależnym od rozdzielczości, dostosowuje się do różnych rozmiarów ekranu bez utraty jakości.

Ostatecznie, canvas nadaje się do dynamicznych, wymagających dużej wydajności grafik, podczas gdy SVG sprawdza się w skalowalnych, niezależnych od rozdzielczości grafikach, z wrodzonymi zaletami dostępności i SEO.

Czym są puste elementy w HTML?

Puste elementy w HTML to elementy, które nie zawierają żadnej treści między swoimi tagami otwierającymi i zamykającymi. Zamiast tego są to tagi samozamykające się, co oznacza, że mają ukośnik (/) przed zamykającym nawiasem kątowym (>). Niektóre typowe przykłady pustych elementów to:

  • <img>: Używany do osadzania obrazów w dokumencie.
  • <input>: Używany do akceptowania danych wejściowych od użytkownika.
  • <br>: Używany do wstawiania podziałów linii lub wymuszonych podziałów linii.
  • <hr>: Używany do tworzenia poziomych linii lub separatorów.