Esettanulmány · Folyamatban lévő építés

Képkockánként átnézett honlap

Egy állatorvosi rendelő új honlapja. A felület áll, a tartalom véglegesítése zajlik — ez a lap a 2026. októberi állást írja le.

A helyzet
Állatorvosi rendelőt vezetsz, és új honlapot szeretnél. A szerkezetet már összeraktad egy vázlatban, a látványt másra bíznád — és amíg az új készül, a régi oldalnak működnie kell.
Amit eddig elvégeztem
Egyedi téma a vázlat szerkezetére, bővítmény nélkül, két nyelven. A betöltést, a mozgást és a telefonos megjelenést képkockánként mértem, két böngészőmotorban, és egy régi iPhone-t is célgépként kezeltem.
Hol tart
Az új oldal próbacímen épül, és 2026. október 4-ig huszonegy változat ment ki oda. A tartalom véglegesítése zajlik, a csapatfotók helyén addig avatárok állnak; a régi oldal közben zavartalanul üzemel.

A munka számokban

A folyamatban lévő honlap főbb adatai
Az együttműködés kezdete2026. augusztus — ajánlatkérés szerkezeti vázlattal
Állapotépül — próbacímen, a tartalom véglegesítése zajlik
Nyelvek2 — magyar és angol
Szolgáltatás-aloldal14
Kiadott változat a próbacímen21, 2026. október 4-ig
Tesztsor37 tétel (2026. október), a böngészős mérések két motorban
Ellenpróba98, mindegyik egy védelmet fordít vissza (2026. október)
Projekt
állatorvosi rendelő
Szerep
Látványterv a megrendelő vázlatára, egyedi téma, mozgás és betöltés, telefonos nézet, kiadások
Együttműködés
Szerződéses fejlesztés, visszajelzés-körökben
Ezt vállalom
Egyedi honlapot, képkockánként mért betöltéssel.kristof@kristofkarner.com
Kapcsolódik
Honlapkészítés — ár és menet

A vázlat, amiből indultunk

Az állatorvosi rendelő új honlapjára 2026 augusztusában érkezett az ajánlatkérés, egy diasoros szerkezeti vázlattal: benne volt, milyen lapok legyenek, és mi kerüljön rájuk. A látványt a megrendelő rám bízta. Később kilenc másik állatorvosi oldal érkezett mintának, néhol egy-egy kiemelt résszel.

A kilencből három dolgot vettem át: a csapat személyes bemutatkozását, egy áttekinthető lapszerkezetet és a szolgáltatások lenyíló menüjét. Egyedi az élő nyitvatartás lett: a lap azt mutatja, hogy a rendelő éppen nyitva van-e, és ilyen a kilenc közül egyiken sem volt.

A szövegek a megrendelő anyagából jöttek — a vázlatból, a régi oldalról és a később küldött, kijelölt részekből —, az angol változat ezek fordítása. Ahol még hiányzott valami, ott helyőrző áll, amíg a végleges meg nem érkezik: a csapatfotók helyén például avatárok, a megrendelő kérésére.

A régi oldal végig működött

Az állatorvosi rendelő új honlapja az első naptól egy próbacímen épült, a régitől elkülönítve; a régi a fő címen zavartalanul üzemelt — ezt a megrendelő az elején kérte. Minden visszajelzés-kör után oda került ki az új változat, így a rendelő minden körben a valódi, kattintható oldalt nézte.

2026. október 4-ig huszonegy ilyen változat ment ki. Minden kiadás előtt mentés készül a próbacímről, és a kiadás csak ép mentéssel megy tovább. Utána gépi ellenőrzés fut: a lapok és minden fájl, amire hivatkoznak, a biztonsági fejlécek, végül fájlonként az, hogy a szerveren pontosan az áll-e, ami a helyi gépen.

A kidolgozottság, mérve

A rendelő új honlapjánál a mércém az volt, hogy betöltéskor semmi ne villanjon be és semmi ne ugorjon el, és az oldal minden böngészőben ugyanúgy viselkedjen. Ezt nem szemre ellenőriztem: a lapot gép tölti be, és képkockánként feljegyzi, mi látszik belőle.

Egy példa: az egyik változatban a tartalom betöltéskor homályból élesedett ki, mégis bevillanásnak hatott. A képkockák megmutatták, miért: a szöveg 80 ezredmásodperc alatt 84 százalékig láthatóvá vált, és a homály csak utána oszlott. A 2026. október 4-i változatban előbb a lap áll össze — a fejléc, a sávok háttere, a nagy kép —, és a tartalmi elemek egy ütemmel később, lágyan jönnek elő.

