Vývoj kvalitných webstránok
- Štruktúra webového projektu
- HTML - čo áno a čo nie
- Metadáta
- Farby
- Základ CSS
- Optimalizácia a korekcia webu po technickej stránke
- Kontrola zobrazenia v rôznych prehliadačoch
- Formáty súborov vhodné a určené pre web
- Podpora indexovania
INFO: V tomto článku sa nebudeme zaoberať webdizajnom, samotnou štruktúrou HTML ani pravidlami v CSS.
Tvoriť stránky nie je ťažké. Tvoriť svižné stránky bez chýb tiež nemusí byť náročné. Napriek tomu je dnes časté tvoriť stránky plné zbytočného kódu a závislostí.
Ja osobne odmietam tvoriť stránky, ktoré používajú stack plný zbytočných závislostí. Tie zväčšujú množstvo dát potrebných na načítanie stránky a zároveň komplikujú prispôsobenie výsledku mojim predstavám.
Framework nie je problém. Problém je používať ho bez pochopenia toho, čo sa deje pod ním. Vývojári postupne strácajú kontakt s čistým HTML, CSS a JS a keď neovládajú poriadne základy, neovládajú ani prácu s framework-om. Tvorba stránky nie je len o krásnom dizajne a rýchlej publikácii. Dôležité je dbať na SEO (Search Engine Optimalisation), na ľudí so zrakovým postihnutím a na výkon stránky.
INFO: Tento článok je zameraný na vývoj stránok na operačnom systéme Debian.
Štruktúra webového projektu
Nie je nutné tvoriť stránky práve takto. Určite by sa našli vývojári, ktorí by s niektorými výrokmi z tohto článku nesúhlasili. Je to môj osobný postup a nikomu ho nenútim. Každý webový projekt by mal mať prehľadnú štruktúru. Táto štruktúra bola navrhnutá pre webový server Apache.
POZOR: web/ musí byť skutočne nastavený ako DocumentRoot v Apache. Obsah mimo DocumentRoot nesmie byť dostupný prostredníctvom HTTP. Takže https://example.com/ musí smerovať na obsah web/.
example.com/
├── private/ - mimo webu
│ ├── .env - citlive udaje
│ ├── db-config.php
│ ├── functions.php
│ └── ...
│
└── web/ - DOCUMENT ROOT
├── .htaccess
├── robots.txt
├── sitemap.xml
│
├── favicon.ico
├── 403.html
├── 404.html
│
├── assets/
│ ├── css/
│ ├── js/
│ ├── img/
│ │ ├── logo.svg
│ │ └── favicon.svg
│ └── fonts/
│
├── domov/
│ ├── index.php
│ └── ...
│
├── stranka-1/
│ ├── index.php
│ └── ...
├── stranka-2/
│ ├── index.php
│ └── ...
│
└── gdpr/
└── index.php
Ako sa spoľahlivo dostanem do private/?
Stačí jednoducho pridať na začiatok PHP skriptu, v ktorom potrebujeme napr. prihlásenie do databázy, pridať nasledujúci riadok.
require_once __DIR__ . '/../private/db-config.php';
UPOZORNENIE: .env nie je bezpečný kvôli svojmu názvu, ale preto, lebo nie je dostupný cez HTTP protokol vďaka umiestneniu mimo DOCUMENT ROOT webového servera Apache.
.htaccess
.htaccess môže byť umiestnený aj v podadresároch web/, pretože sa v ňom dá nastaviť viac než len presmerovanie a zobrazenie chybových hlásení.
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
# interne prepisanie / na /domov
RewriteEngine On
RewriteRule ^$ domov/index.php [L]
Interné prepísanie nie je presmerovanie. Interné prepísanie je v tomto prípade to, že na example.com/ sa zobrazí obsah /domov/index.php
robots.txt
Sem patria pravidlá pre crawlerov (robotov vyhľadávačov), ktoré určujú, ku ktorým častiam webu majú alebo nemajú pristupovať. Niektorí crawleri to ignorujú, ale je dobrá prax robots.txt používať. Predvolene ak nemám niečo, čo nechcem, aby čítali, povoľujem všetko. Okrem toho odporúčam doň explicitne crawlerom oznámiť, kde sa nachádza sitemap.xml.
User-agent: *
Disallow:
Sitemap: https://example.com/sitemap.xml
sitemap.xml
Patria doň url, ktoré chceme, aby vyhľadávače indexovali. Pomáha to crawlerom rýchlejšie indexovať web a objaviť jeho stránky.
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/domov/</loc>
</url>
<url>
<loc>https://example.com/stranka-1/</loc>
</url>
<url>
<loc>https://example.com/stranka-2/</loc>
</url>
</urlset>
HTML - čo áno a čo nie
Aj keď prehliadače nie sú prísne na 100 % správne používanie HTML tagov - je veľmi vhodné vyvarovať sa niektorým častým chybám.
<style>patrí výlučne do<head><link rel="stylesheet">patrí výlučne do<head>- nadpisy používať hierarchicky a nepoužívať viac ako jeden
h1(aj keď je to technický povolené) - Na vytvorenie odseku používať
<p>, nie niekoľko<br>za sebou. Na väčšiu medzeru využiť CSS margin - Nepoužívať duplicitné
id - Pri vnáraní elementov sa riadiť pravidlami Content modelu podľa HTML dokumentácie
- Obrázky
<img>majú maťalt. Dekoratívne obrázky používajúalt="". Dekoratívny obrázok je ikona, ktorá nie je sama o sebe tlačidlom, je to akákoľvek ozdobná čiara, či abstraktný tvar. Logo stránky/firmy nie je dekoratívne... je to značka a alt môže byť názov firmy. Ak obrázok obsahuje text, ktorý je dôležitý pre používateľa, text musí byť reprezentovaný aj valt, prípadne v okolí obrázka.
Metadáta
Metadáta sú dôležitou súčasťou SEO, pretože poskytujú vyhľadávačom informácie o obsahu webovej stránky. Pomáhajú im lepšie pochopiť, o čom stránka je, a správne ju zaradiť medzi výsledky vyhľadávania. Niektoré metadáta sa môžu zobrazovať aj priamo vo výsledkoch vyhľadávania a ovplyvniť, či používateľ na stránku klikne.
<title>- názov konkrétnej stránky (zobrazí sa v prehliadači na karte a vo výsledkoch vyhľadávania) - title by mal byť stručný a výstižný. Optimálna dĺžka cca do 60 znakov<meta name="description">- popis stránky (zobrazí sa vo výsledkoch vyhľadávania ako opis stránky) - optimálna dĺžka cca 140-160 znakov<link rel="canonical">- určuje preferovanú kanonickú URL pre daný obsah. Niehttps://example.com/stranka-1/index.php, alehttps://example.com/stranka-1/- OpenGraph metadáta - slúžia sociálnym sieťam na pekné zobrazenie odkazov spolu s názvom stránky, popisom a reprezentačným obrázkom. Odporúčané minimum je:
- og:title - viď
<title> - og:description - viď
<meta name="description"> - og:image - mal by obsahovať absolútnu adresu k obrázku -
https://example.com/stranka-1/obal.webp - og:url - viď
<link rel="canonical">
- og:title - viď
<title>Názov Firmy - skúsený predajca nábytku</title>
<meta name="description" content="Vitajte na tejto stránke, máme toto, ponúkame aj toto.">
<link rel="canonical" href="https://example.com/stranka-1/">
<meta property="og:title" content="Názov Firmy - skúsený predajca nábytku">
<meta property="og:description" content="Vitajte na tejto stránke, máme toto, ponúkame aj toto.">
<meta property="og:image" content="https://example.com/image.webp">
<meta property="og:url" content="https://example.com/stranka-1/">
Farby
TIP: nástroj na výber palety farieb Color Palette Generator – Color Wheel Tool | Adobe Express
Nie je dobré používať kontrast čistej čiernej a čistej bielej. Je to síce super pre slabozrakých ľudí, ale pri dlhom čítaní väčšina ľudí preferuje miernejší kontrast. Fajn voľby sú nasledovné, no nie sú to jediné možnosti.
body {
color: #222;
background: #fff;
}
body {
color: #e6e6e6;
background: #000;
}
Namiesto rovnakých hodnôt farieb, veľkostí a rozostupov na desiatkach miest je šikovné používať CSS custom properties:
:root {
--primary: #1a2b3c;
--secondary: #a1b2c3;
--radius: 0.5em;
}
používajú sa nasledovne:
.upozornenie {
color: var(--secondary);
background-color: var(--varovna_oranzova);
border-radius: var(--radius);
}
Základ CSS
Toto nie je povinné, nie sú to ani pravidlá, je to však podľa mňa veľmi rozumné základné nastavenie so základnou responzivitou médií a nadpisov.
/* PRIKLAD NASTAVENIA FONTU */
@font-face {
font-family: "National Park";
src: url("/assets/fonts/NationalPark.woff2") format("woff2");
font-display: swap;
}
body {
margin: 0;
font-family: "National Park", sans-serif;
line-height: 1.5;
}
/* Obrazky a media */
img, video, canvas, svg {
display: block;
max-width: 100%;
}
img {
height: auto;
}
/* Nadpisy */
h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
}
/* minimum 2rem, plynule zvacsovanie podla viewportu, maximum 4rem. */
h1 {
font-size: clamp(2rem, 4vw, 4rem);
}
h2 {
font-size: clamp(1.75rem, 3vw, 3rem);
}
h3 {
font-size: clamp(1.5rem, 2.5vw, 2.25rem);
}
h4 {
font-size: clamp(1.25rem, 2vw, 1.75rem);
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
/* Formulare */
button,
input,
textarea,
select {
font: inherit;
}
/* Tlacidla */
button {
cursor: pointer;
}
font-family: "National Park", sans-serif; - sans-serif - bezpätková rodina fontov sa použije ak National Park nie je dostupný. Sans-serif teda nie je konkrétny font, ale skupina. Je na prehliadači, aký dostupný font zvolí, ale určite bude bezpätkový.
font-display: swap; - umožní okamžité zobrazenie pomocou dostupného fontu a keď sa vlastný font stiahne, nahradí sa ním
font: inherit; - nastaví font na taký, aký je použitý u rodiča - pri prvkoch formulára prehliadače často volia bez tohto nastavenia predvolené systémové fonty.
Hlavný obsah napr. samotný článok by mohol mať napr.:
article {
max-width: 100ch;
}
Nemusí to byť práve element article. Podstatný je efekt. Ľudia neradi čítajú zľava doprava po celej šírke obrazovky. Text vtedy býva rozletený a udržať čitateľa je vtedy ťažké, zároveň by mohol ľahko preskočiť riadok pri čítaní. ch - character - je jednotka založená na šírke znaku 0 použitého fontu.
Optimalizácia a korekcia webu po technickej stránke
poznámka: nemusí byť všetko na 100 % optimalizované ani na 100 % korektné - aj keď to by malo...
Taký ideálny postup ako vytvoriť kvalitnú stránku, čo sa týka HTML a rýchlosti načítania, môže vyzerať nasledovne:
- Skontrolujem a opravím chyby v HTML
- Skontrolujem a zlepším prístupnosť stránky
- Optimalizujem stránku na rýchlosť načítania
- Skontrolujem, či neobsahuje neplatné odkazy (dôležité pre SEO)
Validácia HTML
Kontroluje správnosť HTML kódu, odhaľuje syntaktické chyby a nezrovnalosti, ktoré môžu ovplyvniť kompatibilitu s prehliadačmi.
Pre prehľadnosť som napísal skript, ktorý zefektívni prácu s VNU - pred tým je nutné vnu.jar vložiť do /opt/:
#!/bin/bash
java -jar /opt/vnu.jar "$@" 2>&1 | awk '
/error:/ {
error++
print "\033[31m■\033[0m " $0
next
}
/warning:/ {
warning++
print "\033[33m■\033[0m " $0
next
}
/info:/ {
info++
print "\033[36m■\033[0m " $0
next
}
{
print
}
END {
print ""
print "--------------------"
print "\033[31mError:\033[0m " error+0
print "\033[33mWarning:\033[0m " warning+0
print "\033[36mInfo:\033[0m " info+0
print "--------------------"
print "Total: " error+warning+info
}
Je dobré nastaviť si alias napr.:
# ~/bash_aliases
alias vnu="/opt/vnu-color.sh"
Dá sa použiť aj na dynamické stránky pomocou príkazu curl napr.:
curl -sL localhost:8080/ | vnu -
curl -sL https://example.com/ | vnu -
https://validator.w3.org/nu/ - stále aktuálny vnu bez potreby inštalácie s krajším výstupom, avšak je závislý na pripojení k internetu.
Optimalizácia a zlepšenie dostupnosti
Hodnotí výkon a technické aspekty stránky. Zameriava sa na:
- Performance - výkon a metriky používateľského zážitku (mobil, PC)
- Accessibility - Prístupnosť pre osoby so zdravotným postihnutím
- Best Practices - Dodržiavanie najlepších postupov
- SEO - Optimalizácia pre vyhľadávače
Nástroj pomáha odhaľovať problémy s prístupnosťou webu.
Kontrola nefunkčných linkov
https://www.deadlinkchecker.com/
Kontroluje nefunkčné odkazy na webe, pomáha udržiavať web bez chýbajúcich odkazov, čo je dôležité predovšetkým pre používateľov a technickú kvalitu webu. Nefunkčné interné odkazy zhoršujú používateľský zážitok a komplikujú prehľadávanie webu.
Kontrola zobrazenia v rôznych prehliadačoch
Treba to vedieť preto, lebo vývojár stránky musí zabezpečiť, aby sa stránka zobrazovala na podporovaných prehliadačoch správne a použiteľne.
Pochopenie spracovania HTML a CSS
HTML a CSS spracováva vykresľovací engine. 3 najznámejšie sú Blink, Gecko a WebKit. Ak ste počuli o Chromium, to je jadro/základ prehliadača, ktorý používa vykresľovací engine Blink. Prakticky každý prehliadač, ktorý poháňa Blink, je postavený na jadre Chromium.
WEB
│
┌────────────────┴──┬─────────────┐
│ │ │
Blink Gecko WebKit
│ │ │
┌─────┬───┴───┬──────┐ │ ┌────┴────┐
│ │ │ │ │ │ │
Chrome Edge Brave Opera Firefox Safari GNOME Web
Pri bežnom webe je užitočné otestovať aspoň jeden reprezentatívny prehliadač založený na každom z troch hlavných renderovacích enginov. Napr. Brave (Blink), Firefox (Gecko) a GNOME Web (WebKit) alebo WebKitGTK MiniBrowser.
Inštalácia GNOME Web
$ sudo apt update
$ sudo apt install epiphany-browser
POZOR: GNOME Web nie je Safari. Oba používajú WebKit, ale Safari používa implementáciu Apple WebKit a GNOME Web používa implementáciu WebKitGTK. Nejde o úplne identické prostredie a teda sa stránka nemusí zobraziť identicky. Prakticky sa však GNOME Web alebo WEBKitGTK MiniBrowser dá použiť na kontrolu pre Safari.
Pri kontrole zobrazenia je vhodné skontrolovať, či v konzole javascriptu sú nejaké chyby (Ctrl + Shift + I).
Formáty súborov vhodné a určené pre web
Zabudnite na JPG a PNG na webe. Zaberajú veľa miesta a spôsobujú pomalé načítanie stránky. Svoje miesto majú, ale nie v prípade obrázkov, ktoré sa reálne budú zobrazovať priamo na stránke. Samozrejme sa môžu používať a ak sú použité na vhodné obrázky s dostatočnou kompresiou, tak to vôbec nevadí.
| Typ | Starý formát | Moderný formát |
|---|---|---|
| Logo, ikona, favicon | PNG | SVG |
| Obrázok, fotka | PNG, JPG | WebP |
| Animácia | GIF | WebP |
| Font | TTF | WOFF2 |
| Video | AVI (DivX/Xvid + MP3) | WebM (VP9 + Opus) |
| Zvuk | mp3 | Opus a AAC |
Favicon je dobré uložiť aj ako ICO do koreňového adresára webu kvôli niektorým nástrojom a klientom, ktorí ho tam stále hľadajú. Na tento účel stačí ICO 32×32 px. zaujímavosť: ICO dokáže obsahovať aj viac veľkostí naraz
Okrem WebP existuje aj formát obrázkov AVIF, ktorý má ešte lepšiu kompresiu, avšak má pomalé kódovanie. V budúcnosti bude pravdepodobne vďaka rýchlejším počítačom populárnejší, avšak dnes je menej efektívny.
TIP: Na konverziu obrázkov používam balík webp - príkazy cwebp a gif2webp a pre fonty balík woff2 - príkaz woff2_convert
WebM je dnes široko podporovaný formát. Bežná kombinácia videa VP9 a zvuku Opus funguje v moderných verziách populárnych prehliadačov od roku 2021. To znamená, že už nie je nutné vkladať video takýmto spôsobom:
<video controls>
<source src="/video.webm" type="video/webm">
<source src="/video.mp4" type="video/mp4">
</video>
Stále to však môže pomôcť zopár užívateľom. Robilo sa to tak, aby si starší prehliadač vedel vybrať kompatibilné MP4 (H.264 + AAC) ak nepodporuje WebM. Ak vás trápi nízke úložisko vo vašom webhostingu, stačí použiť:
<video controls preload="metadata" poster="./video-poster.webp">
<source src="./video.webm" type="video/webm">
</video>
Na konverziu videí do WebM sa dá využiť napr. populárny ffmpeg:
ffmpeg -i video.mp4 -c:v libvpx-vp9 -c:a libopus video.webm
Podpora indexovania
Okrem toho, že stránky majú mať aspoň základné metadáta a sitemap.xml a robots.txt majú byť správne nastavené, indexovanie sa dá podporiť aj pomocou nástrojov vyhľadávačov. Nie každý vyhľadávač ponúka takú možnosť.
V týchto nástrojoch je nutné overiť vlastníctvo domény. Potom sa začnú zhromažďovať dáta a po určitom čase uvidíte, ako často ľudia klikajú na vašu stránku z vyhľadávania. Je možné aj priamo zadať adresu sitemap.xml, čím zaistíte, že stránky, ktoré sitemap.xml obsahuje budú objavené vyhľadávačom a urýchlite indexovanie. Okrem toho uvidíte prípadné chyby ohľadom SEO, presmerovaní, neexistujúca alebo neurčená kanonická adresa a mnoho štatistík.
Tento článok možno stiahnuť vo formáte markdown.