A képkockánkénti mérés találta meg azt is, hogy lapváltáskor az ikonok 60–130 ezredmásodpercig üresen álltak, hogy első megnyitáskor a menüpontok a betűk megérkezésekor 7–15 képpontot ugrottak, és hogy a nyitókép a betöltés végén egy pillanatra kifakult. Szemre mindhárom csak egy pillanatnyi rándulás volt; hogy mi okozza, az a képkockákból derült ki.

Mit jelent ez, ha hasonló a helyzeted

Ha új honlapot szeretnél, a szerkezetet összeállíthatod magad is, akár egy diasorban, a látványt és a megvalósítást pedig rám bízhatod. A régi oldalad közben működik, és minden kört a valódi oldalon nézhetsz meg, a saját telefonodon is.

A kidolgozottságnál azt nézem, amit a látogató lát: hogy betöltéskor mi jelenik meg és mikor — képkockánként mérve —, és hogy egy régebbi telefonon is ugyanígy működik-e.

Ha új honlapot szeretnél, és van már elképzelésed a szerkezetéről, írj pár mondatot arról, mi van most, és mit szeretnél. Egy levélváltásból általában kiderül, mennyi munka.

kristof@kristofkarner.com
Technikai kibontás

Innentől a részletek: hogyan mérem a betöltést képkockánként, hogyan ellenőrzöm magukat a teszteket, mit jelent egy régi iPhone célgépként, és néhány hiba, amit csak a mérés mutatott meg.

A megvalósítás mérete

A megvalósítás mérete
Egyedi téma53 PHP-fájl, 9 348 sor
Kézzel írt CSS és JavaScript3 065 sor CSS, 1 822 sor JavaScript
Szövega kódtól külön, két JSON-készletben, magyarul és angolul
Bővítménynincs
Tesztsor37 tétel — 36 fájl, 7 975 sor (2026. október)
Ellenpróba98 sor, 118 cserével (2026. október)
Ellenőrzés a helyi másolaton — a téma, a tesztsor és az ellenpróbák
$ find . -name "*.php" | wc -l             # a téma mappájában
      53
$ grep -c '^\s*fut "' teszt/mind.sh        # a projekt gyökerében
37
$ python3 teszt/ellenproba.py --horgonyok
Ellenpróba-horgonyok: mind a 118 egyértelmű.

Egy betöltés, képkockánként

Az oldalbetöltést ennél a projektnél saját mérőszkript vizsgálja. A lapot gép tölti be lassított hálózaton, üres gyorsítótárral, a Chrome és a Safari motorjában (Chromium és WebKit), asztali és telefonos méretben. Az első 3,5 másodpercben minden képkockán megnézi a képernyőn álló elemeket — képet, ikont, címet, bekezdést, gombot —, és feljegyzi, mennyire látszanak és hol állnak.

Hibának számít, ha valami egyetlen képkocka alatt jelenik meg áttűnés nélkül, ha egy már látszó elem három képpontnál többet ugrik, vagy ha a lap egy eleme az első festés után, készen bukkan fel. A mérés az első megnyitásra és a lapváltásra külön fut, mert a kettőnél más van a böngésző gyorsítótárában.

A mérő magát is ellenőrzi: ha a fejléc első megnyitáskori rejtését szándékosan kikapcsolja, a betűcsere ugrását jelentenie kell. Ha nem jelez, a mérés vak, és a futás elbukik.

Egy oldalbetöltés, képkockánként mérve A lapot gép tölti be lassított hálózaton, üres gyorsítótárral, két böngészőmotorban, asztali és telefonos méretben. Minden képkockán megnézi a képernyőn álló elemeket: mennyire látszanak, hol állnak, betöltődött-e a kép, megvan-e az ikon rajza. Hiba, ha valami egy képkocka alatt, áttűnés nélkül jelenik meg, vagy ha egy már látszó elem három képpontnál többet ugrik. A végén önellenőrzés: egy szándékosan kikapcsolt védelemmel a mérőnek jeleznie kell. Az első megnyitás és a lapváltás külön mérés. Lassú net, üres gyorsítótár két böngészőmotor, asztal és telefon Minden képkocka, minden elem átlátszóság, hely, kép, ikon Hiba: ha bevillan egy képkocka alatt, áttűnés nélkül Hiba: ha elugrik 3 képpontnál többet, már látszva Önellenőrzés védelem nélkül a mérőnek jeleznie kell első megnyitás és lapváltás külön · öt lap · két motor
Az első megnyitás és a lapváltás külön mérés: a kettőnél más van a gyorsítótárban, és más villanhat.
  1. 01 Lassú net, üres gyorsítótár két böngészőmotor, asztal és telefon
  2. 02 Minden képkocka, minden elem átlátszóság, hely, kép, ikon
  3. 03 Hiba: ha bevillan egy képkocka alatt, áttűnés nélkül
  4. 04 Hiba: ha elugrik 3 képpontnál többet, már látszva
  5. 05 Önellenőrzés védelem nélkül a mérőnek jeleznie kell

első megnyitás és lapváltás külön · öt lap · két motor

A teszt, amit szándékosan elrontok

Az ellenpróba-szkript ennél a projektnél minden védelmet egyenként, ideiglenesen kiszed a forrásból, lefuttatja a hozzá tartozó tesztet, és elvárja, hogy elbukjon. Ha a teszt ilyenkor is zöld, nem azt méri, amire szántam. A futás után a forrás bájtra pontosan visszaáll, és ezt a szkript ellenőrzi is.

2026 októberére 98 ilyen sor van, 118 cserével. 2026. október 3-án egy nap alatt háromszor fordult elő, hogy egy sor csendben elavult: a kód változott alatta, és a csere helye már nem volt meg. A teljes futás csak a hibás sornál állt meg, a tesztsor nem is látta. Azóta a tesztsor első lépése másodpercek alatt mind a 118 csere helyét ellenőrzi.

A fej beágyazott szkriptjénél ez több lépés: a böngésző csak akkor futtatja, ha a lenyomata (hash) szerepel a biztonsági szabályzatban, így egy visszafordításhoz a lenyomatot is cserélni kell. 2026. október 2-án a fej egy nap alatt ötször változott, és vele minden alkalommal öt, kézzel számolt lenyomat. Azóta az ellenpróba a lenyomatot futáskor számolja ki.

Egy iOS 15-ös iPhone mint célgép

Ennél a honlapnál az egyik célgép egy iOS 15-ös iPhone 6s volt. Ez a régebbi Safari a mai CSS több elemét nem ismeri — például a subgridet vagy az lh mértékegységet —, ezért ahol ilyet használtam, ott előtte tartalék áll, és a megjelenés ugyanaz marad.

A lapváltó áttűnés is emiatt saját szkript. A böngészők beépített megoldását (View Transitions) az iOS 15 és a Firefox nem ismeri, a mérce viszont az volt, hogy minden böngészőben ugyanúgy működjön. A régi lap tartalma 140 ezredmásodperc alatt elhalványul, a fejléc közben áll, az új lap tartalma pedig kiélesedik.

A biztonsági szabályzat, élesben mérve

Az állatorvosi honlap lapjai teljes tartalombiztonsági szabályzattal (Content Security Policy) futnak: idegen szkript nem futhat, a saját beágyazott szkriptek csak a lenyomatukkal. 2026. szeptember 24. óta minden kiadás után egy mérő mindkét böngészőmotorban végigjárja a próbacímet, és egy szándékosan beszúrt idegen szkripttel ellenőrzi, hogy a tiltás tényleg él.

Ami nem nyilvánvaló

A homály, ami nem védett a bevillanás ellen

A betöltéskori kiélesedés egyik változatában a szöveg homályból jött, mégis bevillanásnak hatott. Az ok a görbe volt: az átlátszóság 30 ezredmásodperc alatt 45, 80 alatt 84 százalékig nőtt, és a homály csak utána oszlott. A javított változatban az átlátszóság lágyan indul — 100 ezredmásodpercnél nagyjából 40 százalékon jár —, és vele együtt tisztul a homály.

A menü, amin nem hatott az animáció

Asztali nézetben a menü tárolója display: contents beállítású, vagyis nincs saját doboza. A rá tett belépő animáció ezért nem csinált semmit: a menü egy ütemben ugrott be, miközben a logó és a gombok kiélesedtek. A javítás óta a tároló gyermekei kapják az animációt, a mérő pedig az ilyen elem animációját nem számítja áttűnésnek.

A rejtett ikonkészlet, ami 150 képpontot foglalt

Az ikonok egyetlen, rejtett SVG-készletből jönnek. A hidden attribútum ezen az elemen nem rejtett el semmit: a böngésző erre vonatkozó szabálya a HTML-elemekre szól, az SVG-re nem. A készlet így 150 képpontnyi üres sávot hagyott minden lap alján. Azóta a display: none rejti el, és a mérés a lap alját is nézi.

A Safari, ami kiszámolta, de nem rajzolta újra

A gombok kitöltése eleinte egy regisztrált CSS-változó átmenetére épült (@property), és a háttér vagy a maszk ebből rajzolt. A Safari motorja a változó átmenetét lefuttatta, de a rá épülő festést nem frissítette, így a gombok, a csapatkártyák és a vélemények halványítása egy képkocka alatt ugrott a végére. A számított érték közben azt mutatta, hogy minden rendben. Azóta a kitöltések a böngésző saját, animálható tulajdonságain futnak — méret, kivágás, maszkméret —, és a mozgást WebKitben is képkockán nézem, nem a számított értéken.

A kép, ami betöltés után kifakult

A kezdőlap nyitóképe lassú hálózaton betöltés után áttűnt, majd egy pillanatra 0,99-ről 0,11-es átlátszóságra fakult, és újra előtűnt: a képváltó saját átlátszóság-átmenete a betöltéskor újraindult. A javítás óta a kép a betöltéséig nem átlátszó, hanem láthatatlan (visibility), így a képváltó átmenete el sem indul, és a kép egyszer, egyenletesen tűnik elő.

Kérdések erről a munkáról

Honnan tudod, hogy egy honlap minden telefonon és böngészőben ugyanúgy működik?

Méréssel. Ennél a projektnél minden fontos nézetet gép tölt be két böngészőmotorban — a Chrome-éban és a Safariéban —, asztali és telefonos méretben, nagyítva és lassú hálózaton is. 2026 októberére a tesztsor 37 tételes, és egy teljes futás nagyjából háromnegyed óra. Egy iOS 15-ös iPhone-on is megnézem, mert az a régebbi Safari néhány újabb CSS-megoldást nem ismer, és ott ezek helyett tartalék kell.

Miért villan be egy kép vagy ikon az oldal betöltésekor, és mit lehet ellene tenni?

Leggyakrabban azért, mert később érkezik, mint a szöveg, és abban a pillanatban, amikor betöltődik, egyetlen képkocka alatt jelenik meg. Ennél az oldalnál a kép a betöltéséig láthatatlan marad, utána 400 ezredmásodperc alatt áttűnik; ami a gyorsítótárból már kész, az rögtön áll. Az ikonoknál más volt az ok: a rajzuk a lap legvégén állt, és lapváltáskor 60–130 ezredmásodpercig üresen látszottak, ezért a rajzok a lap elejére kerültek. Mindkettőt képkockánkénti mérés mutatta meg, és azóta a tesztsor minden lapon figyeli.

Mit jelent, hogy a teszteket is teszteled?

Azt, hogy minden védelmet egyenként, ideiglenesen visszafordítok a forráskódban, lefuttatom a hozzá tartozó tesztet, és elvárom, hogy elbukjon. Ha zöld marad, a teszt nem azt méri, amire szántam. Ennél a projektnél 2026 októberére 98 ilyen ellenpróba van; a futás után a forrás bájtra pontosan visszaáll, és ezt a szkript ellenőrzi is. Mivel egy ellenpróba csendben elavulhat, ha a kód változik alatta, a teljes tesztsor első lépése mind a 118 csere helyét gépileg ellenőrzi.

Működhet-e egy új honlap egy régi iPhone-on?

Igen, ha a régi böngésző a tervezéskor is célgép. Ennél a projektnél egy iOS 15-ös iPhone 6s is célgép volt. A régebbi Safari nem ismeri például a subgridet és az lh mértékegységet, ezért ahol ilyet használtam, ott előtte tartalék áll, és a megjelenés ugyanaz marad. A lapváltó áttűnést is emiatt írtam saját szkripttel: a böngészők beépített megoldását az iOS 15 és a Firefox nem ismeri.

Le kell-e állnia a régi honlapnak, amíg az új készül?

Nem. Ennél a projektnél az új oldal egy próbacímen épül, a régitől elkülönítve, a régi pedig a fő címen zavartalanul üzemel. Minden visszajelzés-kör után a próbacímre kerül ki az új változat — 2026. október 4-ig huszonegy —, így a megrendelő minden körben a valódi oldalt nézi. Az átállásra akkor kerül sor, amikor a tartalom végleges.

Összefoglaló

Egy állatorvosi rendelő új honlapja épül 2026 augusztusa óta. A megrendelő diasoros szerkezeti vázlattal és kilenc mintaoldallal kért ajánlatot, a látványt rám bízta, és azt kérte, hogy a régi oldal közben működjön; az új ezért próbacímen épül, ahová 2026. október 4-ig huszonegy változat ment ki. Ami épül, az egyedi téma bővítmény nélkül: 53 PHP-fájl, 9 348 sor, a szöveg a kódtól külön, két nyelven. A mérce az volt, hogy betöltéskor semmi ne villanjon be és semmi ne ugorjon el, minden böngészőben ugyanúgy; ezt képkockánkénti mérés őrzi, az első megnyitásra és a lapváltásra külön, Chromium- és WebKit-motorban, és egy iOS 15-ös iPhone is célgép. 2026 októberére a tesztsor 37 tételes, és 98 ellenpróba ellenőrzi, hogy a tesztek tényleg mérnek: mindegyik egy védelmet fordít vissza, és elvárja, hogy a teszt elbukjon. A mérés találta meg a túl gyorsan felfutó kiélesedést, a lapváltáskor üresen álló ikonokat, a display: contents miatt egy ütemben beugró menüt és a betöltés után kifakuló nyitóképet.

Karner Kristóf

Önálló fejlesztő Budapesten. Ez a munka épp folyik — a kérdéseket a kapcsolat szakaszban megadott címen várom.

← Minden esettanulmány