Bókin um vef­forritun

um 235 mínútna lestími.

Kafli 0: Inngangur

um 12 mínútna lestími.

Bók þessi varð til eftir að höfundur hafði kennt vefforritun við HÍ í nokkur ár án þess að hafa fundið hentuga kennslubók. Markmið bókarinnar er að veita inngang að vefforritun án nokkurrar reynslu af forritun, ásamt því að fara yfir breiddina11 ólíkt því að fara á dýptina, gert er ráð fyrir að lesandi leiti sér frekari þekkingar og vinni verkefni til að byggja dýpri kunnáttu á efninu. á því sem vefforritun er. Eftir að hafa farið í gegnum efnið ættir þú að hafa þekkingu til þess að byggja vefi með HTML, CSS og JavaScript.

Verandi bók um vefforritun eru tenglar mikið notaðir til að vísa fram og til baka og útum allt í ítarefni og þess háttar. Ekki er þörf á að lesa allt ítarefni sem vísað er í, en það getur hjálpað við að byggja upp dýpri skilning á efninu. Reynt er eins og hægt er að nota íslensk orð yfir hugtök þar sem þau eru til. Stuðst er við Íðorðabanka Árnastofnunnar, sérstaklega Tölvuorðasafnið (5. útgáfa 2013) eða íslenskun höfundar.

0.1 Hugtök

Þar sem þessi bók gerir ekki ráð fyrir neinni fyrri reynslu í forritun er vert að fara lauslega yfir nokkur grunnhugtök áður en lagt er af stað.

0.1.1 Talnakerfi & tölvur 

Talnakerfi er kerfi sem notar tölustafi með tölustöfum. Tölvur telja yfirleitt ekki með tugakerfi22 eða tíundakerfi, kerfi sem hefur 10 sem grunntölu og notar tölustafina 09. (e. decimal) eins og í flestum daglegum athöfnum, heldur nota tölvur oftast tvíundakerfi (e. binary): talnakerfi sem hefur grunntöluna 2. Þá eru aðeins tölurnar 0 og 1 notaðar til að tákna allar tölur. Einfölduð ástæða fyrir þessu er að þessi gildi tákna annað hvort á eða af stöður sem hentar tölvum vel.

Einnig kemur fyrir að áttundakerfi (e. octal) og sextándakerfi (e. hexadecimal, oft stytt í hex) séu notuð, þau virka á sama grundvelli. Áttundakerfi notar 0 til 7 til að tákna allar tölur, en sextándakerfi 0 til 9 ásamt a, b, c, d, e og f fyrir tölurnar 10 til 15, engin munur er á því hvort notaðir séu lág- eða hástafir en gæti ætti samræmis.

Ef við erum að vinna með mörg talnakerfi skráum við grunntöluna með undirskrift við töluna sem við erum að vinna með, t.d. 10₂ fyrir tvíundakerfi eða 1₁₀ fyrir tugakerfi. Einnig eru forskeyti33 forskeyti (e. prefix) (eða fortáknun) er þegar einhverju er skeytt fyrir framan, eftirtáknun (e. postfix) er þegar skeytt er fyrir aftan. stundum notuð: 0b fyrir tvíunda, 0o fyrir áttunda, og 0x fyrir sextánda.

Til að breyta tölu úr talnakerfi yfir í tugakerfi margföldum við grunntöluna með hækkandi veldi af grunntölunni frá hægri til vinstri, byrjað á 0, t.d.

0001₂ = 0b0001 = 2³ * 0 + 2² * 0 + 2¹ * 0 + 2⁰ * 1
               = 1₁₀
1011₂ = 0b1011 = 2³ * 1 + 2² * 0 + 2¹ * 1 + 2⁰ * 1
               = 8 + 0 + 2 + 1
               = 11₁₀
1337₈ = 0o1337 = 8³ * 1 + 8² * 3 + 8¹ * 3 + 8⁰ * 7
               = 512 + 192 + 24 + 7
               = 735₁₀
bad₁₆ = 0xBAD  = 16² * 11 + 16¹ * 10 * 16⁰ * 13
               = 2816 + 160 + 13
               = 2989₁₀

0.1.2 Bitar & bæti 

Biti (e. bit, stytting á binary digit44 eða réttara sagt portmanteau.) er gildi sem tekur annaðhvort af eða á stöðu og er oftast táknað með 0 eða 1, af eða á, true eða false.

Bæti (e. byte) er hópur af (oftast!) átta bitum sem getur túlkað 2⁸ = 256 gildi. Fyrir stærð á hlutum í tölvum eru notaðar tvær mismunandi túlkanir:

  • Tíundatúlkun á bætum með SI forskeyti, t.d. 1 kB = 1000 byte (kilobyte) eða 1 MB = 1000² byte (megabyte)
  • Tvíundatúlkun á bætum með IEC forskeyti, t.d. 1 KiB = 1024 byte (kibibyte) eða 1 MiB = 1024² byte (mebibyte)

Ástæðan fyrir þessum mun eru líklega sú að fólk sem vinnur með raunverulega hluti (t.d. rafmagnsverkfræðingar sem hanna vélbúnað) hugsa og vinna almennt í tugakerfi en tölvunarfræðingar í tvíundakerfi. Þetta er líka ástæða þess að ef keyptur er harður diskur sem geymir 1 TB af gögnum geymir hann í raun og veru 1000⁴ byte sem eru 1000⁴/1024⁴ = 0,9095 TiB = 931,323 GiB.

0.1.3 GUI & CLI 

Til þess að eiga í samskiptum við tölvur notum við jaðartæki55 jaðartæki (e. peripheral device) er tæki (t.d. mús eða lyklaborð) sem er tengt við tölvu og leyfir okkur að koma upplýsingum inn í hana., og með þeim komum við skipunum inn í tölvuna í gegnum skel66 því þetta er ysta lag stýrikerfisins. (e. shell). Skelin getur annaðhvort verið grafísk eða byggð á texta.

GUI (Graphical user interface) forrit, eru forrit með grafísku notendaviðmóti: við sjáum uppsett viðmót með myndum, texta, litum og þannig. Við notum þessi forrit yfirleitt með því að smella á viðeigandi hluta viðmóts (með t.d. mús, fingri, eða öðru jaðartæki) og skrifa inn texta. Dæmi um GUI forrit sem við notum mikið í vefforritun eru vafri og textaritill.

CLI (Command-line interface) forrit, eru forrit sem aðeins byggja á texta. Við skrifum inn texta í túlk, skipanalínu (e. command-line), fyrir skelina og fáum til baka línur af texta. Engar myndir eru notaðar (nema þær séu myndaðar með texta, oft kallað ascii art) en litaður texti er möguleiki. Í Windows er hægt að nota cmd.exe. zsh í macOS (í gegnum Terminal), og Bash á Linux.

0.1.4 Textaritlar 

Þegar við vinnum með texta (texta í sínu hreinasta formi, stafir án nokkurs útlits) notum við yfirleitt textaritla. Textaritlar geta verið frá mjög einföldum forritum (t.d. Notepad í Windows) yfir í flókin forrit sem hafa verið til í tugi ára (t.d. Vi og Emacs). Yfirleitt er best að lenda einhversstaðar í miðjunni, með textaritli sem auðvelt er að byrja að nota, en hægt er að bæta við virkni og læra betur á með tímanum.

Textaritlar sem vinsælir eru í dag og mælt er með eru t.d.: Visual Studio Code, frír ritill frá Microsoft; eða Sublime Text, eldri ritill sem getur verið hraðari í stærri verkefnum og í því að vinna með stærri skrár.

Visual Studio Code er smíðaður með veftækni—allt viðmót er útbúið með HTML, CSS og JavaScript! Mjög líklega er það ástæða þess að erfitt getur verið að vinna með stór verkefni eða stórar skrár í þeim.

0.1.5 Stafasett 

Til þess að vinna með stafi og texta í tölvum þarf á einhvern hátt að skilgreina hvernig þeir eru geymdir. Þar sem tölvur vinna helst með tvíundakerfi, eru þau kerfi möppun88 möppun (eða vörpun) er hugtak úr stærðfræði, þar sem föll varpa gildum á milli setta. Í forritun er þetta hugtak oft notað þar sem verið er að vinna með gögn, t.d. möppun á kennitölu yfir í einstakling. á tölu yfir í staf og öfugt. Við það að skrifa staf breytir ritill eða forrit stafnum í viðeigandi tölu í því skjali sem geymir textann.

Með fyrstu stafasettum sem skilgreind voru fyrir tölvur var ASCII (American Standard Code for Information Interchange) sem byggt var á hvernig skipst var á upplýsingum með símskeytum. Í ASCII eru sjö bitar notaðir til að túlka 128 stafi, fyrstu 32 eru stýristafir (e. control characters), stafir sem ekki eiga að birtast (t.d. er 1010₂ notað til að túlka bil), næstu 105 stafir kóða greinarmerki, tölustafi og 26 stafi enskastafrófsins (bæði há- og lágstafi).

Þegar við vinnum með texta í forritun getur það komið fyrir að við viljum birta tákn sem hefur ákveðna virkni í forritunarmálinu. Þá getum við notað lausnarstaf (e. escape character) til að skilgreina lausnarrunu (e. escape sequence) fyrir stafinn. T.d. eru enskar gæsalappir (") oft notaðar til að merkja streng (e. string), texta sem birta á, og \ notaður sem lausnarstafur. Þá getum við búið til lausnarrununa \" innan strengs til að birta ":

"Strengur sem inniheldur ekki gæsalappartákn"
"Strengur sem inniheldur gæsalappartákn með lausnarrunu: \""
"Ógildur strengur sem inniheldur " gæsalappartákn"

Af greinarmerkjum eru nokkur sem við þurfum að vita nokkuð nákvæm skil á:

  • Bil (e. space), stafakóði 0x20 eða 20₁₀, myndaður með að ýta á bilstöngina (e. spacebar). Greinarmerki sem skiptir orðum.
  • Tab, stafakóði 0x09 eða 9₁₀, oft táknað með lausnarrununni \t. Myndað með því að ýta á dálkahnappinn (e. tab key), oftast merktur með . Stýritákn sem færir línu að næsta dálkahaki (e. tab stop).
  • Nýlína (e. newline), stafakóði 0x0A eða 10₁₀, oft táknað með lausnarrununni \n, EOL (end of line), eða LF (line feed). Myndað með því að ýta á vendihnappinn (e. enter key), oftast merktur með . Stýritákn sem skilgreinir nýja línu í texta.
  • Vendistafur99 bókstaflega frá því þegar færa þurfti stöng aftur í byrjun línu á ritvélum fyrir hverja línu. (e. carriage return), stafakóði 0x0D eða 13₁₀, oft táknað með lausnarrununni \r, eða CR (carriage return).

Öll þessi greinarmerki falla undir að vera whitespace1010 auglýst er eftir íslensku orði fyrir whitespace. tákn (eða stýristafir), þau skilgreina lóðrétt og lárétt bil í texta, og eru í langflestum tilfellum ósýnileg. Í forritun geta þau skipt máli.

Það er mismunandi milli stýrikerfa hvort þetta tákn sé myndað þegar ýtt er á vendihnappinn. Windows táknar nýjar línur með bæði nýlínu og vendistaf: CRLF eða \r\n, en Unix kerfi (þ.m.t. Linux og macOS) nota aðeins nýlínu: LF eða \n. Þetta getur valdið vandræðum þegar unnið er með textaskrár á milli stýrikerfa.

Tafla til uppflettingar á US-ASCII kóðum.

Tafla til uppflettingar á US-ASCII kóðum, frá ca. 1970.

Þegar tölvur fóru að vera notaðar utan Bandaríkjanna og þar sem fleiri stafir eru notaðir, voru fundin upp ný stafasett. Fyrir latneska stafrófið voru ISO-8859-1 og Windows-1252 mest notuð á vefnum, þar sem þau gat kóðað allt stafrófið í einu bæti per staf.

Til þess að koma í veg fyrir að hvert stafróf þyrfti sitt eigið stafasett og allan ruglingin tengdan því, var Unicode staðallinn búinn til, með það að markmiði að túlka öll stafróf jarðar ásamt öðrum sértækum stöfum (t.d. tjákn—emoji tákn). UTF-8 er stafasett sem kóðar alla stafi í Unicode og notar til þess allt að fjögur bæti. Fyrstu 128 stafir í UTF-8 eru þeir sömu og í ASCII, þannig að hægt er að opna ASCII skjöl sem UTF-8 án ruglings.

Á vefnum er UTF-8 langmest notaða stafasettið og það sem við notum. Textaritillinn sem við notum ætti að sýna okkur í hvaða stafasetti skjalið okkar er og leyfa okkur að breyta því. Ef við lendum í því að vista efni í textaritli en vafri birtir textann brenglaðan (sér í lagi íslenska stafi, t.d. halló þið sem er textinn halló þið vistaður í UTF-8 en birtur sem ISO-8859-1) er það vegna mismunar á stafasetti sem skjal er vistað í, og þess sem vafri birtir. Það er ekki hægt að greina 100% sjálfkrafa í hvaða stafasetti skjal eða vefsíða er í, við verðum að gera það sjálf til að koma í veg fyrir mögulega brenglun.


0.2 Dæmi og textar

0.2.1 example.org 

Í dæmum þar sem vísað er í vefþjóna og sá vefþjónn sem um ræðir skiptir ekki máli, er hægt að nota example.com, example.org eða example.net. Þessi lénsnöfn eru sérstaklega tekin frá til notkunar í dæmum. Það þýðir að enginn vaktar þau eða tekur við gögnum sem send eru á þau (ólíkt t.d. test.is eða example.is sem eru í eigu einhverra!)

0.2.2 foo & bar

„Orðin“ foo og bar eiga eflaust eftir að skjóta upp kollinum þegar verið er að læra vefforritun. Þegar verið er að skrifa dæmi þar sem einhver texti eða heiti á breytu þarf að koma fram, en heitið sjálft skiptir ekki máli, eru foo og bar (einnig foobar og baz) oft notuð.

Dæmi í JavaScript þar sem foo og bar eru notuð til að sýna samlagningu á tveim breytum, heiti breytanna skiptir engu máli.

const foo = 1;
const bar = 2;
console.log(foo + bar);

There are only two hard things in Computer Science: cache invalidation and naming things.

Að nota þessi heiti fyrir breytur á sér langa sögu, allt frá sjöunda áratugnum og jafnvel alla leið til seinni heimstyrjaldarinnar með skammstöfuninni FUBAR.

Þó svo að þessi breytu heiti hafi lengi verið notuð til að sýna fram á virkni, þýðir það ekki að þetta sé góð hefð. Að nota abstrakt dæmi, ótengda raunveruleikanum hjálpar ekki til við að læra hvernig hlutir virka, höfundur reynir að halda sig frá þessu í dæmum eins og hægt er.

0.2.3 Lorem ipsum 

Annar „gervitexti“ sem skýtur upp kollinum er lorem ipsum, sem er texti sem einnig á sér langa sögu en á prenti. Þegar við vinnum útlit þurfum við oft að hafa mikið af texta til þess að sjá hvernig það mun haga sér. Þá er oft ekki búið að semja lokatextann og er þá lorem ipsum notað. Þessi texti er skemmd útgáfa af latneskum texta sem hefur verið notuð síðan a.m.k. 1960.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Kafli 1: Internetið & vefurinn

um 10 mínútna lestími.

1.1 Internetið & vefurinn

1.1.1 Internetið 

Internetið er alþjóðlegt netkerfi sem samanstendur af hundruðum milljóna tölva tengdra saman yfir tugþúsundir neta. Fyrir samskipti er notaður hópur samskiptaregla, Internet protocol suite sem flokkast í:

  • Tengi lag (link layer), skilgreinir hvernig net eru tengd saman, samskiptareglur sem eru skilgreindar hér eru t.d. ethernet og WiFI.
  • Internet lag, sem skilgreinir hvernig gögn eru send á milli neta, samskiptareglur sem eru skilgreind hér eru t.d. IP tölur.
  • Flutnings lag (transport layer), sem skilgreinir hvernig samskiptum milli tveggja tölva er hagað, t.d. með TCP eða UDP.
  • Forrita lag (application layer), sem skilgreinir ákveðna virkni fyrir endanotanda, t.d. SMTP fyrir tölvupóst, FTP fyrir skráaflutning, eða HTTP fyrir vefinn.

1.1.2 IP tölur 

IP tölur eru notaðar til þess að aðgreina og staðsetja tæki tengd internetinu. Fyrsta útgáfa þeirra eru IPv4 tölur, sem samanstanda af fjórum, tveggja bæta tölum (0–255) sem mynda 32 bita IP tölu11 Þegar þetta er skrifað er t.d. 130.208.165.186 IP talan fyrir vél sem hýsir vef Háskóla Íslands..

Þar sem við eigum mun auðveldara með að muna nöfn en tölur er til kerfi sem þýðir þarna á milli, það heitir Domain Name System eða DNS. Vegna þessa getum við slegið inn hi.is sem er lénsheiti (e. domain name) og DNS þjónar á internetinu láta okkur vita hvaða IP tala á við þann þjón.

Til þess að komast að því hvaða IP tölu ákveðið lén er með (og við höfum aðgang að því) getum við notað ping CLI forritið22 CLI forrit geta tekið við breytum, oftast með - eða -- fyrir framan. Í dæminu er -c 4 að skilgreina að framkvæma eigi fjórar fyrirspurnir.. Það sendir gögn frá tölvu á lén, ef þar á bakvið er tölva fáum við að vita IP tölu hennar. Sú tölva mun senda okkur gögnin til baka og ping forritið mun taka saman hversu langan tíma það tók og hvort öll gögnin hafi komið til baka.

$ ping -c 4 hi.is
PING hi.is (130.208.165.186): 56 data bytes
64 bytes from 130.208.165.186: icmp_seq=0 ttl=55 time=3.497 ms
64 bytes from 130.208.165.186: icmp_seq=1 ttl=55 time=10.125 ms
64 bytes from 130.208.165.186: icmp_seq=2 ttl=55 time=3.607 ms
64 bytes from 130.208.165.186: icmp_seq=3 ttl=55 time=3.913 ms
--- hi.is ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 3.497/5.285/10.125/2.798 ms

Þar sem IPv4 tölur geta aðeins túlkað 2³² = 4.294.967.296 IPv4 tölur er skortur á IP tölum í heiminum og var seinustu IPv4 tölunum ráðstafað í janúar 2011. Til þess að komast hjá þessu var skilgreind ný útgáfa af IP tölum, IPv6 tölur sem geta túlkað 2¹²⁸ IP tölur. IPv6 tölur eru túlkaðar með átta hópum af fjórum sextándakerfis tölum með tvípunkt á milli. Dæmi um IPv6 tölu er 2001:0db8:85a3:0000:0000:8a2e:0370:733433 til eru vel skilgreindar leiðir til að stytta þær, t.d. er 2001:db8::8a2e:370:7334 stytting á dæminu.. Í dag eru bæði IPv4 og IPv6 tölur í notkun á internetinu.

Nokkrar IP tölur og hópar af IP tölum eru fráteknar og geta ekki verið notaðar á internetinu. Dæmi um slíkar tölur eru:

  • 0.0.0.0 óskilgreind IP tala sem er hægt að nota á mismunandi vegu, t.d. til að skilgreina allar leyfilegar IP tölur.
  • 127.0.0.1 til að túlka sjálft tækið sem unnið er á, einnig aðgengileg með localhost DNS nafninu, skilgreint í hosts skrá. Í IPv6 er ::1 þessi tala.
  • 192.168.0.0 – 192.168.0.255 fyrir einkanet, t.d. eru heimilisbeinar oftast með IP töluna 192.168.1.1 og tæki á einkanetinu fá tölur í framhaldi af því, 192.168.1.2 og svo framvegis.

Ef við viljum eiga við hvernig tölvan okkar túlkar IP tölur og lén, getum við yfirskrifað með hosts skrá (/etc/hosts á mac og linux, C:\Windows\System32\Drivers\etc\hosts, til að breyta þarf stjórnandaréttindi). Þessi skrá inniheldur möppun á milli IP tölu og léns, t.d.:

127.0.0.1  localhost
::1        localhost
# Allar fyrirspurnir á hi.is munu fara á okkar
# vél en ekki vefjón HÍ og því ekki virka!
127.0.0.1  hi.is

1.1.3 Vefurinn 

Vefurinn (e. World Wide Web) er aðgengilegur yfir internetið og byggir á vefsíðum sem eiga sér ákveðið URL (Uniform Resource Locator) sem staðsetur þær. Þær eru sóttar yfir HTTP.

1.1.4 Vefþjónn 

Vefþjónn (e. web server) er tölva sem tengd er internetinu og getur tekið við og svarað beiðnum sendum yfir HTTP á ákveðið URL. Vefþjónar hafa IP tölu og geta átt sér skilgreint lén, eða lénsnafn (e. domain name) sem er túlkað með DNS.

Vefþjónar hafa „opin port“, tölulegt staðfang sem skilgreinir hvaða ferli44 ferli (e. process) er tilvik af forriti, það er möguleiki á að sama tölvan keyri mörg tilvik af sama forriti, t.d. ein tölva sem svarar fyrir margar IP tölur. tekur við beiðnum sem koma yfir net. Port 0–1023 eru vel skilgreind og aðeins er hægt að „bindast þeim“ (tengja ferli við port) ef notandi er stjórnandi (eða ofurpaur, e. superuser) á vefþjóni.

Dæmi um vel skilgreind port:

  • 20 fyrir FTP
  • 80 fyrir HTTP
  • 443 fyrir HTTP yfir TLS/SSL (HTTPS), dulkóðuð HTTP samskipti

Oftast þegar forritarar vinna á eigin tölvum með HTTP, er port valið sem er utan vel skilgreindslista, t.d. 3000, þá er hægt að nálgast eigin tölvu með URL http://localhost:3000/.

1.1.5 HTTP 

HTTP stendur fyrir HyperText Transfer Protocol, samskiptareglur sem skilgreina hvernig dreift kerfi tölva vinnur saman yfir vefinn og skiptist á gögnum með hypertext, sem við munum læra meira um í samandi við HTML.

Fyrstu staðlar HTTP voru HTTP 1.0 og síðar HTTP 1.1, sem var formlega staðlaði samskiptareglurnar. Árið 2021 er HTTP/2 notkun að nálgast 50% á vefnum og HTTP/3 er formlega í vinnslu.

1.1.6 URL 

URL staðsetja og skilgreina hvernig við sækjum vefsíður yfir HTTP. Þau samanstanda af:

  • Samskiptareglu (e. protocol), t.d. http eða ftp, tvípunkti & tveimur skástrikum (Tim Berners-Lee sá seinna eftir að hafa sett inn þessi tvö skástrik
  • Vefþjóni, venjulega sem lénsnafn, en hægt að nota IP tölu
  • Hugsanlega tvípunkti og port-númeri, ef ekki er sjálfefna port samskiptareglu notað (port 80 er sjálfgefið fyrir http, port 443 fyrir https)
  • Slóð á vefsíðu
  • Hugsanlega „query-streng“: samansafn af aukaupplýsingum sem sendar eru á vefsíðu með ? fremst og síðan nafn-gildi (e. name-value) með = á milli
  • Hugsanlega „fragment identifier“, staðsetning innan vefsíðu

Dæmi um URL er http://example.org/example.html?start=true#kafli2 sem sækir vefsíðuna example.html á vefþjóninn example.org með http. Aukalega er start breytan send með gildið true. Vafrinn ætti að færa staðsetningu innan síðunnar að auðkenninu kafli2.

Í HTTP staðlinum er talað um URL og URI. Hvert um sig hefur nákvæma skilgreiningu, en munurinn er ekki augljós. Nýr, lifandi staðall, sameinar þessi tvö hugtök undir URL.

1.1.7 Vefsíða 

Vefsíða er sett saman með HTML, CSS og JavaScript og kallast þessi samsetti hluti yfirleitt framendi (e. front-end). Flóknari vefsíður hafa yfirleitt einhvern bakenda. Smíði vefsíðna er helsta viðfangsefni þessarar bókar.

1.1.8 Vafri 

Vafri er forrit sem hefur það hlutverk að sækja vefi sem eiga sér ákveðið URL yfir HTTP á vefþjón. Vafrinn túlkar það HTML, CSS og JavaScript sem vefsíðan inniheldur og birtir notanda.

Vafrar eru flókin forrit sem flestir hverjir geta túlkað milljarða vefsíðna. Þeir birta á skjánum það sem höfundar þeirra ætluðu sér, allt frá fyrstu árum vefsins í kringum 1990 og til þrívíðra leikja sem gerðir eru í dag. Til að geta þetta eru staðlar sem segja til um hvernig túlka eigi HTML, CSS og JavaScript.

Í anda þess hversu opinn vefurinn er höfum við í flestum vöfrum tækifæri til þess að skoða úr hverju hann er smíðaður með því að biðja vafrann um „view source“. Það að hafa aðgang að grunnkóða allra vefja á sama tíma og þeir eru skoðaðir hafði mikil áhrif á það hversu margir einstaklingar fóru að fikta og búa til sína eigin vefi.

1.1.9 Vefforrit 

Vefforrit er ekki vel skilgreint hugtak, en það er yfirleitt notað yfir forrit með ákveðið URL, aðgengilegt yfir vefinn, sem nýtir veftækni (HTML, CSS og JavaScript) til þess að útbúa viðmótið sem notandi sér.

Það að hafa URL er einn helsti styrkleiki vefsins, en með þeim hafa allir vefir ákveðna slóð sem við getum skoðað, deilt, leitað eftir, og nýtt án þess að nokkur miðstýring hafi eitthvað um það að segja, ólíkt t.d. „app stores“ þar sem fyrirtæki segir af eða á um hvort dreifa megi hugbúnaði eða ekki.

Vegna þess hve útbreiddur vefurinn er hafa margir staðlar verið útbúnir til að leysa hin ýmsu verkefni. Mörg forrit—ekki bara vafrar—nýta þessa staðla til að útbúa viðmót. Í dag er því hægt að nota vefforritun til að búa til forrit sem ekki bara birtast í vöfrum, t.d. textaritla, tónlistarforrit, öpp og ýmislegt fleira.

1.1.10 Framendi og Bakendi

Framendi (e. front-end eða client-side) er sá partur vefsins sem notendur sjá og eiga við. Í grunninn er framendi búinn til með HTML, CSS og JavaScript. Til þess að einfalda og flýta fyrir smíðum á stærri og flóknari vefjum eru til margskonar framework eða libraries sem hjálpa. Dæmi um þetta sem eru vinsæl í dag eru React, Angular og Vue. Þó svo að þessi tól geti hjálpað okkur, þurfum við að vita hvað þessi tól gera, og því byrjum við á að læra HTML, CSS og JavaScript, án nokkura hjálpartækja.

Bakendi (e. back-end eða server-side) er sá partur vefsins sem er sendur yfir HTTP til framenda. Bakendinn samanstendur yfirleitt af vefþjóni, forriti sem útbýr framenda og einhverri gagnageymslu (t.d. gagnagrunnur). Vefþjónar geta stutt margskonar forritunarmál (t.d. C# eða Python) og forritunarumhverfi (t.d. .NET eða Django).

Samskipti milli bakenda og framenda fara fram í gegnum HTTP.

Samskipti milli bakenda og framenda fara fram í gegnum HTTP.

Mynd frá höfundi.

Stundum er talað um full stack forritun, en það er þegar forritari er fær í bæði framenda og bakenda forritun.

1.2 Fyrsti vefurinn okkar 

Til að byrja vegferð okkar sækjum við textaritil, opnum hann og búum til nýtt skjal. Hið klassíska til að skrifa er „halló, heimur“ eða „hello, world“ og fá það til að birtast á skjánum. Því getum við afritað eftirfarandi inn í textaritil:

<h1>Halló, heimur!</h1>

og vistað skjalið sem index.html einhversstaðar þar sem við finnum það. Því næst opnum við vafra og með File > Open veljum við skjalið (eða með því að draga skjalið á vafra gluggann) og sjáum textann á skjánum.

Þegar við opnum skjalið svona beint á tölvunni okkar erum við ekki að nýta okkur bakenda eða vefþjón, heldur er vafrinn að opna skjalið beint af tölvunni, það sést á því að skjalið kemur ekki frá http://example.org eða http://localhost heldur file://mappa/index.html eða álíka. Þetta er í fínu lagi í fyrstu en þegar farið er að gera flóknari hluti þurfum við að keyra vefþjón á tölvunni okkar.

Ástæðan fyrir því að við notum index.html er sú að það skjal er notað sem sjálfgefna skjalið þegar mappa er opnuð, t.d. ef við höfum möppu sem heitir about á vefþjóninum okkar á example.org og innan í henni er skjalið about.html. Ef við opnum http://example.org/about fengjum við ekkert upp55 í sumum tilfellum sjáum við skráaryfirlit (e. directory index) sem sýnir allar aðgengilegar skrár og möppur á vefþjón., aðeins ef við opnum http://example.org/about/about.html, hinsvegar ef við nefnum skránna í staðinn index.html myndi vefurinn birtast bæði ef við opnum http://example.org/about og http://example.org/about/index.html.

1.2.1 FTP 

Til þess að koma vefsíðunum okkar yfir á vefþjóna eru nokkrar leiðir, en sú elsta er að nota FTP (File Transfer Protocol) eða SFTP (þar sem S stendur fyrir Secure eða SSH66 Secure Shell (SSH) er samskiptastaðall sem leyfir örygg samskipti yfir óöruggt net). FTP leyfir okkur að opna stað í skráarkerfi vefþjóns og færa skrár fram og til baka.

Frítt og nothæft FTP forrit er t.d. Cyberduck fyrir Mac og Windows. Oft hefur verið mælt með FileZilla en frá og með 2018 hefur óæskilegum hugbúnaði verið dreift með forritinu svo ekki er mælt með að nota það.

Kafli 2: Sagan hingað til

um 14 mínútna lestími.

2.1 Texti & upplýsingar 

Frá örófi alda höfum við sagt hvort öðru sögur: fyrst geymdar í minni einstaklinga, seinna skrifaðar á skinn eða pappír, síðan prentaðar með prentvél Gutenbergs, og fjölfaldaðar í prentsmiðjum.

Prentaður texti er í eðli sínu fastur. Við höfum blaðsíður í ákveðinni stærð sem textinn er prentaður á og eftir það eru engar breytingar mögulegar. En hvað ef svo væri ekki?

Árið 1941 gaf Jorge Luis Borges út smásöguna „The Garden of Forking Paths“ sem segir frá höfundi sem ætlar að skrifa stóra og flókna bók ásamt því að búa til stórt og flókið völundarhús. Síðar kemur í ljós að bókin og völundarhúsið er sami hluturinn, en sagan lýsir heim þar sem allar mögulegar niðurstöður atburða eiga sér stað samtímis. Þessi smásaga er talin kynna fyrst hugmyndina um HyperText.

I had questioned myself about the ways in which a book can be infinite. I could think of nothing other than a cyclical volume, a circular one. A book whose last page was identical with the first, a book which had the possibility of continuing indefinitely.

—Jorge Luis Borges, The Garden of Forking Paths, 1941

Við lok seinna stríðs skrifaði Vennevar Bush greinina „As We May Think“ í Atlantic Monthly þar sem hann lýsir Memex. Þetta Memex tæki leyfir einstakling að halda utan um sitt eigið safn af upplýsingum. Það leyfir flokkun, athugasemdir og tengingar við annað efni svo hægt sé að fletta upp og leita ásamt því að deila með öðrum á einfaldan hátt. Sannkallað töfratæki sem Bush gerði ráð fyrir að myndi gjörbreyta heiminum.

Consider a future device … in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.

—Vannevar Bush, How We May Think, 1945

2.1.1 HyperText & HyperMedia 

Þessar hugmyndir, ásamt öðrum, höfðu mikil áhrif á þróun upplýsingatækninnar. Ted Nelson skilgreindi árið 1963 hugtakið HyperText: texti á stafrænu formi sem inniheldur vísanir þannig að lesandi getur strax fengið aðgang að þeim. Textinn er ekki lengur fastur, heldur teygir hann anga sína út og leyfir lesandanum að stýra sinni eigin leið í gegnum hann. Í raunheimum mætti líkja þessu við „veldu þitt eigið ævintýri“ bækur.

Mynd 1: Ted Nelson

Ted Nelson.

Í „Mother of all Demos“ árið 1968 kynnti Douglas Engelbart til sögunnar NLS („oN Line System“) sem inniheldur meðal annars mús, hypertext, útgáfustýringu (revision control), ritvinnsluforrit, fjarfundarbúnað og fleira sem í dag væri talið til nútímatækni.

Douglas Engelbart kynnir HyperText virkni í NLS, vídeó á YouTube.

Mynd frá YouTube.

The future is already here — it's just not very evenly distributed.

—William Gibson11 William Gibson er rithöfundur sem talinn er hafa skrifað fyrstu (og skilgreint þar með bókmenntagreinina) „cyberpunk“ bókina: Neuromancer.

Til þess að geta útfært í raun hugtakið um HyperText þurfum við einhverja leið til að ljá texta aukna dýpt og skilgreina tengingar, auk lýsingar á textanum sem er setningarfræðilega aðgreind frá textanum sjálfum. Umbrotsmál (e. markup language) leyfir okkur að gera það.

HyperMedia er það hugtak þegar við takmörum efnið okkar ekki aðeins við texta, heldur við fleiri miðla, t.d. myndir og myndbönd. Með fyrstu vinsælu stafrænu kerfunum til að útfæra HyperMedia var HyperCard sem kom út fyrir Machintosh tölvur árið 1987.

2.2 Markup mál 

Við höfum mál sem skilgreinir snið (markup) á textanum. Hægt er að skipta þessum málum í almenna flokka:

  • Létt (e. lightweight) – einföld setningarfræði er notuð til að leyfa aðskilnað á ýmsum grunnhugmyndum texta án þess að draga úr læsileika textans, t.d. útbúa fyrirsagnir eða feitletra orð. Dæmi um létt umbortsmál er Markdown.
  • Stefjað (e. procedural) – snið er innifalið í texta sem leiðbeiningar um sértækar aðgerðir á textanum, t.d. að gera orð feitletrað. Dæmi um stefjuð umbrotsmál eru PostScript og LaTex.
  • Framsetningar (e. presentational) – WYSIWYG (What You See Is What You Get) ritlar, sniðið er falið fyrir notendum í formi skjals, t.d. Microsoft Word.
  • Lýsandi (e. descriptive) – snið gefur texta merkingu sem er óháð birtingu þess, notast er við merkingarfræðilegt (semantic) snið. Leitast er eftir að lýsa eðli textans en ekki útliti hans, t.d. HTML.

2.2.1 Markdown 

Markdown er dæmi um létt umbrotsmál, búið til af John Gruber (í samstarfi við Aaron Swartz22 Aaron Swartz var einnig viðriðinn stöðlun á RSS, einn af stofnendum Reddit, og þáttakandi í gerð Creative Commons. Hann lést fyrir aldur fram, fjallað er um ævi hans í heimildarmyndinni „The Internet's Own Boy: The Story of Aaron Swartz) árið 2004. Markmið þess er að leyfa fólki að skrifa texta með einföldum skipunum sem hægt er að þýða yfir í önnur form (t.d. HTML). Þessi bók er til dæmis skrifuð í Markdown.

Helsti kostur Markdown er að auðvelt er fyrir manneskjur og vélar að vinna með textann. Hægt er að smíða forrit sem þýða úr Markdown yfir í eitthvað annað, t.d. HTML.

# Markdown fyrirsögn
Texti sem inniheldur **feitletraðan** og _skáletraðan_ texta
með [tengli](http://example.org).
* Listi
* af
* orðum

2.3 HTML verður til 

Í kringum 1990 var Sir Tim Berners-Lee (TBL) að vinna hjá CERN sem eðlisfræðingur. Hann skrifaði minnisblað um kerfi sem hann sá fyrir sér að myndi auka möguleika á samvinnu með því að deila skjölum á einfaldan hátt. Í framhaldinu skilgreindi hann HTML: HyperText Markup Language. Sem grunn nýtti hann SGML (Standard Generalized Markup Language , umbrotsmál frá 1986 staðlað hjá ISO) en bætti við það (sjá t.d. í skjalinu „HTML Tags)“ og skrifaði fyrsta vafrann og vefþjóninn sem túlkuðu og birtu HTML (skrifað í Objective-C á NeXT tölvu). Fyrsta vefsíðan varð síðan aðgengileg 23. ágúst 199133 og er enn aðgengileg á sömu slóð í dag, því eins og TBL skrifaði: „Cool URIs don't change.

NeXT tölvan sem Tim Berners-Lee notaði til að skrifa fyrsta vefþjóninn og vafrann. Á tölvu er skrifað „This machine is a server DO NOT POWER DOWN!!

NeXT tölvan sem Tim Berners-Lee notaði til að skrifa fyrsta vefþjóninn og vafrann, nú til sýnis á safni hjá CERN. Á tölvuna er skrifað „This machine is a server DO NOT POWER DOWN!!“.

Uppbygging og þróun fór fram á póstlistum þar sem þeir einstaklingar sem höfðu áhuga gátu tekið þátt og haft áhrif, t.d. stakk Marc Andreessen upp á <IMG> árið 1993 til að geta birt myndir á vefnum og er það ennþá notað í dag. Í kjölfarið komu fleiri vafrar fram á sjónarsviðið, t.d.:

  • Line Mode Browser árið 1992, CLI vafri gefin út á mörgum stýrikerfum. Endurgerður árið 2013, keyrandi í vef: Line Mode Browser 2013.
  • Lynx árið 1992, vafri sem vinnur aðeins í texta, elsti vafrinn enn í almennri notkun.
  • Mosaic árið 1993, fyrsti grafíski vafrinn og talinn vera sá vafri sem gerði vefinn vinsælan. Margt af því sem við þekkjum í vöfrum í dag kom fyrst fram í Mosaic. Þróaður hjá NCSA44 að hluta til með pening sem kom frá löggjöf sem Al Gore kom í gegn árið 1991 til að búa til „information superhighway“.
  • Netscape Navigator 1.0 árið 1994, þróaður m.a. af Marc Andreessen, ári seinna kemur útgáfa 1.1 sem kynnir töflur til leiks.
  • Opera 1.0 og Internet Explorer 1.0 árið 1995.
Skjáskot af Mosaic 3.0 á Windows XP.

Skjáskot af Mosaic 3.0 á Windows XP.

2.4 Staðlar 

Um leið og fleiri einn vafri voru komnir á sjónarsviðið þurfti að skilgreina hvernig HTML virki. Hver vafri um sig getur ekki útfært hlut á annan hátt en aðrir vafrar, eða bætt við sinni eigin, sérstöðluðu virkni.

Stöðlun á HTML 1.0 var fyrst reynd hjá IETF (Internet Engineering Task Force) en komst ekki úr því að vera drög. Útgáfa 2.0 var síðar stöðluð af IETF í RFC 1866 árið 1995. Tim Berners-Lee stofnaði W3C (World Wide Web Consortium) hjá MIT árið 1994 með stuðning frá Evrópusambandinu og DARPA. CERN dró sig þá til hliðar, enda stofnun sem sérhæfir sig í rannsóknum á sviði eðlisfræði, ekki því að vera leiðandi í upplýsingatækni. Allur kóði vafrans og vefþjónsins sem Tim Berners-Lee vann að hjá CERN var settur í almenningseign af CERN árið 1993.

The primary design principle underlying the Web’s usefulness and growth is universality. […] And it should be accessible from any kind of hardware that can connect to the Internet: stationary or mobile, small screen or large.

Frá byrjun hefur víðsýni og frelsi einkennt vefinn. Umferð á netinu hefur að mestu verið hlutlaus, henni er ekki mismunað eftir því hvaðan hún kemur eða hvert hún fer. Ef netið væri ekki hlutlaust gætu þjónustuaðilar farið að gera greinarmun á umferð og skipt henni í hópa. Eftir því í hvaða hóp þú ert getur það t.d. haft í för með sér takmarkanir eða aukinn kostnað.

Tim Berners-Lee á opnunarhátið sumarólympíuleikanna 2012 þar sem hann sendi skilaboðin „This is for everyone“ í sambandi við vefinn.

Frekar má lesa um sögu vefsins í History of the Web og vert er að endurtaka það sem kemur fram þar: „Understanding how an activity started and developed frequently gives a much greater insight into why things are as they are.“

2.5 W3C 

Hlutverk W3C var—og er—að vinna að framþróun vefsins. Það er gert í gegnum vinnuhópa (e. working groups) sem taka að sér ákveðna staðla fyrir tækni vinna að því að staðla þær óstöðluðu hugmyndir eða óstaðlaða virkni sem er til staðar í dag.

Til að vinna þessa staðla eru útbúin forskrift (e. specification eða spec) sem segja til um hvernig hegðun á að vera. Hver sem er getur komið sér í þessa vinnu þar sem W3C eru opin félagasamtök. Flest þau sem vinna að stöðlunum eru þó í vinnu hjá vafrafyrirtækjunum en geta unnið saman á (tiltölulega) óháðum vettvangi að framþróun vefsins. W3C staðlar t.d. HTML, CSS, XML og SVG, en margt annað er þó einnig í stöðlun og vinnslu þar. Ferli stöðlunar er langt (tekur ár eða áratugi!) og strangt hjá W3C en í grófum dráttum er það:

  • Working draft – búið er að safna nægum upplýsingum til að gefa út fyrstu drög af staðli, sem þó er líklegt að munu breytast mikið. Hér um bil hver sem getur lesið og gert athugasemdir við working draft.
  • Candidate recommendation – þroskaðri útgáfa af staðlinum sem tilbúinn er til athugasemda varðandi útfærslu.
  • Proposed recommendation – búið er að taka við almennum athugasemdum og athugasemdum varðandi útfærslu og staðall er tilbúinn til loka samþykktar.
  • W3C recommendation – Þroskaðasta stig staðals, W3C hefur samþykkt hann og mælir með útfærslu hans.

Oft þegar unnið er með staðlaða hluti getur verið gott að lesa yfir staðalinn til að fá nákvæmari tilfinningu fyrir því hvernig hlutir eigi að virka. Þó ber að hafa í huga að staðlar eru skrifaðir fyrir þau sem útfæra vafrana (eða tækin sem birta vefsíður) en ekki höfunda efnis fyrir vafrana eða tækin.

Þetta verður sérstaklega áhugavert þegar unnið er með nýja tækni sem ennþá inniheldur villur, óskilgreinda hluti eða álíka.

2.6 Vafrastríðin 

2.6.1 Fyrra vafrastríðið 

Netscape Navigator 4.0 sem kom út árið 1997 (með stuðning við CSS, JavaScript og DOM) varð gífurlega vinsæll vafri. Uppi voru plön um að næstu útgáfur yrðu ekki ókeypis. Þegar Microsoft fór að dreifa Internet Explorer (IE) ókeypis með Windows í kringum 199755 sem síðar varð kveikja að stórri anti trust lögsókn á hendur Microsoft fór markaðshlutdeild Netscape að dala og hugmyndir um að græða pening á vafranum urðu að engu. Á frekar stuttum tíma tók IE alveg yfir markaðinn á meðan Netscape fór þá leið að endurskrifa Navigator 6.0 að öllu leiti, sem varð þeim kostnaðarsamt. Þetta tímabil er oft nefnt fyrra vafrastríðið.

Markaðshlutdeildir vafra í „Fyrra vafrastríðinu“.

Markaðshlutdeildir vafra í „Fyrra vafrastríðinu“.

Eftir að Netscape tapaði stöðu sinni var fyrirtækið selt AOL en áður en það gerðist var Netscape Navigator gerður open source og Mozilla stofnað sem umsjónaraðili þess verkefnis. Mozilla nafnið er talið vera komið frá Jamie Zawinksi, jwz, og standa fyrir mosaic killer66 PBS gerði heimildarmyndina Coderush um þetta tímabil.

Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.

Í dag lifir Netscape Navigator að einhverju leyti í Firefox, en fyrsta útgáfan kom út árið 2002, þá undir nafninu Phoenix. Útgáfa 1.0 af Firefox kom út 2004.

2.6.2 Vefstaðlar 

Eftir fyrsta vafrastríðið var CSS orðið nógu vel skilgreint til að hægt væri að nota það í vefforritun en illa gekk að fá fólk til að skipta úr því að nota töflur til að setja upp vefi. Mikið var gert úr því að fólk myndi nýta sér töflulausa vefhönnun: að nota CSS til að setja upp vefi en ekki töflur.

Það varð þó breyting á með A List Apart sem varð til sem póstlisti 1997 en varð fljótlega að helsta veftímariti vefbransans og hefur verið það alla tíð síðan. Web Standards Project (WaSP) var stofnað 1998 með það að markmiði að þrýsta á vafra framleiðendur að auka stuðning við staðla og tókst það með útgáfum Netscape Navigator 6 árið 2000 og IE6 árið 2001. Zeldman, áhrifamikill vefmógúll, skrifaði grein í A List Apart 2001, „To Hell with Bad Browsers“, þar sem hann hvatti forritara og fólk sem vann á vefnum til að byrja að nota staðla. Þó svo að margir væru enn að nota gamla vafra sem ekki styddu staðlana þá væri ekki endalaust hægt að halda í þá og nóg væri nóg.

Það var samt ekki fyrr en árið 2003 sem töflulaus vefhönnun varð að alvöru með endurhönnun íþróttamiðilsins ESPN með XHTML og CSS, fyrsti stóri vefurinn til að vera gerður þannig. Vefur tæknitímaritsins Wired hafði þó verið endurhannaður árinu áður en útgáfa hans hafði ekki jafn mikil áhrif. Árið 2003 var CSS Zen Garden einnig stofnað, en það er vefur sem sýnir hvað var/er hægt að gera með CSS. Gefið var HTML skjal og máttu þeir aðilar sem sendu inn hönnun aðeins nota CSS en breyta neinu HTML. Þetta gekk vel og margar mjög framúrstefnulegar og nýtískulegar hannanir voru til sýnis. Árið 2013 var WaSP líka lagt niður með skilaboðunum, „our work here is done“.

ESPN, fyrsti stóri vefurinn til að vera gerður töflulaust.

ESPN, fyrsti stóri vefurinn til að vera gerður töflulaust.

2.6.3 Annað vafrastríðið 

Eftir að hætt var að gera vefi með töflum kom nokkur ládeyða yfir vafraframleiðendur og varð hún svo mikil að Microsoft tilkynnti árið 2003 að IE6SP1 yrði seinasti vafrinn þeirra. Það, ásamt því að hugtakið Web 2.0 var gert vinsælt af Tim O'Reilly, hleypti nýju lífi í markaðinn um 2004. Apple gaf út Safari fyrir Mac OSX, byggðan á KTHML árið 2003. WebKit, „vafravélin“ (e. browser engine) sem keyrir áfram Safari, var árið 2005 gerð open source af Apple.

Fyrsta alvöru vefþróunartólið, Firebug fyrir Firefox, kom út árið 2006 og gjörbreytti því hvernig vefir voru unnir. Í fyrsta skipti var hægt að breyta á einfaldan hátt, beint í vafranum, hvernig vefir höguðu sér. Þetta flýtti fyrir og einfaldaði vinnu vefforritara. IE 7.0 kom einnig út árið 2006, fimm árum eftir IE 6.0.

Hlutdeild vafra 2009-2015.

Hlutdeild vafra 2009-2015.

Með tilkomu iPhone árið 2007 og útgáfu Safari 3.0 á Mac OSX, Windows og iOS, varð vefurinn í fyrsta skipti fyrir alvöru aðgengilegur í símum í „almennilegum“ vafra. Tilraunir til að gera sérstakar vefsíður fyrir iPhone byrjuðu snemma, sérstaklega í ljósi þess að ekki var strax hægt að búa til öpp fyrir iOS.

Google gaf út Chrome vafrann árið 2008, byggðum á Chromium, open source vafra. Chromium var síðan aftur byggður á WebKit. Árið 2013 var Webkit verkefnið forkað77 talað er um fork þegar hugbúnaðarverkefni er tekið og afritað af (yfirleitt) nýjum aðilum sem vilja fara með verkefnið í nýja átt og til varð ný vafravél, Blink sem Chrome notar í dag.

Eitt af því sem hamlaði verulega útbreiðslu nýrrar virkni í vöfrum á fyrstu árum vefsins var það að notendur vafra þurftu stanslaust að sækja nýjar útgáfur af vöfrum. Það gat valdið því að fólk keyrði óuppfærðan vafra í mörg ár og notaði hann til að sinna öllu því sem það þurfti á vefnum, sem aftur gerði það að verkum að flestir stærri vefir urðu að styðja gamla vafra lengur en æskilegt hefði verið. Í dag er þetta minna vandamál þar sem allir vafrar dreifa uppfærslum mjög ört og (í flestum tilfellum) án þess að brjóta neitt á milli uppfærsla. Chrome var fyrsti vafrinn til að gera þetta og er í dag hægt að sækja Chrome Canary eða Firefox nightly sem eru útgáfur af vöfrunum með því allra nýjasta, uppfærð næstum daglega.

Ættartré þeirra vafra sem við notum í dag er orðið frekar flókið og margþætt, en hægt er að skoða það á „evolution of the web“ fyrir vafra frá 1992–2013.

Kafli 3: HTML

um 13 mínútna lestími.

HTML stendur fyrir HyperText Markup Language og er lýsandi umbrotsmál (e. descriptive markup language) með sniði sem leyfir okkur að lýsa textanum okkar og nota HyperText hugtakið. Fyrstu útgáfur voru byggðar á SGML, Standard Generalized Markup Language, sem er ISO staðall sem skilgreinir almennt markup mál fyrir skjöl. Það byggir á tveimur hugmyndum:

  • Snið ætti að vera lýsandi
  • Snið ætti að vera strangt svo auðvelt sé að vinna úr því

Þremur árum eftir að W3C var stofnað var HTML 3.2 staðlað og gefið út sem W3C Recommendation í janúar 1997. Í desember sama ár var HTML 4.0 staðlað og skilgreinir það „nútíma“ HTML11 þó svo að þessir staðlar séu enn við gildi ættum við ekki að nýta þá nema í sögulegum tilgangi..

3.1 HTML element 

Þegar við vinnum með HTML erum við ávallt að vinna með element22 hægt væri að þýða element sem stak, en þar sem þetta er mikið notað hugtak verður enskt heiti notað., sem er einstakur hluti af vef. Hvert element getur innihaldið önnur element, texta, eða ekkert. <p>Halló <strong>heimur</strong</p> er p element sem inniheldur málsgrein (e. paragraph) með textann „Halló “ og strong element (sem gefur til kynna að merking texta innan þess sé mikilvæg) sem inniheldur textann „heimur“.

Út frá þessum reglum (element inniheldur: element, texta, eða ekkert) getum við myndað tré. Tré33 þó þetta sé nefnt tré, er það yfirleitt túlkað öfugt, rótarnóðan er sýnd efst og öll börn flæða niður. er gagnaskipan (e. data structure) sem notað er í tölvunarfræði til að tákna stigskipt (e. hierarchical) gögn með nóðum (e. node) sem eiga sér núll eða fleiri börn (e. children), og aðeins eina rótarnóðu (e. root node). Þetta tré myndar vefinn okkar með því að skipta upp og skipuleggja efnið okkar. Þegar vafri les og þáttar (e. parse) tréð, er búin til forritunarleg útgáfa af þessu tré sem heitir DOM (Document Object Model) tré. Dæmi um undirtré (e. subtree), partur úr stærra tré vefs: við höfum rótarnóðuna <article> sem inniheldur tvö <section> með efni:

<article>
  <section>
    <h2>Fyrirsögn #1</h2>
    <p>Hér er <strong>eitthvað mikilvægt</strong>.</p>
  </section>
  <section>
    <h2>Fyrirsögn #2</h2>
    <p>Lorem ipsum.</p>
    <p>Ut enim ad minim veniam.</p>
  </section>
</article>

þá túlkar það tré:

 <article>
 │
 ├▷ <section>
 │  │
 │  ├▷ <h2> ─▷ Fyrirsögn #1
 │  │
 │  └▷ <p>
 │     │
 │     ├▷ Hér er 
 │     │
 │     ├▷ <strong> ─▷ eitthvað mikilvægt
 │     │
 │     └▷ .
 │
 └▷ <section>
    │
    ├▷ <h2> ─▷ Fyrirsögn #2
    │
    ├▷ <p>  ─▷ Lorem ipsum.
    │
    └▷ <p>  ─▷ Ut enim ad minim veniam.

þar sem við höfum <article> sem rótarnóðu sem á tvö börn sem bæði eru <section> elementnóður, fyrra á tvö börn:

  • fyrirsögn skilgreinda með <h2> (við höfum <h1><h6> element sem skilgreina fyrirsagnir í mikilvægisröð)
  • málsgrein með þremur börnum: textanóðunni Hér er, elementnóðunni <strong> (sem síðan á eitt texta barn), og textanóðunni .

Seinna <section> á þrjú börn, sem öll eru elementnóður með stökum textanóðum. Í heildina eru þetta 16 nóður (þó tæknilega séu þau fleiri því allir strengir sem innihalda whitespace tákn milli elementa eru textanóður, með þeim eru þetta í heildina 25 nóður).

Whitespace tákn (bil, línubil, tab) hafa ekki merkingu í HTML, þannig að ef við notum fleiri en eitt bil eða línubil, þá eru þau felld saman í eitt bil. Ef við viljum setja athugasemdir innan HTML skjals getum við notað sérstakt athugasemda element sem mun aldrei birtast notanda: <!-- no comment -->, en er þó þáttað og til staðar í DOM tré sem athugasemdanóða.

3.1.1 Tög 

Hvert element hefst á byrjunartagi, t.d. <p>. Að sama skapi ættu element í flestum tilfellum að enda á lokatagi, t.d. </p>. Í einhverjum tilfellum hefur element aðeins byrjunartag og er þá möguleiki á að sjálfloka (e. self closing) því (t.d. <hr />) en með tilkomu HTML5 er það ekki krafa (í lagi að skrifa <hr>).

Oft þegar rætt er um HTML er element og tag blandað saman og t.d. talað um p tag þegar það sem átt er við er p element. Þetta er viss smámunasemi en þarna er munur og því æskilegt að tala rétt um hlutina.

Til að mynda tengil (e. hyperlink)—og þar með búið til HyperText skjal—notum við <a> elementið (a stendur fyrir anchor44 heitið anchor kemur til þar sem hugsunin er að elementið festi saman tvö skjöl: „The link starts at the "source" anchor and points to the "destination" anchor): <a href="https://example.org">Lærum HTML</a> inniheldur textann „Lærum HTML“ sem vísar á „https://example.org“ með href55 href stendur fyrir HyperText Reference (sjá nánari athugun á uppruna þessa) attribute (href er ekki krafa, án þess höfum við <a> sem myndar ekki hyperlink). Þetta hugtak er grunnurinn að vefnum, að hægt sé að tengja saman mismunandi vefi, óháð því að einhver „á hinum endanum“ geri neitt, eða að leyfi liggi fyrir.

3.2 HTML attribute 

Til þess að ljá element frekari merkingu getum við bætt við nafn-gildis pari (e. name-value pair)66 almenn gagnaskipan sem skilgreinir færslu sem hefur nafn (t.d. titill) og gildi (t.d. Vefforritun). með því að nota attribute77 gætum þýtt sem eigindi en höldum okkur við enska heitið. sem eru sett á byrjunartagið, t.d. href="https://example.org" sem myndar vísunina sem a element vísar á.

Venjan er, og halda skal sig við það, að skrifa nafnið með ASCII lágstöfum, síðan kemur samasem merki (=) beint á eftir, og þar beint á eftir gildið. Ekki er krafa um að umljúka gildið með gæsalöppum, en til að gildið sé skýrt er það æskilegt. Sum attribute eru aðeins notuð til að kveikja á gildi og er þá nóg að hafa aðeins heitið, t.d. <option selected>. Allar útgáfur sem fylgja eru dæmi um hvernig við eigum ekki að gera:

href ="https://example.org"
href = "https://example.org"
HREF="https://example.org"
Href=https://example.org

Til eru nokkur attribute sem leyfilegt er að setja á öll element, svokölluð global attributes. Af þeim ber helst að nefna:

  • id, skilgreinir auðkenni á element sem notað er til að vísa á það innan síðu með fragment identifier (index.html#auðkenni), í CSS, eða til þess að vinna með í DOM gegnum JavaScript. Á að vera einstakt fyrir element og ekki endurtekið á öðru.
  • class, listi af orð, skiptum með bilum, sem skilgreina flokka sem elementið tilheyrir. Mikið notað í CSS til að velja ákveðin element eða ákveðinn hóp af þeim. T.d. class="button" eða class="button large".

Ef við viljum skilgreina okkar eigin attribute með gögnum á elementi þá notum við data-* attribute. Við getum búið til okkar eigin nafn sem ASCII lágstafa streng án bila með data- forskeyti, t.d. data-document-id="123" eða data-length="2m11s".

3.3 Merkingarfræði

Element mynda ekki eingöngu tré, heldur býr hvert þeirra yfir merkingu—það hefur merkingarfræðilegt gildi (e. semantic value). Við höfum það í huga þegar við smíðum vefina okkar og útbúm þannig merkingarfræðilegt HTML. Við nýtum skilgreinda merkingu þeirra elementa sem til eru í stað þess að nota element sem láta efnið okkar líta „rétt“ út. T.d. væri ekki æskilegt að nota <strong> til að láta texta líta út fyrir að vera fyrirsögn, við notum <h2> eða annað fyrirsagnarelement. Að auki þarf að huga að merkingu þegar við blöndum saman elementum, þar sem ekki allt á við saman.Hvaða merkingu má draga af því að hafa tengil innan tengils (<a href> innan <a href>), eða fyrirsögn innan málsgreinar (<h1> innan <p>)?

Það er sérlega mælst til þess að markup í HTML skjali sé aðeins notað til að tjá merkingu en ekki framsetningu. Framsetningu á gögnum er stýrt með CSS og fáum við því hreina skiptingu á milli efnis og útlits. Mörg element eru til sem skilgreina merkingu en annars er hægt að nota attributes (sér í lagi class sem tengist beint yfir í CSS) til að ljá þeim frekari merkingu.

Með því skilja á milli merkingar og útlits er auðveldara að breyta öðru án þess að hafa áhrif á hitt. Þetta getur einfaldað okkur viðhald og gert breytingar ódýrari en þær annars gætu verið. Merkingarfræði getur líka aukið aðgengi að vefnum okkar, bæði fyrir einstaklinga sem nota lesvafra eða álíka og einnig fyrir vélar sem heimsækja vefinn okkar. Þessar vélar skoða vefinn okkar og draga ályktanir um efnið út frá því hvaða element eru notuð. T.d. Googlebot, Pocket, eða reader view sem sumir vafrar (t.d. Firefox og Safari) útfæra. Vafrinn sem túlkar efnið gæti líka nýtt merkingarfræði okkar til að birta efnið á nytsamlegan hátt sem höfundi hefði ekki dottið í hug. Að lokum notum við merkingarfræðilegt HTML því það er snyrtilegra og faglegra.

Áður fyrr þegar við höfðum ekki CSS, var merkingu og framsetningu blandað óhikað saman. Töflur ásamt ósýnilegum 1x1 myndum (spacer gifs) voru notaðar til að stýra útliti, <FONT> elementið var eina leiðin til að stýra stærð og lit á letri, t.d. með <FONT size="12" color="red" face="Comic Sans MS">Halló heimur!</FONT> sem gerði það að verkum að við fastsettum birtingu í merkingu skjals þegar hún ætti að vera óháð. Ef við vildum síðan breyta leturgerð vefsins þurfti að fara og breyta því á hverjum einasta stað sem hún var skilgreind.

Í dag er búið að fjarlægja öll þau element sem breyttu útliti vefs, eins og <center> og <font>. Einnig er búið að fjarlægja attribute af sama meiði, t.d. align, background, og bgcolor.

Þegar við skrifum HTML, þá skrifum við þannig að það beri merkingu. Við stýrum framsetningu með CSS og reynum eins og við getum að viðhalda hreinni skiptingu milli efnis og útlits. Í byrjun er mikilvægt að hafa þetta í huga, með HTML erum við að byggja upp efnið okkar, ekki að láta það líta vel út. Það kemur með CSS. Ef við viljum að fyrirsögnin sé enn stærri eða minni, þá notum við ekki vitlaus fyrirsagnar element. Ef við viljum fá auka bil, þá setjum við ekki inn óþarfa element til að ná því fram. Við bíðum þar til við lærum réttu handtökin með CSS.

3.3.1 Merkingarfræðileg siðvendni

Við höfum elementin <div> og <span> sem bera í eðli sínu ekki neina merkingu, þau hópa efni saman og draga merkingu sína frá börnum sínum. Þó svo að þessi element beri enga merkingu notum við þau samt í sumum tilfellum. Þegar við förum aðeins að nota þau, þá erum við komin á villugötur. Skil ekki alveg?

Þegar við skrifum HTML þá hugsum við um merkingarfræði og reynum að finna element sem passar við efnið okkar, en eyðum ekki of löngum tíma í að finna hið eina rétta element, notum <div> ef svo ber við. Við töpum okkur ekki í siðvendninni.

3.4 HTML grunnur

Öll HTML skjöl ættu að byggja á ákveðnum grunn elementum:

  • <html> skilgreinir rót HTML vefs og er það fyrsta í hverri vefsíðu, fyrir utan DocType. Á þetta element viljum við alltaf setja lang attribute sem tiltekur megin tungumál vefsins með IETF language tag, t.d. is fyrir íslensku, en-us fyrir ameríska ensku
  • <head> er yfirleitt fyrsta barn <html> og heldur utan um lýsigögn vefsíðu, a.m.k. titil, sem er texti skilgreindur innan <title>, og stafasett.
  • <body> skilgreinir meginmál vefs, element innan <body> mynda það tré sem birt er notanda.

3.4.1 DocType

Öll sniðmál sem byggja á SGML þurfa að tilgreina Document Type Definition (DTD) sem skilgreinir málfræðina sem farið er eftir. Í HTML er þetta sett fram í fyrstu línu skjalsins, í DocType. Fyrir HTML 4, strict útgáfu skilgreinum við:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

Enn í dag þurfum við að skilgreina í hvaða DocType HTML skjölin okkar eru. Ástæðan fyrir því er að vafrar í dag geta ennþá túlkað og sýnt vefi frá því á árdögum vefsins. Þegar enn var verið að skilgreina hvernig HTML var birt í vöfrum var mikið um ósamræmi og á tímabili var ekki hægt að innleiða nýjungar án þess að brjóta þá vefi sem þegar voru til. Þegar nýir vefir voru smíðaðir sem notuðu nýja staðla þurfti að velja sérstaklega að nota þá með því að skilgreina DocType. Ef vefur skilgreindi ekkert DocType var hann birtur í quirks mode, þar sem gert var ráð fyrir að hinir ýmsu kvillar væru til staðar. Hinsvegar ef vefur benti á rétt, staðlað DTD, var hann birtur í standards mode. Með þessari aðferð árið 1996 jókst notkun á CSS talsvert.

3.4.2 Stafasett

Þar sem tölvur geta verið heldur vandlátar á það í hvaða stafasetti við skrifum, þá skilgreinum við það sérstaklega í <head> með því að setja það á charset attribute á <meta>, element sem leyfir okkur að setja fram lýsigögn um skjalið okkar. Í langflestum tilfellum viljum við nota UTF-8.

<meta charset="utf-8">

Í HTML geta sérstakir stafir (e. character entity), verið skilgreindir með &X; þar sem X er:

  • Heiti tákns, t.d. &lt; fyrir minna-enn (<).
  • Code point, í tuga- eða sextándakerfi með # fyrir framan, t.d. &#x00DE; fyrir Þ.

3.5 HTML5

Eftir áhugaleysi W3C á því að þróa HTML áfram (og mikinn fókus á XHTML og XML tengda tækni) tóku nokkrir aðilar sig saman og stofnuðu WHATWG (Web Hypertext Application Technology Working Group) árið 2004, með það að markmiði að vinna áfram að HTML og eðlilegri framþróun vefsins. Þessi vinna fór fram undir nafninu HTML5 þar sem hver sem er gat lagt til breytingar á HTML í gegnum póstlista en takmarkaður hópur ritstjóra stýrði því hvað fór inn í staðal.

Tveimur árum seinna, árið 2006, sá W3C að sér og hélt áfram þróun HTML sem HTML 5. En þar sem það er afskaplega ópraktískt að þróa tvo aðskilda staðla (HTML5 og HTML 5) á sama tíma þá voru þeir blessunarlega sameinaðir í einn HTML5 staðal árið 2007. W3C hætti þróun á XHTML 2.0 árið 2009 og farið var að öllu að þróa HTML5 sem framtíð HTML.

HTML5 Logo

Logo fyrir HTML5.

Árið 2012 tók W3C skyndimynd (e. snapshot) af staðlinum eins og hann leit út hjá WHATWG og fór í þá vinnu að gera staðalinn að W3C staðli. WHATWG hætti hinsvegar að tala sérstaklega um HTML5 og vinnur nú að framþróun HTML í lifandi staðli sem mun aldrei klárast og heldur áfram að þróast án þess að hlutir séu fjarlægðir.

HTML5 byggir hvorki á SGML né XML, en er afturvirkt (e. backwards compatible) fyrri útgáfum af HTML. Stefnan er að auka samvirkni (e. interoperability) og aðgengi að vefnum. Til að vera að fullu samhæft fyrri útgáfum verður HTML5 að skilgreina DocType:

<!doctype html>

Þetta er eina DocType sem við notum, nema við höfum mjög góða ástæðu til annars. Héðan í frá miðast öll umfjöllun við HTML5. Grunnurinn að vefsíðunum okkar verður þá:

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8">
    <title>Halló heimur</title>
  </head>
  <body>
    <p>Halló heimur</p>
  </body>
</html>

3.6 Framtíðin fyrir HTML

Vefurinn er rétt að byrja en hefur samt nú þegar breytt svo miklu. Við sem vinnum við hann munum halda áfram að sjá breytingar; í því hvernig hann breytir þjóðfélaginu okkur og hvernig tæknin smám saman breytist. Vafrar munu halda áfram að batna, möguleikar til að birta flóknari og flóknari hluti munu aukast, t.d.: þrívíð grafík með WebGL, sýndarveruleiki með WebVR, og eitthvað sem okkur hefur ekki ennþá dreymt um.

The web we have right now is beautiful. It shatters the tyranny of distance. It opens the libraries of the world to you. It gives you a way to bear witness to people half a world away, in your own words. It is full of cats. We built it by accident, yet already we're taking it for granted. We should fight to keep it!

Kafli 4: HTML Element

um 27 mínútna lestími.

HTML staðalinn skilgreinir lögleg element og gefur þeim merkingu (e. semantics). Vafrar og önnur forrit sem birta HTML nota þennan staðal og skilgreiningar til þess að birta HTML skjöl. Elementum er gróflega skipt í flokka eftir notkun, þar sem hvert element getur verið í einum eða fleiri flokkum:

Fyrir hvert element skilgreinir staðallinn nokkuð nákvæmlega hvernig elementið hagar sér og hvernig eigi að útfæra. Við sem höfundar11 staðallinn er hugsaður fyrir bæði höfunda vefja—þau sem skrifa HTML—og höfunda vafra—sem túlka HTML og birta. vefja þurfum að skoða skilgreiningu á því hvernig á að nota, þá helst:

Eftir almennum skilgreiningum fylgir textalýsing á notkun elements, ásamt dæmum um notkun.

Þegar við skrifum HTML eru þetta elmentin sem við skoðum m.t.t. merkingarfræði. Til að aðstoða við leit er gott að nota skilgreiningar W3C, „HTML element reference“ frá MDN, eða „The Elements of HTML“ frá W3C.

Út frá merkingu þessara elementa setur vafri grunnútlit, t.d. eru fyrirsagnir stærri, málsgreinar hafa neðri spássíu (e. margin), og tenglar eru blálitaðir með undirstriki. Þessu útliti breytum við síðan með CSS, ekki með því að velja mismunandi (og hugsanlega) vitlaus element!)

Það sem fylgir er yfirferð á helstu elementum HTML.

4.1 Metadata – lýsigögn 

Lýsigögn eru gögn sem skilgreina hvernig efni vefsíðu eigi að birtast, tengir önnur gögn við hana (t.d. CSS skjöl), eða skilgreina stöðu síðu í hópi síðna. Þessi lýsigögn eru ekki birt notanda beint í vafraglugganum og eru oftast skilgreind í <head>.

  • <style> notum við til að fella CSS skilgreiningar beint inn í skjalið án þess að hafa það aðskilið í sér CSS skrá.
  • <title> er það element sem ætti alltaf að skilgreina til þess að setja titil skjals.

Til að mynda tengingu við önnur gögn22 þessi tenging er ekki hyperlink, heldur tenging t.d. við CSS sem skilgreinir útlit, eða JavaScript skrá sem skilgreinir virkni. notum við <link>. Ef rel attribute er sett þá einskorðast <link> við <head>, oftast með href sem vísar í skjal, t.d.

  • rel="stylesheet" skilgreinir vísun í CSS skrá sem sækja skal og birta.
  • rel="next" skilgreinir hvaða skjal sé næst í röðinni, vafrar geta notað þetta sem tillögu að því að sækja það skjal áður en notandi biður um það og þannig flýtt fyrir.
  • rel="prefetch" stingur upp á við vafra að sækja gögn á meðan HTML þáttun fer fram.
  • rel="preload" skilgreinir að merkt gagn verði að vera sótt sem fyrst, gerð gagnsins er skilgreint með as attribute. Með því getum við t.d. skipað vafra að sækja letur33 við sjáum hvernig letrið er notað í yfirferð á CSS. sem notað er sem fyrst og þannig látið það birtast fyrr en seinna (annars væri letrið sótt eftir CSS þáttun.)

Hægt er að setja inn skrá í rót vefsvæðis sem heitir favicon.ico eða sem <link rel="shortcut icon" href="/icon.png"> til þess að fá fram þetta litla táknmynd sem situr yfirleitt vinsta megin í stikunni í vöfrum. Ástæðuna fyrir þessu má rekja allt aftur til 1999 þegar þessari virkni var hálfpartinn laumað inn í Internet Explorer 5.

4.1.2 <meta>

Fyrir almenn lýsigögn notum við <meta>. Við höfum séð hvernig það er notað til að skilgreina stafasett með sérstöku charset attribute. Það má líka nota til að skilgreina önnur lýsigögn en þá skilgreinum við bæði name og content attribute. T.d. fyrir author sem skilgreinir höfund síðu, description sem skilgreinir almenna lýsingu eða generator sem skilgreinir tól sem útbjó síðuna.

4.1.3 <script>

Til að vísa í JavaScript notum við <script> sem annaðhvort inniheldur kóða og vísun í JavaScript skjal sem inniheldur kóðann okkar. Ef við höfum texta innan elements verður sá kóði keyrður þegar þáttari kemur að því. Ef src attribute er skilgreint þá verður skjal sem vísað er í sótt, þáttað og túlkað (kóðinn keyrður) áður en haldið er áfram, það er vegna þess að JavaScript kóði gæti skrifað út HTML. Það er óæskilegt, en möguleiki, svo vafrinn verður að bíða með HTML þáttun. Af þessari ástæðu er <script> oft sett á undan lokataggi fyrir <body>, þá getur vafri birt notanda gögn áður en JavaScript er túlkað. Af sögulegum ástæðum getum við ekki sjálflokað (e. self-closing) <script> elementi, við verðum alltaf að loka með endatagi.

Ef vafri hefur ekki stuðning við, eða slökkt hefur verið á JavaScript virkni er hægt að nota <noscript> elementið. Efni þess er birt aðeins ef JavaScript virkni er óvirk.

4.1.4 Dæmi

Dæmi sem nýtir öll lýsigögn sem minnst er á:

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8">
    <meta name="author" content="NN">
    <meta name="description" content="Dæmi um lýsigögn">
    <link rel="stylesheet" href="styles.css">
    <link rel="preload" href="font.woff2" as="font">
    <link rel="shortcut icon" href="icon.png">
    <title>Halló heimur</title>
  </head>
  <body>
    <p>Hæ!</p>
    <noscript>JavaScript virkni óvirk</noscript>
    <script src="scripts.js"></script>
  </body>
</html>

4.2 Flow – flæði 

Flest element sem við notum í meginmáli vefs, <body>, eru flæði element, mörg þeirra geta einnig verið greinilegt efni (e. palpable content): þau innihalda eitthvað (eru ekki tóm) sem er ekki falið. Nokkur element falla aðeins undir þessa flokka og enga aðra:

  • <address>, skilgreinir upplýsingar um hvernig megi hafa samband við höfund efnis.
  • <blockquote>, skilgreinir hluta í skjali sem vitnað er í frá öðrum stað.
  • <footer> skilgreinir efni um það element sem það er innihaldið í, tilgreinir t.d. höfund, tengt efni, eða hvenær efnið var seinast uppfært.
  • <header> skilgreinir hóp af efni sem kynnir eða veitir leiðsögn um efni.
  • <main> skilgreinir megin efni vefs, þetta element ætti aðeins að koma fyrir einu sinni per vefsíðu.
  • <p>, málsgrein, skilgreinir í flestum tilfellum texta og element sem falla undir orðalag.
  • <pre>, preformatted, texti innan <pre> er óstílaður af vafra og viðheldur bilum og línubilum.
  • Töflur og listar.

4.2.1 <figure>

Þegar við höfum sjálfstætt svæði innan skjals sem við munum vilja vísa í úr öðrum stöðum (hugsanlega með útskýringartexta), getum við notað <figure>. Þetta gæti verið skýringarmynd, graf, eða forritskóði.

Ef útskýringartexti fylgir með, er hann skilgreindur innan fyrsta <figcaption> elements. Efnið sem vísað er í er sett innan elementsins.

4.2.2 <dialog>

<dialog> er notað til að merkja part af vef sem þarf eða krefst aðkomu notanda. Þetta gæti verið skráning á upplýsingum, val á aðgerðum, eða svar við fyrirvara. Oft eru þessar upplýsingar birtar í hamsglugga66 hér vantar betri íslenskun. (e. modal window) þar sem notandi verður að taka afstöðu til þess sem er birt. Í staðli eru skilgreind forritunarskil (e. API) þannig að hægt sé að nýta almenna birtingu (aðallega opna og loka „glugganum“) en eins og staðan er 2021, er þessi virkni ekki útfærð í öllum vöfrum og því ekki nothæf nema með fyrirvörum / fyrirvara.

4.2.3 <div>

Annað element sem fellur undir greinilegt efni er <div>. Þetta element hefur enga eiginlega merkingu, merking þess er skilgreint af því sem það inniheldur. Oft á tíðum grípum við til <div> þegar við hugsum ekki til enda hvaða og hverskonar efni við erum að merkja, oft eru önnur element sem henta betur.

Authors are strongly encouraged to view the div element as an element of last resort, for when no other element is suitable. Use of more appropriate elements instead of the div element leads to better accessibility for readers and easier maintainability for authors.

Þetta þýðir samt ekki að við notum aldrei <div>! Þegar við förum að vinna í að setja útlit á vefina okkar, kemur það oft fyrir að við þurfum auka element og þá er það í mörgum tilfellum <div> element.

4.2.4 Dæmi um flæði element

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8">
    <title>Flæði dæmi</title>
  </head>
  <body>
    <header>
      <h1>DocType dæmi</h1>
    </header>
    <main>
      <p>Í dæmi 1 sjáum við hvernig minnsta HTML skjalið er skilgreint.</p>
      <figure>
        <pre>
          &lt;!doctype html>
          &lt;html lang="is">
            &lt;head>
              &lt;meta charset="utf-8">
              &lt;title>Halló heimur&lt;/title>
            &lt;/head>
            &lt;body>...&lt;/body>
          &lt;/html>
        </pre>
        <figcaption>Dæmi 1: Minnsta HTML skjalið</figcaption>
      </figure>
      <p>Hvernig væri að eiga memex?</p>
      <blockquote>Consider a future device … in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.</blockquote>
    </main>
    <footer>
      <address><a href="samband.html">Hafðu samband</a></address>
    </footer>
  </body>
</html>

Með því að nota <pre> elementið getum við birt HTML kóða, nema til þess að efni þess sé ekki túlkað sem HTML þá setjum við &lt; í stað <.

Dæmið að ofan í vafra, fyrirsögnin DocType dæmi er í stærri leturgerð en rest, dæmi skilgreint innan pre elements er inndregið og í monospaced leturgerð. Texti í footer elementi er minni en rest og tengill fyirir „hafa samband“ er skáletraður, með undirlínu og í bláum lit.

Birting á dæmi í vafra.

Skjáskot frá höfundi.

4.3 Sectioning – kaflar og svæði 

Við uppbyggingu á vef er æskilegt að skipta honum upp í kafla og svæði eftir efnistökum. Kafla og svæða element hjálpa okkur við það:

  • <article>, skilgreinir sjálfstætt efnisatriði innan síðu. Þetta getur átt við grein, athugasemd, eða sjálfstæða virkni innan síðu. Hvert og eitt <article> element getur innihaldið <header> og <footer> element til að skilgreina fyrirsagnir og aukagögn.
  • <aside>, skilgreinir efni sem er að einhverju leyti skylt meginmáli en á þó ekki við á þeim staðí. Þetta gæti verið annað efni á vefnum sem er óbeint tengt efni síðu, auglýsing sem fylgir efninu, eða leiðarvísi um efni greinar eða útdregin tilvitnun (e. pull quote).
  • <nav>, skilgreinir leiðarvísi á vef, eða innan síðu. Innan þess er yfirleitt notaður <ul> listi (af óröðuðum efnisatriðum) til þess að setja fram sjálft efnið.
  • <section>, skilgreinir kafla innan skjals eða síðu, yfirleitt notað til að hópa saman efni undir fyrirsögn.

Áður fyrr voru <div> mikið notuð til að útbúa þessa skiptingu, t.d.

<body>
  <div id="main">
    <div id="header">
      <div id="nav"></div>
    </div>
    <div class="article">
      <div class="section"></div>
    </div>
    <div id="footer"></div>
  </div>
</body>

en í dag getum við notað merkingarfræðilegri element:

<body>
  <main>
    <header>
      <nav></nav>
    </header>
    <article>
      <section></section>
    </article>
    <footer></footer>
  </main>
</body>

4.3.1 Dæmi um kafla og svæði

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8">
    <title>Kafla og svæði dæmi</title>
  </head>
  <body>
    <header>
      <h1>HTML</h1>
      <nav><a href="index.html">Aftur á forsíðu</a></nav>
    </header>
    <article>
      <h2>Grunnur</h2>
      <section>
        <h3>Element</h3>
        <p>Þegar við vinnum með HTML erum við ávallt að vinna með element...</p>
      </section>
    </article>
    <article>
      <h2>Element flokkar</h2>
      <section>
        <h3>Flæði</h3>
        <p>Flest element sem við notum í meginmáli vefs...</p>
      </section>
    </article>
    <aside>
      <p><a href="css.html">Læra CSS</a></p>
    </aside>
  </body>
</html>
Dæmi

Birting á dæmi í vafra.

Skjáskot frá höfundi.

4.4 Heading – fyrirsagnir 

Fyrir þau svæði og þá kafla sem við skilgreinum er æskilegt að setja fyrirsagnir eins og þarf. Í HTML eru fyrirsagnir skilgreindar frá <h1> til <h6>, í minnkandi mikilvægisröð. Út frá þessu er hægt að skilgreina útlínu fyrir vefinn okkar sem hægt væri að horfa á eins og efnisyfirlit.

Merkingarfræðilega hefur <h1> mesta vægið og skilgreinir aðalumfjöllunarefni vefs og ætti aðeins að nota einu sinni á hverri vefsíðu. Þetta getur skipt máli fyrir lesvafra og vélar sem lesa vefina okkar. Þegar við byggjum efni á vef ættum við að skilgreina fyrirsagnir í röð og passa að göt myndist ekki þar sem hoppað er yfir fyrirsögn, t.d. frá <h1> í <h3>.

<main>
  <article>
    <h1>Aðalfyrirsögn, kemur fyrir einusinni</h1>
    <section>
      <h2>Kaflaheiti</h2>
      <h3>Millifyrirsögn</h3>
    </section>
    <section>
      <h3>Ónei, ég ætti að vera h2</h3>
    </section>
  </article>
</main>
Dæmi

Birting á dæmi í vafra. Athugið að sjónrænt mætti túlka að fyrirsagnir séu í réttri röð, en merkingarfræðilega ætti seinasta fyrirsögnin að vera <h2> þar sem hún er í nýju <section>.

Skjáskot frá höfundi.

4.4.1 Útlínur 

Í mörg ár hefur verið óljóst hvernig útlínur virki nákvæmlega, og hvernig þær muni virka. HTML staðallinn skilgreinir reiknirit (e. algorithm) til að útbúa útlínur sem tekur tillit til kafla og svæða. Einnig er <hgroup> element skilgreint sem leyfir að hópa saman fleiri en einni fyrirsögn, t.d. fyrir titil og undirtitil, og láta þá öll fyrirsagnar element vera túlkuð sem einn hóp.

Raunin er síðan sú að engin vafri hefur útfært þessa virkni síðan hún var skilgreind í kringum 2007. Hún veldur ruglingi, og allt lítur út fyrir að hún verði fjarlægð úr staðlinum. Þess vegna ætti ekki að nota <hgroup> eða endurnýta fyrirsagnir (byrja aftur frá <h1>) innan kafla og svæða elementa, heldur skilgreina útlínu yfir allt skjalið. Einnig ætti ekki að nota fyrirsagnar element til að skilgrena undirtitla, aðra mögulega titla og þess háttar.

4.4.2 Svæðarót

Nokkur element mynda svæðarót55 hér vantar betri íslenskun. (e. sectioning root), hugtak sem tengt er útlínum. Þessi element eiga í orði að virka með útlínu reikniritinu og mynda nýja rót þar sem útlína er reiknuð. Í reynd er þetta ekki útfært, en þessi element falla einnig undir aðra flokka og er lýst betur þar:

  • <blockquote>, flæði og greinanlegt.
  • <body>, grunnelement fyrir efni síðu.
  • <details>, flæði, greinanlegt, og gagnvirkt.
  • <dialog>, flæði.
  • <fieldset>, flæði, greinanlegt, og form.
  • <figure>, flæði og greinanlegt.
  • <td>, sjá töflur.

4.5 Phrasing – orðalag 

Texti vefsíðunnar samanstendur af orðalags elementum. Saman renna elementin í setningar sem hafa mismikið af innri elementum, allt frá málsgreinum sem aðeins inniheldur texta yfir í málsgreinar sem hafa orð og setningar með auknu væg og vísanir í annað efni. Mörg af orðalags elementum eru einnig flæði og greinanleg element.

Flest orðalags element eru:

  • <a>, skilgreinir tengil ef href attribute er skilgreint, annars stakt „akkeri“ í texta.
  • <abbr>, skilgreinir skammstöfun, ef title attribute er til staðar verður það að innihalda stöfun á skammstöfuninni44 staðall skilgreinir þetta element fyrir bæðiabbreviation“ og „acronym“ sem eru mismunandi hlutir í ensku, á íslensku er orðið skammstöfun notað fyrir bæði (þó orðið „skammyrði“ sé til)..
  • <b>, þýddi áður fyrr bold, en hefur verið endurskilgreint til að draga athygli að texta án þess að gefa honum aukið vægi.
  • <br>, línubil sem bera merkingu, t.d. í ljóðum. Ættum ekki að nota til að mynda sýnileg bil á milli texta, til þess notum við <p>, eða bil sem eru útlitslegs eðlis, til þess er CSS.
  • <cite>, skilgreinir heiti á verki (t.d. bók, kvikmynd, lagi), ekki höfund þess, þar gætum við notað <b>.
  • <code>, skilgreinir kóða, t.d. brot úr forriti, breytu heiti, eða skráarheiti.
  • <data>, skilgreinir gagnastak sem bæði er læsilegt af manneskjum (sem texti innan elements) og tölvum (sem gildi í value atrribute).
  • <datalist>, sjá umfjöllun um form.
  • <del>, skilgreinir efni sem hefur verið fjarlægt. datetime attribute getur verið notað til að skrá dags, eða dagstíma þegar efnið var fjarlægt.
  • <dfn>, skilgreinir skilgreiningu á hugtaki, hugtakið er merkt með elementi og næsta málsgrein (<p>), skilgreiningar listi, eða svæðis element inniheldur nánari skilgreiningu.
  • <em>, leggur áherslu á texta.
  • <i>, þýddi áður fyrr italic en hefur verið endurskilgreint til að skilgreina texta „í annari rödd“ eða til að merkja texta í öðru máli.
  • <ins>, skilgreinir efni sem hefur verið bætt við. datetime attribute getur verið notað til að skrá dags, eða dagstíma þegar efninu var bætt við.
  • <kbd>, skilgreinir element sem merkir inntak frá notanda, oftast frá lyklaborði.
  • <mark>, skilgreinir texta sem á að merkja eða auðkenna vegna tilvísunnar, t.d. til að benda á eitthvað sem vísað er í öðrum texta, eða merkja leitarniðurstöður í texta.
  • <meter>, skilgreinir mæli þar sem heild og gildi eru þekkt, t.d. hversu mikið pláss er notað á hörðum disk.
  • <progress>, skilgreinir element sem gefur til kynna framvindu, ef value attribute tilgreinir hversu miklu er lokið, hlutfallslega við 1.0 eða af gildi skilgreindu með max attribute. Ef value er ekki skilgreint er framvinda óljós eða í vinnslu, t.d. ef beðið er eftir svari.
  • <q>, skilgreinir tilvitnun innan texta, vísun í hvaðan tilvitnun kemur má skilgreina með slóð í cite attribute.
  • <s>, skilgreinir texta sem á ekki lengur við en við viljum samt ennþá birta upplýsingar um, t.d. ef vara er uppseld.
  • <samp>, skilgreinir sýnishorn, eða úttak úr keyrslu á forriti.
  • <small>, skilgreinir texta sem er „smáa letrið“ eða álíka.
  • <span>, merkir ekkert í sjálfu sér og er skilgreint af börnum sínum, svipar til <div>.
  • <strong>, gefur texta mikið auka vægi.
  • <sub> og <sup>, skilgreinir texta sem er í yfirskrift (e. superscript) eða undirskrift (e. subscript).
  • <time>, skilgreinir tíma eða dagstíma í formi sem er lesanlegt af tölvum.
  • <u>, skilgreinir texta sem fær áherslu án þess að breyta textanum, t.d. til að benda á ritvillu. Stóð áður fyrir underline, ætti að forðast þar sem sjálfgefna birting er undirstrikun sem gæti valdið rugling á textanum og tengli.
  • <var>, skilgreinir breytu, t.d. í forritunarlegu samhengi.
  • <wbr>, skilgreinir mögulega línuskiptingu í orði.
  • Texti, texti án merkingar innan elementa, t.d. <body>halló</body>.

4.5.1 Dæmi um orðalag

Flest element að ofan eru til staðar í eftirfarandi dæmi:

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8">
    <title>Orðalags dæmi</title>
  </head>
  <body>
    <p>
      Í ágúst <del>2020</del><ins>2021</ins>
      (<time>2021-08</time>) hefst kennsla í
      <strong>vefforritun</strong> við
      <em>Háskóla Íslands</em><sup>1</sup>.
    </p>
    <p>
      <dfn id="html">HyperText Markup Language</dfn>
      (<abbr title="HyperText Markup Language">HTML</abbr>)
      er lýsandi <b>umbrotsmál</b> með sniði sem
      leyfir okkur að lýsa textanum okkar,
      og er skilgreint í <cite>HTML staðlinum</cite>.
    </p>
    <pre><code>
let sum = 0;
for (let i = 0; i &lt; 10; i++) {
  sum += i;
}
<mark>console.log(`Summa: ${sum}`);</mark>
    </code></pre>
    <p>
      Kóðinn að ofan leggur saman allar heiltölur frá
      <data value="0">núll</data> til og með
      <data value="9">níu</data> í breytunni <var>sum</var>
      Merkta línan skrifar niðurstöðuna í <i>console</i>,
      sem við opnum með því að smella á
      <kbd>Option + Cmd + i</kbd> á <u>MACOS</u>.
      Skrifað verður: <samp>Summa: 45</samp>.
    </p>
    <p>
      Vaðlaheiðar<wbr>vegavinnu<wbr>verkfæra<wbr>geymsluskúrs<wbr>lyklakippu<wbr>hringur
      er langt orð í íslensku.
    </p>
    <small>
      <sup>1</sup>Það þarf að vera skráður nemanadi í:<br>
      Háskóli Íslands<br>
      Sæmundargötu 2<br>
      102 Reykjavík
    </small>
  </body>
</html>
Dæmi

Birting á dæmi í vafra.

Skjáskot frá höfundi.

4.6 Embedded – innfellt

Þegar við bætum við efni sem kemur annarsstaðar frá, t.d. myndir eða vídeó, þá notum við innfelld (e. embedded) element:

  • <audio> og <video>, sjá gagnvirk element.
  • <canvas>, skilgreinir stað þar sem JavaScript forrit geta birt myndrænt efni, t.d. myndir, gröf, leiki eða þrívítt efni. Notað gegnum JavaScript forritunarskil.
  • <embed>, fellir inn efni sem yfirleitt er ekki „vef“ efni, t.d. úr öðrum forritum eins og Java. Lítið notað.
  • <iframe>, fellir inn aðra vefsíðu eða vef, vísað í með src attribute, innan núverandi síðu.
  • <img> bætir mynd við, vísað í með src attribute, sjá nánar að neðan.
  • <math>, bætir við MathML formúlum. Mismunandi stuðningur er meðal vafra, t.d. styður Firefox flest alla virkni á meðan Chrome styður ekkert (í ágúst 2021).
  • <object> bætir við utanaðkomandi auðlind, sem gæti verið meðhöndluð af vafra ef þekkt eða sem plugin (t.d. Flash). Svipar til <embed> og er lítið notað.
  • <picture>, leyfir ítarlegri stjórn yfir því hvernig mynd er felld inn í síðu, getur birt mismunandi myndir eftir því hve stór skjár er. Þarf alltaf að skilgreina nákvæmlega eitt <img> element sem sér um birtingu á myndinni.
  • <svg>, bætir við SVG (Scalable Vector Graphic) mynd. SVG er myndbirtingaform fyrir skalanlegar myndir (breidd og hæð skipta ekki máli) skilgreint með XML.

4.6.1 Vísað í efni 

Þegar við vísum í efni þurfum við að gefa upp slóð. Þessar slóðir geta verið afstæðar (e. relative) eða nákvæmar (e. absolute). Oftast erum við að nota innfelld element þegar við vísum í slóðir en það á þó líka við t.d. <a href="."> og <link> þegar við vísum í CSS skrár.

Afstæðar slóðir (e. relative paths) eru slóðir sem líta út frá því skjali sem vísað er frá. Ef við erum stödd í index.html skjali og vísað er á img/mynd.jpg er gert ráð fyrir að img/ mappa sé til í sömu möppu og index.html er í.

Ef slóðin byrjar á / er byrjað á að fara „á rótina“ á viðkomandi vef og út frá því leitað að möppum og skjölum. T.d. ef við erum á https://example.org/files/images og vísum af þeirri síðu á /logo.png er leitað að myndinni á https://example.org/logo.png en ef / er sleppt er leitað á https://example.org/files/images/logo.png.

Nákvæmar slóðir (e. absolute paths) eru þær slóðir sem ekki eru afstæðar, þær vísa nákvæmlega í það sem átt er við. Í stað þess að vísa í logo.png vísum við í https://example.org/files/images/logo.png. Kostur við þetta er að vita nákvæmlega við hvað er átt. Á móti kemur sá stóri ókostur að ef slóð breytist þarf að breyta öllum vísunum. Við það að breyta files í assets verða allar slóðir brotnar á meðan að hlutfallslegum slóðum er sama svo lengi sem möppur og skrár haldast þær sömu innbyrðis.

Tvö gildi er hægt að nota þegar verið er að fara á milli mappa en það eru . og ... Stakur punktur . vísar í þá möppu sem við erum í en .. vísar í foreldri.

Ef við gefum okkur eftirfarandi möppur og skrár séu á léninu example.org:

verkefni/
├── img/
│   └── mynd.jpg
└── index.html

þá á eftirfarandi við ef við erum stödd á https://example.org/verkefni/index.html:

  • . vísar í möppuna verkefni/.
  • .. vísar í „rót“ example.org, möppuna sem inniheldur verkefni/.
  • ./img/mynd.jpg, img/mynd.jpg, /verkefni/img/mynd.jpg og ../verkefni/img/mynd.jpg vísa öll á sömu myndina.

Margar af þessum reglum eiga bæði við um vefslóðir og skráakerfi stýrikerfa. Þó er munur þar á, t.d. nota vefslóðir, macOS og linux / til að skipta á milli mappa en í Windows er \ notað.

4.6.2 Myndir 

Í sinni einföldustu mynd þá fellum við mynd með <img src="mynd.jpg">. Þetta er þó ekki nóg, við verðum að hafa alt texta skilgreindan með alt attribute, þetta er text sem veitir textalýsingu á myndinni fyrir þau sem ekki geta séð hana. Sjá nánar í kafla um aðgengi.

Einnig viljum við skilgreina vídd myndarinnar: breidd og hæð hennar með width og height attribute. Þar sem sækja þarf myndina eftir að HTML er sótt, veit vafri ekki vídd myndar fyrr en hún er sótt, síðan er hún felld inn, og gæti þá komið fram „hopp“ í viðmótinu: texti og efni færist til á síðunni.

Þegar við vinnum skalanlega vefi þurfum við einnig að huga að því að birta ekki of stórar myndir ef það er óþarfi. srcset attribute leyfir okkur að skilgreina mismunandi myndir eftir því í hvernig skjá verið er að nota, t.d. skjá með mikla upplausn eða litlum skjá (en hugsanlega með mikilli upplausn!)77 farið betur yfir í umfjöllun um skalanlega vefi.

Það eru einnig til nokkur mismunandi myndaform sem hægt er að birta á vefnum, með <picture> getum við útbúið myndirnar okkar í mismunandi formum og gefið vafra val um hvaða mynd eigi að birta. Hvert myndaform er skilgreint með mime týpu (e. mime type)88 Multipurpose Internet Mail Extensions, staðlað í RFC 6838, skilgreinir hvernig skrá verið er að eiga við. Þar sem mime type er skilgreint er það notað, ekki skráarending til að ákveða hvernig skrá er birt., t.d.:

  • image/jpeg, oftast með skráarendingu .jpg eða .jpeg, format sem notar tapandi þjöppun (e. lossy compression)99 notar ónákvæmar nálganir til að þjappa mynd og tapar þar af leiðandi upplýsingum sem getur leitt til óskýrra mynda. Andstæðan við tapandi þjöppun er taplaus þjöppun (e. lossless).. Hentar vel fyrir ljósmyndir. Stutt af öllum vöfrum.
  • image/png, með skráarendingu .png. Almennara format sem getur gefið skýrari myndir á kostnað stærri skráa. Styður gagnsæi (e. transparency). Stutt af öllum vöfrum.
  • image/gif, með skráarendingu .gif. Styður gagnsæi og hreyfimyndir, geta verið stórar skrár. Stutt af öllum vöfrum.
  • image/webp, með skráarendingu .webp, myndaformat hannað af Google sérstaklega fyrir vefinn. Styður tapandi og taplausa þjöppun, gagnsæi, og hreyfimyndir. Stutt af langflestum vöfrum, um eða yfir 95%.
  • image/avif, nýlegt format sem er opið (ekki þarf að borga fyrir notkun) og mjög skilvirkt. Ekki jafnvel stutt og önnur og þarf að nota með öðrum.

Fyrir hvert format og/eða stærð/upplausn (getum notað media attribute) skilgreinum við <source> element innan <picture>, þar sem vafri velur fyrsta sem á við. Að lokum skilgreinum við eitt <img> element sem er með almennustu útgáfunni af myndinni okkar—sú útgáfa sem verður notuð ef allt annað klikkar. Þetta <img> element er líka það element sem notað er til að birta valda mynd.

<picture>
  <source type="image/avif" src="image.avif">
  <source type="image/webp" src="image.webp">
  <img
    src="image.jpg"
    alt="hér er alt texti skilgreindur"
  >
</picture>

Almennt notum <picture> þegar við:

  • erum með að huga sérstaklega að skilvirkni (e. performance) með því að bjóða upp á margar mismunandi útgáfur, á kostnað þess að þurfa að útbúa margar útgáfur af myndum og halda uppfærðum
  • viljum hafa stjórn yfir birtingu mynda (e. art direction) í mismunandi skjám, t.d. hvernig mynd er skorin í minni skjám

4.6.3 Dæmi um innfelld element

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8" />
    <title>Innfelld dæmi</title>
  </head>
  <body>
    <p>320x320 mynd:</p>
    <img
      src="media/butterfly.jpg"
      width="320"
      height="320"
      alt="Mynd af fiðrildi á blómi"
    />
    <p>Mynd skilgreind með SVG:</p>
    <svg xmlns="http://www.w3.org/2000/svg" width="150" height="75">
      <rect
        x="13"
        y="14"
        width="125"
        height="50"
        rx="50"
        ry="100"
        fill="none"
        stroke="blue"
        stroke-width="5"
      />
    </svg>
    <p>Dæmi um orðalags element, fellt inn í þessa síðu:</p>
    <iframe src="./04.element-phrasing.html"></iframe>
  </body>
</html>
Dæmi

Birting á dæmi í vafra.

Skjáskot frá höfundi.

4.7 Interactive – gagnvirk 

Sum element eru, eða geta verið, gagnvirk fyrir notanda. Þá getur notandi smellt, slegið inn gögn, eða virkjað element á einhvern hátt.

  • <button>, skilgreinir takka, þegar takki er virktur framkvæmist einhver aðgerð, t.d. form með gögnum er sent, form er hreinsað, eða JavaScript virkni keyrir, sjá nánar í næsta kafla.
  • <input> ef ekki með type="hidden", <label>, <select>, og <textarea>: taka við gögnum frá notenda og skilgreina form, sjá nánar í næsta kafla.
  • <embed> og <iframe> eru gagnvirk að því leiti að það sem innfellt er getur verið gagnvirkt.

4.7.1 <audio> og <video>

<audio> bætir við hljóði (í formi skráar) eða hjóðstraum (í formi straums, lifandi hljóðskrá). <video> bætir við myndbandi eða hljóði með texta. Bæði element eru innfelld, en eru gagnvirk ef við skilgreinum leiðir til að stjórna þeim.

Þau attribute sem við getum sett á <audio> og <video> eru t.d.

  • autoplay ef við viljum byrja að spila efni strax og búið er að hlaða því inn.
  • controls ef við viljum sýna sjálfgefnu stýringar sem vafri býður upp. Þessar stýringar eru mismunandi eftir vöfrum. Ef við höfum þetta attribute eru elmentin gagnvirk.
  • loop ef byrja á samstundis aftur að spila efni eftir að það klárast.
  • muted ef notandi þarf að kveikja á hljóði, á vel við ef við ætlum að nýta autoplay.
  • src ef við höfum aðeins eina skrá fyrir hljóð eða myndband.

Fyrir bæði <audio> og <video> getum við skilgreint mismunandi <source>, eins og í <picture> elementinu.

<track> elementið skilgreinir texta sem fylgir hljóði eða myndbandi, annað hvort texti eða skýringartexti1010 texti (e. subtitles) er þegar talað mál hefur textaútgáfu í ákveðnu tungumáli, t.d. enskt tal en íslenskur texti. Skýringartexti (e. captions eða closed captions) er textaútgáfa af öllu viðeigandi hljóði sem kemur fram, t.d. lýsing á tónlist, eða hljóðáhrifum (e. sound effect).. Fyrir elementið skilgreinum við attribute:

  • kind, gerð texta, t.d. subtitles eða captions.
  • src, slóð á texta.
  • srclang, tungumál texta.
  • label, lýsing á texta.

Öll element sem ekki eru <track> eða <source> innan <audio> eða <video> eru aðeins birt ef stuðningur í vafra er ekki til staðar.

<video>
  <track kind="subtitles" src="brave.en.vtt" srclang="en" label="English">
  <track kind="captions" src="brave.en.hoh.vtt" srclang="en" label="English for the Hard of Hearing">
  <track kind="subtitles" src="brave.fr.vtt" srclang="fr" lang="fr" label="Français">
  <track kind="subtitles" src="brave.de.vtt" srclang="de" lang="de" label="Deutsch">
  <source src="brave.webm" type="video/webm">
  <source src="brave.ogg" type="video/ogg">
  <source src="brave.mov" type="video/quicktime">
  <p>Ekki stuðningur við myndbönd.</p>
</video>

4.7.2 <a>

<a>, anchor elementið, með href attribute býr til tengil sem hægt er að nota. Aukalega er hægt að skilgreina attribute:

  • target, opnar tengil í öðru samhengi, oftast target="_blank" til að opna tengil í nýjum glugga.
  • download, býður upp á að hlaða efni niður í stað að vafri fari að því.
  • rel, tenging núverandi skjals við það skjal sem tengt er í, sjá mögulegar gerðir í staðli.
  • hreflang, tungumál skjals sem tengt er í.
  • type, líklegt MIME gildi skjals sem tengt er í.
  • referrerpolicy, skilgreinir hve miklar upplýsingar eigi að láta tengt skjal vita um hvaðan tengt var, getur opnað á öryggisholur og gagnaleka. Sjá möguleg gildi.

Í flestum tilfellum er href attrbute URL sem tengt er á, en einnig er hægt að skilgreina tengla sem opna tölvupóst með mailto: forskeytinu, eða opna síma, með tel: forskeytinu.

4.7.3 <details>

<details> elementið leyfir að skilgreina efni sem hægt er að opna til að fá frekari upplýsingar. Fyrsta <summary> element innan þess skilgreinir samantekt eða yfirskrift, önnur element innan <details> eru aðeins birt ef það hefur verið opnað, eða ef open attribute er til staðar.

4.7.4 Dæmi um gagnvirk element

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8" />
    <title>Gagnvirk dæmi</title>
  </head>
  <body>
    <p>
      <a href="index.html" download>Tengill sem bíður upp á að vista niður HTML skjali</a>
    </p>
    <p>
      <button>Takki sem gerir ekki neitt</button>
    </p>
    <audio controls src="media/t-rex-roar.mp3"></audio>
    <video src="media/big-buck-bunny.mp4" controls autoplay>
    </video>
    <details open>
      <summary>HTML</summary>
      <p>HTML stendur fyrir HyperText Markup Language.</p>
    </details>
    <details>
      <summary>CSS</summary>
      <p>CSS stendur fyrir Cascading Style Sheets.</p>
    </details>
  </body>
</html>
Dæmi

Birting á dæmi í Firefox vafra.

Skjáskot frá höfundi.

Kafli 5: Töflur, listar, og form

um 15 mínútna lestími.

Töflur, listar, og form koma oft fyrir þegar við erum að smíða vefi. Töflur til að vinna með töfluleg gögn, listar til að hópa saman efni, og form til að taka við upplýsingum frá fólki.

5.1 Töflur

Að vinna með töfluleg gögn krefst aðeins flóknari uppsetningar en á öðrum gögnum í HTML. Töflur eru skilgreindar með töflumódeli í staðli: skilgreina þarf töflu, dálka, raði, gagnareiti (e. cell), og hugsanlega fót eða samantekt. Mælst er til að hafa lýsingu á töflum til að auðvelda lestur gagnanna.

  • <table>, skilgreinir töflu af gögnum í fleiri en einni vídd.

  • <caption>, lýsir gögnum í töflu og samhengi þeirra, getur auðveldað töluvert að lesa úr gögnum. Ef skilgreint, er fyrsta element innan <table>.

  • <thead>, hópar saman röðum sem skilgreina fyrirsagnir dálka í töflu. Kemur eftir <caption> ef skilgreint, annars fyrsta element innan <table>.

  • <tbody>, hópar saman röðum sem skilgreina meginmál töflu. Kemur eftir <thead>, ef skilgreint.

  • <tfoot>, hópar saman röðum sem skilgreina „fót“ töflu, samantekt, t.d. samtölur. Kemur eftir <tbody>, ef skilgreint.

  • <tr>, skilgreinir röð í töflu, alltaf innan <table>, <thead>, <tbody>, eða <tfooter>.

  • <td> skilgreinir gagnareit í röð og dálk.

5.1.1 <th> og <td>

<th> skilgreinir gagnareit sem er fyrirsögn, annaðhvort í röð (þá í byjun <tr>) eða dálks (þá í röð af fyrirsögnum innan <thead>).

Við getum skilgreint eftirfarandi attribute:

  • colspan sem tölu, sem skilgreinir hversu marga dálka reitur nær.
  • rowspan sem tölu, sem skilgreinir hversu marga raðir reitur nær.
  • headers, strengur sem vísar í id á þeim elementum sem skilgreina fyrirsögn reitsins. Ef fleiri en eitt element er bil notað til að skipta á milli.
  • abbr, möguleg skammstöfun á fyrirsögn.

Til að tilgreina hvað fyrirsögn á við, notum við scope attribute:

  • row ef fyrirsögn á við þá reiti sem koma á eftir í röðinni.
  • col ef fyrirsögn á við reiti sem eru í sama dálk.
  • rowgroup ef fyrirsögn á við rest af reitum í röð, og raðir fram að næsta rowgroup. Skilgreinir hópun eins og <tbody> en innan raða.
  • colgroup ef fyrirsögn á við rest af reitum í dálk, og dálka fram að næsta colgroup.

<td> skilgreinir gagnasellu (e. data cell) í töflu. Getum skilgreint colspan, rowspan, og headers; eins og fyrir <th>.

5.1.2 Dæmi um töflu

<table>
  <caption>Reikningur fyrir kaupum.</caption>
  <thead>
    <tr>
      <th scope="col">Nr.</th>
      <th scope="col">Vara</th>
      <th scope="col">Lýsing</th>
      <th scope="col">Verð</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th></th>
      <th scope="rowgroup" colspan="3">Símar</th>
    </tr>
    <tr>
      <td>1</td>
      <th scope="row">Takkasími</th>
      <td>Sími með tökkum</td>
      <td>10.000 kr.-</td>
    </tr>
    <tr>
      <td>2</td>
      <th scope="row">Tæknisími</th>
      <td>Sími með tækni</td>
      <td>50.000 kr.-</td>
    </tr>
    <tr>
      <th></th>
      <th scope="rowgroup" colspan="3">Tölvur</th>
    </tr>
    <tr>
      <td>3</td>
      <th scope="row">Tölva</th>
      <td>Fullkomin í vefforritun</td>
      <td>100.000 kr.-</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <td></td>
      <td colspan="2"><strong>Samtals</strong></td>
      <td><strong>160.000 kr.-</strong></td>
    </tr>
  </tfoot>
</table>
Dæmi

Birting á dæmi í vafra.

Skjáskot frá höfundi.

5.2 Listar

Nokkur flæði og greinileg element skilgreina lista af efni.

5.2.1 Raðaðir og óraðaðir listar

<ol> skilgreinir raðaðan lista (e. ordered list) af efni. Ef reversed attribute er skilgreint á listanum eru atriði í lækkandi röð, annars í hækkandi röð. Til að tilgreina annað byrjunargildi en 1 getum við skilgreint heiltölugildi í value attributeinu.

Til að breyta birtingu á merki getum við notað CSS, eða sett type attribute:

  • decimal eða 1 (1-9) (sjálfgefið).
  • lower-alpha eða a (a-z).
  • upper-alpha eða A (A-Z).
  • lower-roman eða i (i-x).
  • upper-roman eða I (I-X).

<ul> skilgreinir óraðaðan (e. unordered list) lista af efni. Litið er svo á að breyting á röð barna skipti engu máli fyrir merkingu listans.

Til að merkja atriði í <ol> eða <ul> listum notum við <li> elementið. Ef það er innan <ol> lista og þarf að skilgreina númer sitt notum við value attribute með heiltölugildi.

Oft er <ul> ásamt <nav> notað til þess að skilgreina valmynd, það oft að <menu> elementið var skilgreint til að gera nákvæmlega það.

5.2.2 <dl>

Fyrir nafngildis (e. name value) lista notum við <dl> (description list). Við skilgreinum eitt eða fleiri nöfn með <dt> (term) og fylgjum því á eftir með einu eða fleiri gildum <dd> (definition). Þetta getum við notað til að merkja t.d. skilgreiningar, spurningar & svör, eða atriðaskrá.

5.2.3 Dæmi um lista

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8" />
    <title>Lista dæmi</title>
  </head>
  <body>
    <nav>
      <menu>
        <li><a href="/">Forsíða</a></li>
        <li><a href="/about">Um</a></li>
      </menu>
    </nav>
    <ol type="I">
      <li>Læra vefforritun</li>
      <li>???</li>
      <li value="99">Gróði!</li>
    </ol>
    <ol start="3" reversed>
      <li>Three</li>
      <li>Two</li>
      <li>One</li>
      <li>Live!</li>
    </ol>
    <dl>
      <dt>HTML</dt>
      <dd>HyperText Markup Language</dd>
      <dd>Búið til af Tim Berners-Lee</dd>
      <dt>CSS</dt>
      <dd>Cascading Style Sheets</dd>
    </dl>
  </body>
</html>
Dæmi

Birting á dæmi í vafra.

Skjáskot frá höfundi.

5.3 Form 

Þegar við viljum fá upplýsingar frá notanda notum við yfirleitt form. Þau leyfa okkur að skilgreina mismunandi tegundir af leiðum til að skrá gögn ásamt aðferðum til að sannreyna þau að einhverju leyti áður en þau eru send.

<form> skilgreinir safn af elementum sem safna gögnum sem hægt er að vinna með, og senda á bakenda til úrvinnslu. Á það er hægt að setja attribute:

  • action, skilgreinir URL sem formið er sent á, þetta er slóð á vefþjón sem kann að taka við og vista gögnin sem voru skráð.
  • autocomplete, skilgreinir hvort vafri eigi að bjóða upp á sjálfvirka útfyllingu. Ef sjálfgefið er að svo sé, (on gildið), slökkvum á með off.
  • enctype, skilgreinir hvernig gögnin í forminu eru kóðuð áður en þau eru send, sjá að neðan.
  • method, skilgreinir hvernig senda eigi gögnin með tilliti til HTTP: post ef gögnin ættu ekki að vera aðgengileg eftir að þau eru send, t.d. skráningar form eða innskráningarform. get ef niðurstaða þess að senda formið ætti að vera aðgengileg sérstaklega, t.d. ef við framkvæmum leit með get, þá verður leitarstrengur aðgengilegur (t.d. /search?query=efni).
  • novalidate, skilgreinir ef keyra eigi staðfestingu (e. validation) á gögnin eða ekki. Sjálfgefið er keyrt, en ef við bætum við novalidate á <form> verður hún ekki keyrð.

5.3.1 enctype

Hvernig nafn-gildis pör eru kóðuð þegar um method="post" er notað, skilgreinum við með enctype:

  • application/x-www-form-urlencoded er sjálfgefið en þá eru gögn URL enkóðuð.
  • text/plain, ekki er átt við gögnin, þau eru sett sem key=value með \n á milli reita
  • multipart/form-data, gögnum er streymt yfir með boundaries, notum þegar við höfum <input type="file"> element og ætlum að taka við skrám frá notanda.

5.3.2 Að taka við gögnum frá notanda

Til að taka við gögnum notum við <input> elementið sem er gagna element eða reitur sem leyfir notanda að slá inn eða eiga við gögn, hefur þó nokkur attribute, t.d.:

  • autocomplete, skilgreinir hvort element eigi að bjóða upp á sjálfvirka útfyllingu. Sjálfgefið er að svo sé, (on gildið), slökkvum á með off.
  • disabled hvort hægt sé að skrá gögn eða ekki.
  • list ef hægt eigi að vera að velja úr fyrirfram skilgreindum lista, skilgreindum með <datalist>.
  • name sem segir til um hvað þessi reitur heitir, mætti hugsa sem breytunafn, notum á bakenda til að ná í gögn frá notanda.
  • pattern er regluleg segð (e. regular expression) sem skilgreinir hvernig gildi skuli formað.
  • placeholder fyrir texta sem er til staðar þar til eitthvað er slegið inn.
  • readonly ef ekki á að vera hægt að breyta gildi í reitnum, aðeins lesa úr honum.
  • required ef innsláttar krafist.
  • type sem skilgreinir hvernig reitur þetta er.
  • value ef reiturinn á að innihalda gildi í byrjun.

type attribute skilgreinir hvernig reiturinn er birtur, í flestum tilfellum bætir eða breytir vafri hvaða innsláttur er í boði út frá þessu attribute.

  • hidden, reitur sem ekki á að birta, geymir upplýsingar sem senda á án aðkomu notanda.
  • text fyrir einfaldan texta.
  • search leitarreitur sem hagar sér eins og texta reitur en bíður yfirleitt upp á að hreinsa gildi með einni aðgerð.
  • tel, reitur sem býst við símanúmeri og birtir því yfirleitt talnalyklaborð.
  • url, reitur sem býst við URL og birtir því yfirleitt textalyklaborð þar sem helstu tákn tengd URL eru til staðar, t.d. /, :, og jafnvel .com.
  • email, reitur sem býst við netfangi og birtir því yfirleitt textalyklaborð þar sem helstu tákn tengd netföngum, helst @.
  • password fyrir reit sem sýnir ekki textann sem hefur verið sleginn inn.
  • date, month, week, time, og datetime-local taka við dagsetningu og birta viðeigandi innsláttarform eftir tegund.
  • number, reitur sem tekur við tölum og birtir yfirleitt viðmót til að hækka eða lækka töluna. min og max attribute skilgreina lágmark og hámark tölunnar, step skilgreinir hversu mikið er hækkað/lækkað í einu.
  • range skilgreinir bil sem hægt er að velja tölu af. min og max attribute skilgreina lágmark og hámark, step hversu langt er á milli hvers staks.
  • color birtir viðmót til að velja lit, gildi verður kóðað sem hex strengur eins og það sem CSS notar, t.d. #000000.
  • checkbox fyrir reit sem er annaðhvort af eða á, fyrir boolean gildi, stýrum hvort sé sjálfgefið virkt með checked attribute.
  • radio reitur, aðeins hægt að velja eitt gildi úr tæmandi lista, þar sem hvert gildi hefur sama name, sjá dæmi að neðan.
  • file fyrir reit sem býður upp á að velja skrá sem skal senda á vefþjón.
  • submit til að senda formið á skilgreint action með method, einnig hægt að nota <button> innan <form>.
  • image skilgreinir takka sem hefur ákveðna mynd, frá því áður en CSS var til, ætti ekki að nota.
  • reset, takki sem færir öll stök í formi aftur í byrjunarstöðu.
  • button, almennur takki, ætti frekar að nota <button>.

Ef við viljum taka við mörgum línum af texta notum við <textarea>. cols skilgreinir fjölda stafa per línu, rows fjölda lína sem skal sýna. Öll börn innan <textarea> birtast sem breytanlegur texti, þar með talið allt HTML.

5.3.3 Fellilistar

Til þess að útbúa fellilista (e. drop-down list) notum við <select>. Hvert gildi sem hægt er að velja er skilgreint í <option> elementi sem er barn <select>, texti þess er birt notanda en ef value attribute er skilgreint er það gildi sent fyrir það gildi. Ef hægt á að vera að velja fleiri en eitt atriði úr listanum er multiple attribute notað. Til að hópa saman gildum getum við sett <option> element innan <optgroup>, það getur haft label attribute fyrir sýnilegt heiti.

Ef við viljum endurnýta lista af gildum eða útbúa lista af tillögum af innslátti fyrir fólk, getum við notað <datalist> elementið. Við skilgreinum id attribute fyrir það og inni í því skilgreinum við möguleika með <option> eins og fyrir <select>. Síðan vísum við í listann með list attribute sem inniheldur id gildið.

5.3.4 Merking reita

Til að merkja reiti notum við <label> sem merkir texta eða heiti við <input>, <select>, <textarea> eða aðra reiti. Ef <label> element inniheldur viðeigandi element er nóg að velja/smella á heitið til að færa fókus í innsetningu. Ef element eru aðskilin notum við for attribute á <label> þar sem gildið er id á <input>, <textarea> eða <select> elementi. Við ættum alltaf að skilgreina <label> þegar við vinnum með form til að auka aðgengi þeirra.

5.3.5 <fieldset>

Fyrir flóknari form getum við notað <fieldset> til að hópa hluta forms saman, t.d. fyrir persónuupplýsingar. Fyrir hvert <fieldset> getum við skilgreint fyrirsögn með <legend>, vafrar hafa sjálfgefna birtingu á því hvernig þetta er birt en við getum breytt því með CSS.

Oftast höfum við a.m.k. einn takka í formunum okkar, takka sem sendir gögnin áfram, til þess notum við <button>. Einnig er hægt að skilgreina type="reset" til að útbúa takka sem endurstillir form, færir alla reiti í upphafsstöðu.

5.3.6 Unnið með gögn

Þegar við tökum við gögnum í gegnum form er yfirleitt unnið með þá áfram, annað hvort í JavaScript eða á bakenda á vefþjóni. Almennt þegar við vinnum með gögn sem notendur geta sent inn viljum við treysta engu. Margar af þeim öryggisholum og málum sem koma upp í vefforritun má rekja til gagna sem koma inn í gegnum form. Þó svo að hægt sé að nota required, type="number", eða pattern attribute; þá er auðvelt að komast framhjá þessu, t.d. með því að nota „devtools“ í vafra til að breyta HTML áður en gögn eru send.

Þetta ber að hafa alltaf í huga þegar unnið er með gögn. Gögn sem koma frá framenda eru í eðli sínu ótraust og gætu innihaldið óæskileg gildi sem gætu valdið óskunda. Því verður alltaf að sannreyna þau þar.

5.3.7 Dæmi um form

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8" />
    <title>Form dæmi</title>
  </head>
  <body>
    <form action="https://www.google.com/search" method="get">
      <label>
        Leitarorð:
        <input type="search" name="q">
      </label>
      <button>Leita með Google</button>
     </form>
     <form action="/skraning" method="post">
      <fieldset>
        <legend>Persónuupplýsingar</legend>
        <label>
          Nafn:
          <input type="text" id="name" required>
        </label>
        <label>
          Sími:
          <input type="text" id="phone"  placeholder="000-0000">
        </label>
        <div>
          <label for="comment">Athugasemdir:</label>
          <textarea name="comment" id="comment"></textarea>
        </div>
      </fieldset>
      <fieldset>
        <legend>Upplýsingar</legend>
        <label>
          <input name="delivery" type="radio" value="mail">
          Senda í bréfpósti
        </label>
        <label>
          <input name="delivery" type="radio" value="email" checked>
          Senda í tölvupósti
        </label>
        <div>
          <label>
            <input name="register" type="checkbox">
            Skrá á póstlista
          </label>
        </div>
      </fieldset>
      <fieldset>
        <legend>Spurningar</legend>
        <div>
          <label for="color">Uppáhaldslitur</label>
          <select id="color" name="color">
            <option value="green">Grænn</option>
            <option value="red">Rauður</option>
          </select>
        </div>
        <div>
          <label for="language">Uppáhaldsmál</label>
          <input id="language" type="text" list="languages">
        </div>
      </fieldset>
      <button type="reset">Byrja upp á nýtt</button>
      <button>Senda</button>
      <datalist id="languages">
        <option value="css">CSS</option>
        <option value="english">Enska</option>
        <option value="html">HTML</option>
        <option value="icelandic">Íslenska</option>
        <option value="english">Japanska</option>
        <option value="javascript">JavaScript</option>
      </datalist>
    </form>
  </body>
</html>
Dæmi

Birting á dæmi í vafra. Val um uppáhalds lit býður upp á nákvæmlega tvö gildi: Grænn eða Rauður. Uppáhaldsmál er hinsvegar texta reitur sem mun bjóða upp að velja úr lista, t.d. ef byrjað er að skrifa j, koma upp möguleikar á að velja Japanska eða JavaScript.

Skjáskot frá höfundi.

Kafli 6: Að skrifa HTML

um 12 mínútna lestími.

Í gegnum árin hafa ýmsar tilraunir verið gerðar til þess að skrifa HTML, bæði þar sem vinnan er sett á höfund og á vafra.

6.1 XML

XML, eða Extensible Markup Language er opið sniðmál sem staðlað er af W3C og hefur það að markmiði að kóða almennar upplýsingar á formi sem bæði er lesanlegt af tölvum og fólki. XML er skilgreint með SGML og notast við element og attribute. Eru því XML og HTML skjöl að mörgu leyti lík, nema að XML nota yfirleitt tög sem draga nöfn sín af verkefninu sem verið er að leysa.

<?xml version="1.0" encoding="UTF-8" ?>
<page>
  <section>
    <heading>Fyrirsögn</heading>
    <content>Efni</content>
  </section>
</page>

XML skjöl verða að uppfylla vissar kröfur um réttmæti til að tölvur geti lesið þau, þau verða að vera gild (e. valid). Ef þau eru það ekki mun XML þáttari sem reynir að búa til DOM tré kasta villu og engu er skilað. XML skjöl verða einnig að byrja á XML skilgreiningu, t.d. <?xml version="1.0" encoding="UTF-8" ?> sem segir til um útgáfa af XML og stafasett sem notað er.

6.2 XHTML

Við lok seinustu aldar var XML mjög vinsæl tækni sem var mikið notuð á internetinu. Þessar vinsældir ásamt því hversu erfitt það gat verið á stundum að þátta HTML (vafrar höfðu byggt inn virkni sem lagaði villur hjá notendum þar sem erfitt getur verið að skrifa HTML alveg kórrétt11 kórrétt er að skrifa nákvæmlega rétt samkvæmt staðlinum, þar sem engar villur er að finna.) urðu til þess að fólk fór að vinna að því að gera útgáfu af HTML sem fór eftir sömu reglum og XML. XHTML, Extensible HyperText Markup Language, var staðlað af W3C og kom útgáfa 1.0 út sem W3C recommendation árið 2000 og útgáfa 1.1 árið 2001.

6.2.1 HTML & XHTML

XHTML er vel formað XML þannig að hægt sé að þátta (e. parse) það með XML þátturum. Þegar búið er að þátta XML skjal höfum við tré sem tölvur geta unnið með.

Þetta þýðir að XHTML gerir kröfur á málfræði sem ekki eru til staðar í HTML:

  • XHTML verður að vera vel formað: <p>Halló <strong>heimur</strong></p> ekki <p>Halló <strong>heimur</p></strong>
  • Tög og attribute í lágstöfum: <p class="a">texti</p> ekki <P CLASS="a">texti</P>
  • Endum alltaf og lokum alltaf elementum <p class="a">texti</p><br/> ekki <p class="a">texti<br>
  • Attribute á elementum alltaf innan gæsalappa og ekki stök: <input class="a" selected="selected">texti</p> ekki <input class=a selected>texti

Þessar kröfur eru ekki til staðar í HTML5. Við fyrstu sýn mætti halda að þessar kröfur séu af hinu góða. Hinsvegar þegar kemur að því að skrifa XHTML og alltaf fylgja þessum reglum, þá fara gallar að koma í ljós.

6.2.2 Gallar við XHTML

Þar sem XHTML á að vera vel formað XML er auðvelt að gera mistök sem valda því að vefur birtist ekki, t.d. ef það gleymist að loka elementi með endatagi, þá hreinlega birtist vefurinn ekki. Í IE6 (vinsælasti vafrinn á þeim tíma sem XHTML var sem mest í umræðunni) var ekki hægt að setja XML skilgreiningu inn í skjalið, þar sem skilgreiningin lét vafrann túlka vefinn í quirks mode.

HTTP hefur leið til að skilgreina hvernig skjal (með MIME type) kemur frá vefþjóni með Content Type skilgreiningu. Fyrir HTML er text\html notað en fyrir XML og XHTML er það application\xml. Margir af þeim vefjum sem voru strangt tiltekið skrifaðar í XHTML/XML voru sendar með vitlausu Content Type til vafra og þ.a.l. túlkaðar á sama hátt og HTML, að hafa vefina skrifaða í XHTML hafði í raun og veru engin áhrif á hvernig þeir voru túlkaðir af vöfrum.

Þó svo að þessi hugsun um að láta alla vefi vera skrifaða rétt og láta vafra framfylgja því, hafi verið rökrétt, þá virkar það ekki í reynd. Mun betra er að stefna að traustleika (e. robustness):

Be conservative in what you do, be liberal in what you accept from others.

XHTML skjal sem er í lagi:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- ef við tilgreinum ekki xhtml xml namespace er vefur birtur sem xml -->
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Í lagi?</title>
  </head>
  <body>
    <p>Halló?</p>
  </body>
</html>

XHTML skjal sem er ekki í lagi og mun ekki birtast:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Í lagi?</title>
  </head>
  <body>
    <p>Halló?</p>
    <p>Bless!
  </body>
</html>

Sérð þú villuna? Í línu 9 er <p> elementi ekki lokað. Fyrir ekki stærri villu er refsað harkalega. Jafnvel í svona litlu dæmi er það ekki strax augljóst hvað vantar. Fyrir risa vefsíður með mikið af efni–sem jafnvel ótæknimenntað fólk vinnur við—er svona lagað afar óæskilegt.

Ef dæmið að ofan er opnað í Chrome kemur upp villa: This page contains the following errors: error on line 10 at column 10: Opening and ending tag mismatch: p line 0 and body. Below is a rendering of the page up to the first error. Eftir það birtist aðeins „Halló?“ ekki „Bless!“.

Birting í Chrome á dæmi um ógilt XHTML.

Skjáskot frá höfundi.

Þó svo að HTML5 skjöl þurfi ekki að vera XML skjöl þá þýðir það ekki að þau séu ekki þáttuð. Það þýðir einfaldlega að flækjustigið við þáttunina er færð frá notanda (verða að skrifa kórrétt skjal) yfir til vafrans.

6.3 Að skrifa HTML (og kóða almennt)

Þegar við förum að skrifa HTML (og annan kóða) lendum við tiltölulega hratt í því að vera að vinna með texta sem passar ekki á einn skjá, eða í eina skrá. Þá fer að skipta máli að vera skipulögð til að reyna eins og við getum að minnka það að fara fram og til baka, halda samræmi, og fleira. Þetta á sérstaklega við ef við erum að vinna í teymi.

6.3.1 Túlkun á HTML & DOM

Þó svo að HTML5 leyfi okkur að skrifa allskonar HTML þá viljum við halda vissu stigi af snyrtimennsku, því eins og sagt er, kóði lýsir innri manneskju. Þær leiðir sem við notum til að skrifa snyrtilegt HTML eru aðallega að:

  • Fylgja (yfirleitt) þeim kröfum sem XHTML setur á málfræði.
  • Passa upp á inndrátt, þar sem bil og nýjar línur eru ekki mikilvæg í HTML þá getum við leyft okkur að nýta þau til að mynda snyrtilegt HTML.

Ef við skoðum minnsta HTML5 skjalið sem hefur allt það sem við þurfum til að skilgreina grunnvef:

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8">
    <title>Halló heimur</title>
  </head>
  <body>
    <p>Hæ!</p>
  </body>
</html>

þá getum við skilgreint það sem snyrtilegt HTML sem auðvelt er að lesa fyrir manneskjur. Sömu merkingu fáum við út úr eftirfarandi:

<!doctype html><HTML lang=is>
<head><meta charset="utf-8">
<title>Halló heimur!</TITLE>
<BODY><p>Hæ!

sem við gætum sagt að sé subbulegt. Vafranum er þó sama, bæði dæmin eru merkingarfræðilega nákvæmlega eins.

Til þess að sjá hvernig vafri túlkar HTML, getum við nýtt okkur „developer tools“ (eða „dev tools“) í vöfrum. Þá opnum við tólið, veljum „Elements“ í Chrome eða „Inspector“ í Firefox. Vafrinn þáttar bæði dæmi í sama DOM (Document Object Model) tréð, fyrir utan bil og nýja línu sem sett er fyrir lokun á <p>.

Dæmi

Samanburður á hvernig Chrome túlkar „snyrtilegt“ og „subbulegt“ skjal.

Skjáskot höfundar úr Chrome.

Þannig að HTML sem við skrifum er ein útgáfa (sú sem við sjáum með „view source“) en sú sem vafrinn birtir er önnur og er sú útgáfa kölluð DOM. Sú útgáfa getur breyst, t.d. ef við fjarlægjum eða bætum við elementum með JavaScript.

6.3.2 Snyrtilegt HTML & villur

Það er gott að rifja upp Postel’s law og vera traust og öguð. Að skrifa snyrtilegt HTML getur hjálpað okkur við að losna undan hvimleiðum villum. T.d. skiptir máli hvar element lokast miðað við önnur element.

<title>Halló heimur!
<body><p>Hæ!

Hér er <title> ekki lokað og því mun það efni sem kemur á eftir verða túlkað innan þess, og vefurinn okkar ekki líta út eins og við myndum vilja. Vafrinn mun ekki taka fram fyrir hendurnar á okkur hér og loka <title> fyrir okkur. Af hverju? Það er ekki augljóst hvar eigi að loka því, hugsanlega viljum við hafa HTML í titlinum, vafrinn hefur enga leið til að túlka það.

<ul class="first">
  <li>Fyrsta stak í fyrsta lista
  <ul class="second">
  <li>Fyrsta stak í öðrum lista
  <ul class="third">
  <li>Fyrsta stak í þriðja lista</li>
  <!-- hér vantar að loka </ul>! -->
  </li>
  </ul>
  </li>
  <li>Annað stak í fyrsta lista</li>
</ul>

Ef við lokum of mörgum <div>, gleymum að loka <ul>, eða gerum aðrar villur mun vafrinn ekki birta HTML eins og við viljum og merking vefsins okkar breytist.

Að auki eru ákveðnar reglur um það hvaða element má vera innan annars elements, hver er t.d. merking þess að hafa málsgrein innan málsgreinar, <p><p>Halló heimur!</p></p>? Í staðlinum er þetta skilgreint innan „content model“ hluta hvers elements.

6.4 Linting

Hugtakið linting á við þegar við höfum forrit sem athugar kóðann okkar og láta vita af mögulegum villum. Þessar villur geta verið tvenns konar:

  • Mögulegar villur sem kæmu upp við keyrslu, t.d. <ul> lokað of oft eða of snemma í HTML eða óskilgreindri breytu í JavaScript. Fyrir túlkuð forritunarmál eins og JavaScript getur þetta gripið villur sem þýðandi í þýddum forritunarmálum grípur fyrir okkur (t.d. eins og í Java)
  • Brotum á kóðastíl verkefnis, þeim stíl sem við höfum sammælst um að nota eða tólið mælir með

Þessi forrit nýta static analysis á forritskóðanum okkur (hvort sem það er HTML, CSS, eða eitthvað annað forritunarmál). Forritin eru ekki keyrð, heldur eru þau þáttuð og borin saman við reglur forritunarmálsins og hugsanlega sérsniðnar reglur sem teymi hefur sett sér.

Þegar við vinnum í verkefnum með öðrum geta litlir hlutir í uppsetningu kóða hægt og rólega farið að skipta máli. Því getur verið mjög gott að skilgreina hvernig við skrifum forritin okkar og nýta lintera og álíka tól til að framfylgja þeim ákvörðunum. Dæmi um hvað við stöðlum gæti verið:

  • Hvernig við meðhöndlum inndrátt, notkun á tabs eða spaces.
  • Hámarkslengd lína, ef línur verða mikið lengri en 100 stafir geta komið upp vandamál (t.d. að bera saman kóðabreytingar, lesa kóða á minni skjám/minni gluggum).
  • Í hvaða röð CSS eigindi eru röðuð.

Til að aðstoða okkur við að skrifa snyrtilegt og rétt HTML eur til linting (eða validation) forrit (eða þjónustur) sem túlka HTML sem við gefum því og láta vita af villum sem eru til staðar. W3C rekur þá mest notuðu á https://validator.w3.org/ en þar getum við sent inn slóð á vef eða kóða til athugunar. Ef við sendum inn:

<!doctype html><html lang="is">
<title>Halló heimur!
<body><p>Hæ!

fáum við til baka lista af villum, eitthvað í líkingu við:

1. Error: End of file seen when expecting text or an end tag.
At line 3, column 12
BODY><p>Hæ!
2. Error: Unclosed element title.
From line 1, column 22; to line 2, column 7
tml><HTML>↩<title>Halló

Einnig bjóða flestir textaritlar upp á aukapakka (plugin) sem birta linting villur meðan við skrifum og flýta þannig fyrir því að við skrifum snyrtilegan og góðan kóða.

6.4.1 Tabs VS spaces

Eitt af hinum helgu stríðum forritunarheimsins er hvort nota eigi tab eða space til að draga inn kóða. Þá er ekki verið að meina tab og space lyklana á lyklaborðinu sjálfu heldur hvort eigi að nota bil, (kóði 32 í ASCII) staf eða tab staf (kóði 9 í ASCII, eða \t). Þetta stríð hefur verið ýkt í poppmenningu og oft notað til að gantast með forritara.

Rök fyrir notkun (og ekki notkun!) á tab er að hægt er að skilgreina nákvæmlega hversu langt bil eitt tab (sjálfgefið er það yfirleitt birt sem fjögur bil) býr til á meðan að bil er alltaf nákvæmlega jafn langt. Sumir vilja að lína sé inndregin um ca. 2 bil, aðrir um 4. Forritunarumhverfi sem unnið er í hefur yfirleitt einhverja ákveðna stefnu sem flestir fylgja, t.d. í JavaScript heiminum eru tvö space yfirleitt notuð en í C# eitt tab.

Hvort heldur sem notað er skiptir ekki mestu máli, en það sem skiptir máli er að hafa samræmi í inndrætti á öllum kóða. Að blanda saman tab og space í kóða getur orðið mjög ruglandi og ætti að forðast í allra lengstu lög.

<div>
    <p>Halló tab</p>
  <p>Halló spaces</p>
  <ul class="first">
      <li>Fyrsta stak í fyrsta lista
          <ul>
            <li>Fyrsta stak í öðrum lista</li>
        </ul>
    </li>
      <li>Annað stak í fyrsta lista</li>
    </ul>
</div>

Ýkt dæmi með blönduðum bilum og tabs. Athugið að birting hér þýðir tab yfir í fjögur bil.

6.5 HTML & vafrinn

Eins og nefnt hefur verið, þá les vafrinn (eða annað forrit sem túlkar HTML) vefsíðuna okkar og þáttar (e. parse) í DOM (Document Object Model) sem síðan er birt. Í þessari þáttun er þó fleira sem gerist:

  • Hvert <script> element er sótt (vísar í JavaScript), þáttað og keyrt. Á meðan þetta fer fram er vafri ekki að halda áfram með þáttun á HTML, þessi aðgerð blokkar22 blokkar að því leiti að annað bíður þar til þessum lið er lokið með öllu..
  • Hvert <link> element sem vísar í skjal er sótt og þáttað, t.d. CSS skrár.
  • Öll innfeld (e. embedded) element eru fundin og sótt, stærð þeirra skiptir máli fyrir layout.
  • Úr þáttuðu HTML og þáttuðu CSS er búið til render tree.
  • Vafri reiknar út layout, hvar öll element eigi að birtast á skjánum, reiknuð er hæð og breidd á öllu í pixlum.
  • Að lokum eru pixlar teiknaðir á skjáinn og viðmótið okkar birtist.

Þetta þýðir að röðun og stærð skráa sem við notum skipta máli. Ekki verður farið nánar í það, en það er eitthvað sem þarf sérstaklega að hafa í huga þegar farið er að vinna í stærri verkefnum sem nýta mikið af innfelldu efni, CSS, og JavaScript virkni.

Kafli 7: Aðgengi

um 11 mínútna lestími.

Aðgengi (eða stafrænt aðgengi) og aðgengismál (e. accessibility eða a11y, 11 stafir eru milli fyrsta og seinasta stafs) er oft tengt við það að „fatlað fólk“ geti notað vefina okkar en það er frekar takmörkuð sýn á aðgengi. Aðgengi snýst um að fólk geti notað vefina okkar. Við getum öll orðið „fötluð“ tímabundið, hvort sem það er vegna slyss sem setur okkur í gips á annarri hönd eða þreytu sem veldur því að erfitt sé að rýna í texta.

Í gegnum tíðina hefur það oft verið þannig að barátta fyrir auknu aðgengi skilar sér í betri heim fyrir okkur öll. Fyrir raunheima er þetta tekið saman í hugtakinu „algild hönnun“ eða „Universal Design“ sem stefnir að því að öll hönnun sé aðgengileg öllu fólki, alltaf. Gott dæmi um þetta eru niðurtektir (e. curb cuts) á gangstéttum, lækkun sem upphaflega var ætluð hjólastólum en í dag hentar mun fleiri aðilum, t.d.: fólki með barnavagna, sendlum, og fólki sem dregur ferðatöskur.

Sem fagaðilar ættum við auk þess ekki að mismuna fólki og það mun aðeins aukast að lög verði sett sem banna mismun, hvort sem hún er viljandi eða ekki eða að þessum lögum verði framfylgt með sektum. Því er það að segja „en fólk með fötlun mun ekki nota vefinn okkar“ lítið annað en afsökun fyrir því að huga ekki að virkni sem bætir vefinn fyrir alla.

P has Multiple Sclerosis, which affects both her vision and her ability to control a mouse. She often gets tingling in her hands that makes using a standard computer mouse for a long period of time painful and difficult.

7.1 WCAG

Að útfæra vef með grunn aðgengi í huga er ekki erfitt en getur verið dýrt að gera eftir á. W3C heldur úti staðli, Web Content Accessibility Guidelines 2.1. WCAG byggir á fjórum prinsippum um aðgengi á vefnum:

  1. Perceivable: Upplýsingar og notendaviðmót verða að vera sett upp þannig að notendur geti skynjað þau.
  2. Operable: Notendaviðmót og leiðsögukerfi (e. navigation) verða að vera nothæf.
  3. Understandable: Upplýsingar og notkun á notendaviðmóti verða að vera skiljanleg.
  4. Robust: Efni verður að vera nógu traust þannig að það geti verið túlkað áreiðanlega af breiðum hóp tækja, þar með talið hjálpartækjum.

Útfrá hverju prinsippi eru leiðbeiningar um hvernig stuðla megi að aðgengi, 13 í heildina. Fyrir hverja leiðbeiningu eru skilgreind árangursviðmið (e. success criteria) sem falla í einn af þrem flokkum:

  • A, minnsta stig, grunn aðgengi.
  • AA, það stig sem við ættum að stefna að.
  • AAA, öll skilyrði uppfyllt.

Til að aðstoða okkur við að útfæra vefi sem standast tilmæli WCAG er hægt að fylgja Techniques for WCAG 2.1, sem útlistar aðferðir til að uppfylla WCAG með lýsingu og prófanalýsingum, t.d. Using alt attributes on img elements.

7.1.1 Aðgengi á Íslandi

Engin lög eru til staðar um aðgengi að vefjum á Íslandi, en stjórnvöld hafa beint þeim tilmælum til opinberra aðila að ná WCAG2.0 AA:

Íslensk stjórnvöld hafa beint þeim tilmælum til opinberra aðila að leiðbeiningum alþjóðlegu staðlasamtakanna Worldwide Web Consortium (W3C) sé fylgt hér á land. WCAG 2.0 AA leiðbeinir um hvernig ganga skuli frá vefefni þannig að það sé aðgengilegt öllum.

Birkir Rúnar sérfræðingur í aðgengismálum á vef, birti árið 2013 nokkrar greinar á vef Advania þar sem hann fór yfir stöðu aðgengismála á Íslandi:

Ástæðurnar fyrir því að gera aðgengisumbætur á vefjum eru margvíslegar en mikilvægasta grunnástæðan fyrir góðu aðgengi er ætíð sú sama. Hún er einfaldlega sú að með góðu aðgengi er verið að gera kraftaverk í lífi einhvers hvort sem það er einhver sem þið hafið aldrei hitt, einhver sem er ykkur kær, eða jafnvel framtíðarútgáfa af sjálfum ykkur.

7.1.2 Að smíða vef með aðgengi í huga

Þegar við smíðum vef eru nokkur atriði sem við getum sérstaklega haft í huga og eru þau sett hér fram í engri sérstakri röð. Þetta er ekki tæmandi listi, heldur einföld ráð til að útbúa aðgengilegri vefi.

Skilgreina lang attribute á <html> til að skilgreina á hvaða máli vefurinn er og er það notað t.d. af lesvöfrum til að velja tungumál.

Ef við höfum vef með fleiri en einu tungumáli getum við sett lang á þau element sem innihalda texta á öðru máli en rest af vefnum:

<html lang="is">
  <body>
    <p>Halló, heimur!</p>
    <p lang="en">Hello, world!</p>
  </body>
</html>
  • <html> skilgreinir rót HTML vefs og er það fyrsta í hverri vefsíðu, fyrir utan DocType. Á þetta element viljum við alltaf setja lang attribute sem tiltekur megin tungumál vefsins með IETF language tag, t.d. is fyrir íslensku, en-us fyrir ameríska ensku

Oftast eru þetta einföld gildi, t.d. is fyrir íslensku eða en fyrir ensku. Þar sem tungumál eru flókin, getur þetta gildi verið flókið. Eftirfarandi er löglegt:

<html lang="en-GB-Cyrl-u-kn-true-x-unproof-t-jp-032-Zxxx-x-matsu">

Titill vefs, <title> er það fyrsta sem skjálesarar lesa og skal því vera lýsandi. Ekki ætti að nota sama titil á allar síður og ekki nota óljós eða of almenn orð. <title>Lærum vefforritun – forsíða</title> frekar en <title>Forsíða</title>.

Takmarka skal notkun á efni sem birtist aðeins þegar mús er haldið yfir (hover, sveimað) elementi, þar sem það felur almennt efni fyrir notendum, getur valdið rugling þegar smellt er og er ekki nothæft á snjalltækjum. Að láta hluti birtast þegar sveimað er yfir getur oft verið ódýr og fljótleg lausn þegar birta þarf mikið af upplýsingum, t.d. í valmynd, en það getur líka verið löt lausn.

Fyrir vídeó með töluðu máli getur verið mjög dýrmætt að bæta við texta. Fólk með slaka heyrn, fólk sem talar ekki málið eða þau sem ekki geta einhverra hluta vegna kveikt á hljóði græða öll. Hægt er að nýta <video> element með <track> elementi sem barni til að bæta við vtt skjali með texta. Þó að það sé ekki tæknilega flókið getur það verið afskaplega tímafrekt.

<video controls>
  <source src="video.mp4" type="video/mp4">
  <track label="English" kind="subtitles" srclang="en" src="subs.vtt" default>
</video>

Skrifa ekki of flókinn texta, í of löngum línum eða með of smáu letri, þarsem texti er í eðli sínu það sem við notum til að miðla upplýsingum okkar. Því er mikilvægt að vanda frágang og birtingu hans.

Passa að nota ekki liti og litasamsetningar sem geta reynst erfiðar, þá bæði að litamótstaða (contrast) sé góð (hægt að nota tól eins og Color Contrast Checker) og að nota ekki litasamsetningar sem geta reynst litblindum erfiðar (Color Oracle er tól sem hermir eftir litblindu)

Skilgreina alt texta á myndir með <img alt="lýsandi texti fyrir mynd"> og ef mynd er aðeins til skrauts, skilja eftir tómt. Alt textinn er birtur ef mynd nær ekki að hlaðast, eða lesinn af lesvöfrum í samhengi við efni. Forðast í lengstu lög að hafa myndir af texta. Skjálesarar taka fram þegar alt texti er lesinn svo það er óþarfi að byrja textan á „mynd af…“ eða álíka.

Stundum er title atttibute ruglað saman við alt, og þá sérstaklega þegar óskað er eftir að fá tooltip, eða texta sem birtist þegar mús stoppar yfir elementi.

Nota fyrirsagnir rétt og í röð, frá <h1> til <h6> eins og farið var í að ofan <- burt með seinasta. outline og ekki mörg h1

Skrifa lýsandi texta þegar við búum til tengla, ekki smella hér. Oft á tíðum er texti tengils lesin sérstaklega í lesvöfrum og ætti því að innihalda eins mikið samræmi og hægt er. <p>Hægt er að eyða öllu með því að <a href="…">smella hér.</a>.

Fyrir vefi með stórar valmyndir sem koma á undan efni (í HTML kemur valmynd á undan, óháð birtingu), ætti að útbúa tengil alveg efst sem vísar beint í efni (svokallaður „skip navigation link“). Þennan tengil má fela með CSS þannig að skjálesarar finni hann aðeins og bjóði notendum upp á að sleppa við að fara í gegnum alla valmyndina og beint í efnið.

Breyta sem minnst af grunnhegðun vafra, t.d.

  • Ekki banna að zooma vefi því okkur finnst það ekki koma vel út
  • Banna að pastea í lykilorða reiti
  • Útfæra nýja virkni fyrir virkni sem innbyggð er, t.d. búa til sérstaka valmynd í staðinn fyrir að nota <select>

Nota sjálfvirk tól til að hjálpa til en ekki treysta í blindni, t.d.

Þessi tól keyra „static analysis“ og bera saman við vel skilgreind viðmið, öll blæbrigði í útfærslu okkar týnast, þó þau séu aðgengileg, jafnvel aðgengilegri.

Góð leið til að prófa aðgengi vefs er að sleppa því að nota mús og sjá hvort við getum gert allt sem hægt er á vefnum. Margir nota ekki mús eða álíka og reiða sig að miklu leyti á lyklaborðið. Í þessu samhengi viljum við ekki fjarlægja sjónræn merki um hvar fókus er, þegar farið er í gegnum vef með því að nota Tab lykil á lyklaborðinu ætti alltaf að sjást hvaða gagnvirka elementi er valið.

tabindex

7.1.3 ARIA

Annar staðall frá W3C sem kemur að aðgengi er Accessible Rich Internet Applications. Þessi staðall skilgreinir auknar merkingar á element sem skjálesarar geta nýtt til að bæta upplifun. Hann gefur til kynna til hvers ákveðin svæði eru og hvert hlutverk þeirra er með role attribute. T.d. að innan einhvers elements sé leiðarkerfi með role="navigation" eða að það innihaldi leit með role="search".

Með ARIA getum við einnig skilgreint auka upplýsingar um element, t.d.:

  • aria-expanded="true" — element er opið eða lokað, t.d. trjávalmynd
  • aria-describedby="label" — element er útskýrt af því sem er í element með id="label", þetta gæti t.d. átt við villuskilaboð í <input>
  • aria-hidden="true" — element er falið fyrir notanda og ætti ekki að vera sýnt notanda, getur verið notað til að fela „skraut“ á síðum sem lesvefrar ættu að sleppa

Yfirleitt er þó betra að nýta rétt element (t.d. <nav>) og attribute (t.d. required) í staðinn fyrir að setja ARIA merkingar á allt. Sjá nánar í On HTML belts and ARIA braces.

Í öllum eftirfarandi dæmum eru ARIA merkingar óþarfar:

<button role="button">press me</button>
<h1 role="heading" aria-level="1">heading text</h1>
<input type="text" required aria-required="true">

Noktun á ARIA merkingum á mest við þegar verið er að skrifa flóknari vefforrit sem nýta JavaScript virkni til hins ítrasta. Í W3C skjalinu Using ARIA er farið yfir hvernig nýta megi ARIA en þá eru líka tilteknar fimm reglur fyrir notkun:

  1. Ef þú getur notað staðlað HTML element eða attribute með hegðun og merkingu sem þú þarftnast skal leitast við að nota það
  2. Í lengstu lög skal forðast að breyta merkingu staðlaðra HTML elementa, t.d. með <h1 role="button">
  3. Allar stýringar verða að vera nothæfar með lyklaborði
  4. Fyrir sýnilega hluti sem er hægt að fókusa, skal ekki láta sem þeir séu það ekki með role="presentation" eða aria-hidden="true"
  5. Öll gagnvirk element þurfa aðgengileg nöfn, sem eru annað hvort texti innan þeirra eða <label> sem vísar á element

7.1.4 Form & töflur

Til að gera form aðgengileg þurfum við helst að merkja reiti á aðgengilegan hátt með því að nota <label>. Ef fleiri upplýsingar eru tengdar við reitinn, t.d. frekari upplýsingar um hvernig fylla skuli út, er hægt að nota aria-describedby="id-a-reit" til að tengja þá saman, sjá dæmi. Ef form er langt getur verið nytsamlegt að skipta því upp með <fieldset>.

<label for="password">Lykilorð</label>
<input type="password" id="password" aria-describedby="password-help">
<span id="password-help">Lykilorð verður að innihalda 8 stafi.</span>

Fyrir flóknari töflur þarf að skilgreina fyrir hvaða reiti fyrirsagnir eiga við með því að nota scope. Ef ekki, þá heyrir sá sem skoðar töfluna ekki samhengið, nánar um að smíða aðgengilegar töflur má lesa á WebAIM: Creating Accessible Tables

7.1.5 Skjálesarar

Helsta tólið, fyrir utan vafra, sem notað er til að lesa vefi eru skjálesarar. Tól sem sækja vefsíður, vinna úr þeim og lesa innihaldið upp. Hvernig virkar þinn uppáhaldsvefur ef þú þarft að hlusta á hann?

Hægt er að fá skjálesara fyrir flest stýrikerfi, t.d.:

Að prófa vef í skjálesara er í dag tiltölulega auðvelt, þá sérstaklega með VoiceOver og TalkBack. Með því að læra nokkrar skipanir er hægt að finna mörg aðgengisvandamál og fá betri sýn á hvernig vefurinn okkar er „lesinn“.

Kafli 8: Leitar­véla­bestun

um 4 mínútna lestími.

Þegar búið er að smíða vef verður það oft krafa að hann komi fram í leitarniðurstöðum þegar leitað er að ákveðnum lykilorðum. Leitarvélabestun er það þegar efni er meðhöndlað þannig að það komi frekar fram í leitarniðurstöðum og sem efst. Leitarvélar horfa til mörg hundruð breytna þegar ákveðið er hvaða vefir komi upp við leit, en þó við vitum ekki nákvæmlega hverjar þessar breytur eru, þá getum við haft áhrif á þær að einhverju leyti. Almennt er reglan sú að það eru engir galdrar, engin örugg leið til að vera #1 og að ef það hljómar of gott til að vera satt… þá er það það.

Merkingarfræðilegt HTML er grunnurinn sem góð leitarvélabestun byggir á. Á eftir því kemur gott efni sem er skipulagt, læsilegt og einstakt. Skipulagt að því leiti að lýsandi titlar brjóta það upp í einingar, læsilegt með því að vera ekki of langt eða flókið og einstakt þar sem það kemur ekki oft fyrir á sama vefnum og fjallar um þau lykilorð sem við einblínum á og ekki of mörg í einu.

Titillinn á vefsíðunni (<title>) sem inniheldur efnið okkar ætti að vera lýsandi (lykilorð að koma fram) og allar fyrirsagnir að vera einstakar og hnitmiðaðar. Nota skal rétt heading element, <h1> til <h6>. Allir tenglar á vef ættu að falla inn í textann eins og hægt er (ekki útbúa <a href="">smelltu hér!</a> tengla) og vera lýsandi fyrir það efni sem tengt er í. Myndir ættu að vera skilgreindar á aðgengilegan máta með alt texta.

Lýsigögn fyrir vef ættu að vera sett upp fyrir helstu þjónustur, t.d. Facebook og Twitter, sem oft á tíðum nota eitthvert staðlað form eins og OpenGraph (sem er þó viðhaldið af Facebook). Einnig er hægt að setja lýsingu á vef í <meta name="description"> og mun t.d. Google nýta þann texta til að birta með leitarniðurstöðum að einhverju leiti.

Minnstu upplýsingar sem ætti að skilgreina fyrir vefi svo helstu þjónustur birti viðeigandi upplýsingar eru titill, lýsing og mynd. Þar sem engin óháður staðall er til fyrir þetta þarf að bæta við öllu þrennu fyrir báðar þjónustur:

<meta property="og:title" content="Titill fyrir Facebook">
<meta property="og:description" content="Lýsing fyrir Facebook">
<meta property="og:image" content="http://example.com/img.jpg">
<meta name="twitter:title" content="Titill fyrir Twitter">
<meta name="twitter:description" content="Lýsing fyrir Twitter">
<meta name="twitter:image" content="http://example.com/img.jpg">

Þegar verið er að bæta við þessum upplýsingum er oft nauðsynlegt að gera ítrekað breytingar meðan verið að ná hlutunum réttum.

Flestar aðrar þjónustur nýta það sem kemur frá Facebook eða Twitter. Það að „fletja út“ þessar upplýsingar til birtingar fyrir notandur er stundum kallað unfurling.

Slóðir (URL) á vefi ættu að vera einfaldar og skiljanlegar, https://example.org/vorur/simi-utgafa-x, ekki https://example.org/?productid=123. Forðast ætti það að dreifa efni á margar slóðir: það ætti aðeins að vera aðgengilegt á einni, viðurkenndri (canonical) slóð. T.d. ætti efni ekki að vera aðgengilegt á vef og líka sér „m“, eða mobile vef. Ef ekki verður komist hjá því að hafa efnið aðgengilegt á fleiri en einni slóð er hægt að nota áframsendingar og það að merkja með <link rel="canonical" href="...">. Sjá nánar á Google: Building Smartphone-Optimized Websites. Eftir að við höfum á einum tímapunkti gert efni aðgengilegt á slóð, ættum við að reyna eins og við getum að koma í veg fyrir að það hætti að vera aðgengilegt á þeirri slóð, t.d. með því að nota áframsendingar, því eins og Tim Berners-Lee sagði, Cool URIs don't change.

Til að hjálpa ennfremur til getum við skilgreint veftré fyrir leitarvélar í sitemap.xml, sem er þá tæmandi listi yfir þær síður sem vefurinn okkar inniheldur. Leitarvélar fá þá betri mynd af því hvaða efni er til staðar og hvenær það breytist. Að sama skapi getum við skilgreint robots.txt skrá sem takmarkar eða stýrir að einhverju leyti hvernig leitarvélar og aðrir róbótar sem heimsækja vefi láta, t.d. hversu oft þeir ættu að sækja efni og hversu mikið í einu. Einnig ætti að búa til villusíður, t.d. fyrir 404 villur, ef síða finnst ekki.

Eftir að vefur fer í loftið getum við sett upp og nýtt okkur hin ýmsu tól til að fylgjast með, t.d. fjölda heimsókna, hvaðan komið er og villum sem koma upp. Með því að nota þau gögn getum við brugðist við, aðlagað efni og mætt betur raunþörfum fólks sem heimsækir vefinn. Þá er einnig hægt að gera tilraunir til að bæta vefina okkar, t.d. A/B testing.

Frekari upplýsingar má lesa í Search Engine Optimization Starter Guide frá Google, Beginners Guide to SEO eða með því að finna efni sem hefur verið vandlega bestað fyrir leitarvélar á vefnum.

Kafli 9: CSS

um 7 mínútna lestími.

Þegar við höfum skrifað efnið okkar í afskaplega fínu HTML skjali, merkingarbæru og aðgengilegu, langar okkur að ljá það lífi með útliti. Þar sem HTML er descriptive markup mál11 Skilgreint í kafla 2: Markup mál. er því ekki ætlað að tjá útlit. Þar kemur CSS inn í myndina.

CSS stendur fyrir Cascading Style Sheets og er style sheet language. Það er notað til að lýsa framsetningu á skjali skrifuðu í markup máli, t.d. HTML, XHTML, XML og SVG. CSS kom fyrst fram á sjónarsviðið árið 1994 þegar Håkon Wium Lie lagði til Cascading HTML style sheets. Í tillögunni er farið yfir hvernig vafrinn stjórni að mestu allri birtingu og „höfundurinn á HTML skjölum hafi engin áhrif á birtinguna“, sem var vissulega rétt, fyrir tíma CSS var engin leið til að breyta litum á stökum tenglum, aðeins öllum í einu!

Þó svo að það væri ekki hægt að breyta litum á tenglum lét fólk það ekki stoppa sig í að nýta það sem í boði var til að lífga upp á vefsíður. Töflur og gegnsæjar gif myndir22 „Spacer GIF“ var leið til að útbúa 1⨉1 gegnsæja GIF mynd og teygja hana með því að nota t.d. <img src="spacer.gif" width="100" height="100"> innan gagnareits með bakgrunnslit (<td>) í töflu, hönnun var útfærð með töflum. tröllriðu öllu eftir að Creating Killer Websites kom út og fólk gat loksins tjáð sig á vefnum með hönnun.

Skjáskot af strik.is, vefur sem er settur upp í töfluútliti.

strik.is hannaður með töflum, fyrsti vefur til að hljóta hin íslensku vefverðlaun. Skjáskot frá maí 2000.

Árið 1996 var CSS 1 staðlað hjá W3C en átti erfitt uppdráttar fyrstu árin eftir það. Stuðningur í vöfrum var ekki mikill og þegar virkni var útfærð var hún oftar en ekki ósamhæfð milli vafra. CSS 2 staðallinn kom út 1998 og kynnti til leiks position eigindið sem leyfði enn frekari stjórn yfir útliti. Stuðningur við CSS hélt þó áfram að vera lítill og ósamhæfður í vöfrum. Vefforritarar létu sér nægja að nota töflur og sáu sumir hverjir ekki ástæðu til að tileinka sér nýja tækni sem ekki var vel studd. Web Standards Project (WaSP) fór gagngert að þrýsta á vafraframleiðendur til að útfæra CSS rétt samkvæmt staðli og var stofnuð til þess „CSS Action Committee“ sem einnig gekk undir nafninu „The CSS Samurai“. Partur af því sem þessi hópur gerði var að útbúa viðmiðs útfærslu af CSS sem vafrar gátu hlaðið upp og borið saman við mynd. Þetta próf var kallað acid test33 Upprunalega kemur frá því þegar sýra var notuð til að greina gull frá öðrum málmum. og varð til þess að stuðningur fór hægt og rólega að aukast.

Skjáskot af upprunalega acid prófinu, handahófskennt útlit sem ætlað er að prófa stuðning á CSS.

Upprunalega acid prófið.

Þegar þessir staðlar voru orðnir ágætlega studdir í nýlegri vöfrum um aldamótin, var þónokkuð af fólki ennþá að nota eldri, úrelta vafra eins og t.d. Netscape Navigator. Þar sem engin pressa var á notendur til að uppfæra og hlutirnir virkuðu var ennþá stöðnun, flestir vefforritarar sáu ekki ástæðu til að tileinka sér nýja tækni. Þetta breyttist síðan með töflulausum eða merkingarfræðilegum endurhönnum á Wired árið 2001, og ESPN árið 2003, og CSS Zen Garden sem opnaði árið 2003 sem sýndi fólki líka hvers CSS var megnugt.

Skjáskot af CSS Zen Garden.

CSS Zen Garden leyfði vefforriturum og hönnuðum að spreyta sig á því að útbúa mismunandi útlit ofan á sama HTML skjalið með CSS.

CSS 2.1 kom fyrst út árið 2004 og innihélt sá staðall aðallega lagfæringar á villum í CSS 2. Brösuglega gekk þó að ná yfir allar villurnar. W3C setti því staðalinn fram en setti aftur í draft og hélt það áfram alla leið til ársins 2011. Af þessu lærði W3C og var CSS 3 sett upp á annan máta: í staðinn fyrir að gefa út einn stóran staðal með allri virkni sem staðla ætti, er virknin þróuð í einingum. Í dag eru tugir af einingum í vinnslu og eru þær á hverjum tíma í mismunandi stöðu, hvort sem þær eru draft, candidate recommendation eða proposed recommendation.

Logo fyrir CSS3

Logo fyrir CSS3.

9.1 Einfalt, ekki auðvelt

You don't need to be a programmer or a CS major to understand the CSS specifications. You don't need to be over 18 or have a Bachelor's degree. You just need to be very pedantic, very persistent, and very thorough.

CSS er einfalt að læra en ekki auðvelt að nota. Í grunninn eru þetta nokkrar reglur með einfaldri málfræði sem leyfa okkur að lýsa því hvernig element eigi að birtast. Þar sem það er einfalt að læra á CSS en ekki auðvelt að skrifa CSS til að lýsa því útliti sem óskað er eftir, lenda margir upp á kant við CSS. Vegna þessa eru margir sem sem líta CSS hornauga og kenna því um að ekki gangi vel. Þetta er vert að hafa í huga áður en byrjað er að læra CSS.

Mynd sem sýnir textann „CSS is awesome“ innan fernings þar sem orðið „awesome“ fer út fyrir ferning og gefur til kynna að CSS skilgreining sé biluð.

CSS grín.

Mynd: óþekkt.

Það er líka gott að hafa í huga að þó að CSS sé einfalt er það mjög kröftugt. Flest öll þau útlit sem við sjáum á vefnum eru smíðuð með CSS (stundum eru myndir eða þrívíddarvirkni notuð til að smíða útlit óháð CSS). Með mikilli þolinmæði má smíða ótrúlega hluti með CSS44 Þó svo að CSS sé ekki hannað eða nýtt sem forritunarmál, þá er það óvart „turing complete“..

Think for a moment of all the sites out there on the web. There’s a huge variation in visual style: colour schemes, typographic treatments, textures and layouts. All of that variety is made possible by one simple pattern that describes all the CSS ever written:

selector { property: value; }

That’s it.

Mynd af Minesweeper leik sem svipar mjög mikið til útfærslu sem kom með Windows stýrikerfinu.

Minesweeper útfærður aðeins með HTML og CSS, útfært af @James0x57.

Með þolinmæði og tíma er hægt nota CSS sem verkfæri til að skapa list:

CSS „listaverk“ sem sýnir konu í anda olímálverks frá 18. öld

Listaverk sem notar aðeins HTML og CSS, útfært af Diana Smith.

9.2 CSS & HTML

Þar sem CSS er sú tækni sem við notum til að ljá HTML líf þurfum við að tengja saman HTML og CSS. Það eru nokkrar leiðir til þessa:

  • Geyma CSS í eigin skrá (með skráarendingunni .css) og vísa í þá skrá úr HTML með <link rel="stylesheet" href="path/to/file.css"> í <head>. Þessi leið viðheldur algjörum aðskilnaði á milli HTML og CSS og er æskilegasta leiðin.
  • <style> element í HTML skjali, helst í <head>. Elementið inniheldur CSS reglurnar sem texta. Þetta er ekki alveg jafn hrein leið en aðskilur þó CSS frá HTML.
  • Öll element hafa style global attribute sem leyfir skilgreiningu á CSS beint á elementi. Þetta getur haft sína kosti en ætti alls ekki að vera almenna leiðin til að tengja CSS við HTML þar sem þetta bindur útlit við sniðmálið og er litlu betra en að nota <FONT>.

Skjalið styles.css:

body {
  background-color: pink;
}

Skjalið index.html:

<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8">
    <title>CSS</title>
    <link rel="stylesheet" href="styles.css">
    <style>
    p {
      font-size: 2em;
    }
    strong {
      text-decoration: underline;
      color: #fff;
      background-color: #123456;
    }
    </style>
  </head>
  <body>
    <p>Halló, <span style="text-decoration: underline;">heimur</span>!</p>
    <p>Núna erum við að stýra útliti með <strong>CSS</strong></p>
  </body>
</html>

Í þessu dæmi eru allar þrjár leiðirnar notaðar.

Dæmi

Birting á dæmi í vafra.

Skjáskot frá höfundi.

Hreinlegri og betri lausn er að geyma allar þessar upplýsingar um útlit í CSS skjalinu:

body {
  background-color: pink;
}
p {
  font-size: 2em;
}
em {
  text-decoration: italic;
}
strong {
  text-decoration: underline;
  color: #fff;
  background-color: #123456;
}
<!doctype html>
<html lang="is">
  <head>
    <meta charset="utf-8">
    <title>CSS</title>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <p>Halló, <em>heimur</em></p>
  </body>
</html>

Þarna höfum við endurbætt (e. refactor) fyrra dæmið: breytt uppbyggingu á kóða til hins betra án þess að breyta lokaniðurstöðunni.

Kafli 10: CSS málfræði

um 12 mínútna lestími.

10.1 Málfræði

Málfræði CSS er einföld, flest það sem við gerum byggist á því að vinna með reglusett sem samanstenda af selectors og yfirlýsingum. Hægt er að setja inn athugasemdir í CSS innan /* og */ en í CSS er engin leið til að skilgreina athugasemd sem tekur yfir eina línu (oft gert með // athugsemd eða # athugasemd).

/* eftirfarandi er eitt reglusett */
p /* selector */
{ /* yfirlýsingar innan { } */
  color: green; /* yfirlýsing */
  margin: 1em; /* yfirlýsing */
}

10.1.1 Selector

Selector er strengur sem lýsir því hvaða element við viljum að taki við yfirlýsingum. Sér í lagi getum við skrifað:

  • Type selector, heiti á elementi, t.d. p eða strong.
  • Universal selector, öll element, skilgreindur með strengnum *.
  • Attribute selector, velur element eftir því hvaða attribute eru á því og hvað þau innihalda, skilgreindur með [] sem inniheldur heiti og gildi fyrir attribute, t.d. [lang="is"].
  • Class selector, velur element eftir því hvað class attribute inniheldur, notar . (punkt) og síðan gildi á class attribute, t.d. .important.
  • ID selector, velur element eftir því hvað id attribute inniheldur, notar # og síðan gildi á id attribute, t.d. #main.
  • Gervi-klasar (pseudo-classes), velur hluti sem ekki er hægt að velja með hinum, einföldu selectorum, notum :.

Gervi-klasar skiptast síðan áfram í flokka:

  • Dýnamískir gerviklasar. Fyrir tengla :link ef ekki er búið að heimsækja og :visited ef búið er að heimsækja. Fyrir aðgerðir notenda, :hover meðan sveimað er yfir element, :active ef búið er að velja það, smella á það, :focus ef það hefur fókus.
  • Gerviklasar fyrir upbyggingu, t.d. :nth-child(), :first-child eða :last-of-type.

Hægt er að tengja saman selectors með   bili (e. whitespace), >, + eða ~:

  •   (bil) þýðir að seinni selector velur element sem er afkomandi fyrri.
  • > er fyrir strangt barn, seinni selector verður að vera barn fyrri.
  • + er fyrir systkini, seinni selector velur element sem er systkini sem kemur beint á eftir fyrri selector.
  • ~ er almennur systkina selector, seinni selector velur element sem er systkini fyrri og kemur á eftir því.
*              /* öll element */
div            /* öll div */
div p          /* öll p, afkomendur div */
div > p        /* öll p sem eru börn div */
p + p          /* öll p með p sem fyrra systkini */
p ~ span       /* öll span sem koma á eftir p */
div.important  /* öll div með class important */
a:hover        /* öll a sem verið að hovera á */
div#main       /* öll div með id main */
div[lang="is"] /* öll div með attribute lang=is */

Ef fyrir eftirfarandi HTML:

<div>
  <p>Halló <strong id="text">heimur</strong></p>
</div>
<div class="text">
  <em>Lorem</em> <span lang="is">ipsum <em>dolor</em> sit amet</span>,
  consectetur adipiscing elit.
</div>
<div class="text">
  <em>Lorem</em> <span lang="is">ipsum <em>dolor</em> sit amet</span>,
  consectetur adipiscing elit.
</div>
<div class="text"><!-- viljandi tómt --></div>

skilgreinum við CSS sem stýrir útliti með mismunandi selectors, sjá athugasemdir við hvern um hvað er gert:

/* Fjarlægjum allt margin og padding af öllum elementum */
* {
  margin: 0;
  padding: 0;
}
/* Setjum padding aðeins á body og stækkum letur */
body {
  padding: 50px;
  font-size: 20px;
}
/* svartur 1px breiður border á öll div og padding */
div {
  padding: 5px;
  border: 1px solid #000;
}
/* látum öll em vera með undirlínu, ekki skáletrun */
em {
  text-decoration: underline;
  font-style: none;
}
/* en ef þau eru beint undir div er textinn blár */
div > em {
  color: #00f;
}
/* div sem er systkini div fær 20px margin fyrir ofan sig
    og annan bakgrunnslit */
div + div {
  margin-top: 20px;
  background-color: lightcyan;
}
/* öll div á eftir div.text fá neon grænan bakgrunn */
div.text ~ div {
  background-color: rgb(0, 255, 0);
}
/* fyrsti stafur undir div.text verður tvöfaldur að stærð */
div.text:first-letter {
  font-size: 2rem;
}
/* Ef html er með attribute lang með gildið is, setja ljósgráan bakgrunn
    hvað gerist fyrir bakgrunnslit fyrsta div? */
html[lang='is'] {
  background-color: lightgray;
}
/* Ef *eitthvað* element sem er barn body er með attribute lang með
  gildið is, gefa gulan bakgrunn */
html [lang='is'] {
  background-color: yellow;
}
/* ef div.text er tómt, gefa því rauðan bakgrunn
    en af hverju ekki neon grænan? af hverju er það svona lítið? */
div.text:empty {
  background-color: red;
}
Dæmi

Birting á dæmi í vafra.

Skjáskot frá höfundi.

10.1.2 at reglur

At reglur leyfa skilgreiningar á aukaupplýsingum. Þær geta verið fyrir ákveðið gildi, t.d. @import 'typography.css'; sem innifelur allt CSS úr typography.css. Þær geta einnig verið hreiðraðar (e. nested), innihalda þá CSS reglur sem eru aðeins notaðar við ákveðin skilyrði, t.d.

  • @media sem skilgreinir að ákveðnar reglur eigi við ákveðna virkni eftir media query.
  • @supports er nýleg regla sem leyfir okkur að nota reglur aðeins ef ákveðin CSS virkni er studd.

10.1.3 Gervi-element

Gervi-element (e. pseudo-elements) leyfa okkur að velja elementi sem er ekki til staðar í DOM tré. Þau eru skilgreind í selector með ::.

  • ::before/::after – element sem er fyrir framan/aftan það valið element er, t.d. p::after velur element sem er innan p elements en kemur á eftir efni þess. Verður að innihalda eitthvað efni svo það birtist, skilgreinum efni með content: <efni>;.
  • ::first-letter – fyrsti stafur í efni elements sem er valið.
  • ::first-line – fyrsta lína efnis elements sem er valið.

10.1.4 Villumeðhöndlun

CSS er hannað til að fyrirgefa minniháttar villur, þá er öll yfirlýsingin hunsuð og haldið áfram að næstu. Þetta gerir það að verkum að CSS er traust og byggt til að virka í dag með virkni sem verður til á morgun, t.d.:

  • Ef heiti eigindis er óþekkt er yfirlýsing hunsuð, hægt er að nota ný eigindi án þess að útlit brotni í eldri vöfrum og tækjum.
  • Ef gildi er óþekkt eða ekki er hægt að vinna úr því er yfirlýsing hunsuð, hægt er að nota ný gildi án þess að eldri tæki brjóti útlit.
  • Ef tvípunkt eða semíkommu vantar í yfirlýsingu er yfirlýsing hunsuð, á við allt að lokun reglusetts eða næsta tvípunkt.

Meiriháttar villur stoppa lestur á skjali frá þeim stað sem þær eiga sér stað. Þetta gerist yfirleitt þegar { og } eru ekki í jafnvægi ({ er ekki lokað á réttum stað).

p {
  color: blue;
  /* næstu tvær reglur eru hunsaðar, vantar ;, leitar að næsta */
  color: yellow
  font-size: 10em;
  /* ekki hunsað */
  font-size: 2em;
}
/* a verður litað grænt þó } vanti */
a {
  color: green;
/* engar reglur héðan í frá taka gildi því } vantar */
em {
  color: purple
}

10.1.5 Skilgreiningar

Skilgreiningar á reglusetti eru innan { og }, og innihalda enga eða fleiri yfirlýsingar aðgreindar með semíkommu. Yfirlýsing byrjar á nafni eigindis (e. property), tvípunkti, gildi eigindis (e. value) og loks endar semíkomma yfirlýsinguna. eigindi: gildi;. Nöfn eiginda eru margvísleg í CSS og bætast við fleiri eftir því sem ný virkni er skilgreind. Gildin eru hinsvegar töluvert færri.

Fyrir sum eigindi er hægt að skilgreina í einni yfirlýsingu, þetta er kallað shorthand. Þessi virkni getur minnkað fjölda lína sem við þurfum að skrifa og kannski sparað tíma. Shorthand leyfir líka að sleppa því að skilgreina ákveðin gildi og eru þá sjálfgefin gildi sett í staðinn. Þetta getur valdið vandræðum ef það skrifar yfir gildi sem við höfum áður skilgreint.

10.2 Gildi í CSS

Strengir er skilgreindir með ' eða ". Ef við þurfum að skrifa þessa stafi notum við lausnarstafinn (e. escape character) \ til að skilgreina lausnarrunu (e. escape sequence) fyrir stafinn.

  • "this is a 'string'"
  • "this is a \"string\""
  • 'this is a "string"'

Url skilgreinum við með url(<slóð>) þar sem slóð er innan eða utan strengs.

  • url(http://example.org/mynd.jpg)
  • url('http://example.org/mynd.jpg')
  • url('/mynd.jpg')

Strengir sem skilgreindir eru án ' eða " eru lykilorð sem vísa þá í vel skilgreinda hegðun samkvæmt CSS staðli. T.d. display: block;, block er lykilorð sem gefur til kynna hverskonar display hegðun element á að fylgja.

Tölur geta verið jákvæðar og neikvæðar heiltölur og rauntölur. Rauntölur eru skilgreindar með punkti, t.d. 1.2. Tölur notum við yfirleitt þegar við vinnum með lengdir í CSS. Einingar á tölum geta verið ýmsar en einnig getum við skilgreint prósentur, t.d. 25.5%. Þegar við notum prósentur miðast þær alltaf við gildi foreldris eða breidd tækis. width: 100%; lætur element taka breidd sem er jöfn 100% af breidd foreldris eða skjás.

10.2.1 Sérstök gildi

Nokkur gildi eru sérstök og virka með örðum gildum eða upprunagildum:

  • initial setur eigindi sem upprunagildi, skilgreint í staðli.
  • inherit lætur eigindi erfa gildi frá eigindi ofar í tré (foreldri eða „ofar“).
  • unset setur gildi sem erft gildi ef við á, annars upprunagildis.
  • revert setur gildi sem það gildi sem vafri skilgreinir.

Hægt er að nota þessi sérstöku gildi með sérstaka eigindinu all sem á við öll eigindi elements. T.d. all: initial; lætur öll eigindi fyrir element taka sín upprunagildi.

10.3 Litir

Liti má skilgreina með:

  • Lykilorði, t.d. black, white, green. transparent er lykilorð fyrir alveg gegnsæan lit. Það er ekki æskilegt að nýta lykilorð fyrir sérstaka liti þar sem stuðningur vafra er misjafn og ekki öruggt að litur komi eins út.
  • RGB gildi með hexadecimal (eða hex) streng, t.d. #00ff00. Hver tvennd er gildi frá 00₁₆ til ff₁₆, og skilgreinir styrkleika rauðs, græns og blás frá 0₁₀ upp í 255₁₀. Hex gildi má einnig skilgreina með þrem stöfum, en þá gildir hver stakur stafur tvisvar, #0f0 er #00ff00, #9ac er #99aacc.
  • RGB gildi með rgb() falli sem tekur þrjár breytur fyrir red, green og blue frá 0₁₀ upp í 255₁₀. Einnig er til rgba() fall þar sem fjórða breytan (a, fyrir alpha gildi) skilgreinir hversu gegnsær litur er frá á bilinu [0, 1]. 0 er alveg gegnsær en 1 er ekkert gegnsær.
  • HSL (hue, saturation, lightness) gildi með hsl() eða með hsla() með alpha gildi.

10.4 Lengdir

Þegar unnið er með útlit í CSS er mikið unnið með lengdir. Hvort sem það er til að stýra hversu breið, há eða hve mikið bil er á milli elementa. Eigindin geta tekið hinar ýmsu einingar. Í grunninn eru þær hlutfallslegar og nákvæmar.

Eitt sérstakt gildi er hægt að gefa fyrir lengd en það er auto sem leyfir vafra að reikna lengdina sjálfkrafa.

10.4.1 Nákvæmar einingar

Nákvæmar einingar eiga við þegar við vinnum með hluti sem þurfa nákvæmar mælingar. T.d. fyrir prent þar sem við prentum á þekkta stærð í raunheimum, þar er hægt að nota einingar eins og in, cm, eða mm. Að skilgreina 1cm í CSS þýðir samt ekki að útkoman verði nákvæmlega einn sentimeter útprentuð. Nákvæma gildið er alltaf hlutfallslegt við upplausn prentunar, dpi eða dots per inch.

Í langflestum tilfellum reynum við að sleppa því að nota nákvæmar einingar þegar við útbúm birtingu fyrir vafra og stafræn tæki. Umhverfið sem vefurinn okkar birtist í er ekki þekkt stærð. Þó eru aðstæður þar sem við þurfum að nota nákvæmar einingar og þá notum við px eða pixel. Það er þó flóknara en svo að 1px í kóða sé 1px á öllum tækjum, þar kemur til upplausn tækis og fleira.

10.4.2 Hlutfallslegar einingar

Hlutfallslegar einingar skiptast í tvo hópa, letur-hlutfallslegar einingar (e. font-relative lengths) og skjá-prósentu einingar (e. viewport percentage lengths).

Letur-hlutfallslegar einingar horfa til font-size eigindsins þegar þær skilgreina stærð fyrir element. Yfirleitt notum við em eða rem einingar. em var upphaflega stærð skilgreind útfrá breidd M í leturgerð en hefur í dag verið skilgreind í CSS sem stærð font-size. Ef ekkert hefur verið átt við font-size er 1em == 16px en ef font-size: 18px; hefur verið skilgreint verður 1em == 18px.

Þegar reiknað er úr em gildum í elementum sem eiga sér foreldri með skilgreint em gildi eru þau margfölduð. Þetta getur oft valdið ruglingi þegar em er notað:

<div class="text">
  Texti utan &lt;p&gt;, smár.
  <p>Texti innan &lt;p&gt;, stærri.</p>
  <p>
    Texti innan &lt;p&gt; sem inniheldur <strong>enn stærri texta</strong>.
  </p>
</div>
/* texti innan html er núna 16px * 2 = 32px */
html {
  font-size: 2em;
}
/* texti innan .text er nákvæmlega 16px */
.text {
  font-size: 16px;
}
/* texti í p undir .text er 16px * 1,5 = 24px */
.text p {
  font-size: 1.5em;
}
/* texti í em undir p undir .text er nákvæmlega 12px */
.text p em {
  font-size: 12px;
}
/*
  texti í strong undir p undir .text er:
  16px * 1,5 * 2 = 48px
  þar sem 12px komur frá .text
  margföldum með 1,5 út af .text p
  margföldum með 2 út af skilgreiningu sjálfri
*/
.text p strong {
  font-size: 2em;
}
Dæmi

Birting á dæmi í vafra.

Skjáskot frá höfundi.

Núna gætu einhverjir spurt sig, af hverju í ósköpunum að hafa svona flækjustig í útreikningum á stærðum fyrir texta? Þetta er svona flókið þar sem við getum með þessu útbúið vefi þar sem vertical rhythm eða lóðréttur hrynjandi í texta er réttur. Öll bil og allar stærðir eru margfeldi af grunnstærð. Einnig gerir þetta það að verkum að notendur geta breytt stærð og við það skalast allt sem skilgreint er í hlutfallslegum einingum í réttum hlutföllum. Ef við skilgreinum stærðir eingöngu í pixlum gerist það ekki, og vefurinn okkar verður óaðgengilegur.

Ef við notum rem eininguna þurfum við ekki þessa margföldun í gegnum tréð; hún notar alltaf stærð rótar elements, font-size á <html>. Þar með getum við fengið kosti þess að skilgreina hlutfallslega án þess að þurfa að vera í sífellu að reikna hlutföll.

Skjáskot af síðu sem nýtir grid og vertical rhythm.

Síða sem nýtir grid og vertical rhythm.

Skjáskot frá höfundi.

Ástæðan fyrir því að nota hlutfallslegar einingar er, eins og áður var nefnt, til að hjálpa okkur að láta vefinn okkar birtast rétt í þeim mýmörgu tækjum sem hann gæti verið skoðaður í. Ef við fastsetjum allar stærðir útfrá stórum skjám með háa upplausn munu einstaklingar sem skoða hann á minni skjám með minni upplausn lenda í vandræðum, og öfugt.

Skjá-prósentu einingar eru hlutfallslegar við stærð viewports sem er yfirleitt stærð vafragluggans.

  • vw er ein eining á breiddina (viewport width) svo 100vw myndi fylla upp í skjá á breiddina.
  • vh er ein eining á hæðina (viewport height) svo 100vh myndi fylla upp í skjá á hæðina.
  • 1vmin er 1vw eða 1vh, hvort sem er minna.
  • 1vmax er 1vw eða 1vh, hvort sem er stærra.

Hægt er að nota þessar einingar bæði til að stýra stærðum á elementum eða öðru, t.d. leturstærð.

Kafli 11: Box model

um 6 mínútna lestími.

Box módelið lýsir því hvernig rétthyrnd box fyrir element eru mynduð en ein leið til að byrja að hugsa um CSS er sem samansafn af boxum sem er raðað saman til að mynda útlit.

Útskýringar mynd af box modelinu sem ferningar innan ferninga. Fyrst er margin, fyrir innan það border, síðan padding og loks efnið.

Útskýringar mynd af box modelinu.

11.1 Margin

Margin er ysta lag boxsins og getum við skilgreint lengd í hverja átt með margin-top, margin-right, margin-bottom og margin-left. Lengd getur verið skilgreind sem neikvæð tala en þá er box dregið í viðkomandi átt um töluna. Litur á boxi er ekki settur á margin svæði box, það „hleypir“ lit þess sem er bakvið það í gegn.

Ef auto er skilgreint fyrir vinstri og hægri hliðar er box miðjað innan foreldri síns, vafri reiknar sjálfkrafa hve mikið margin á að vera vinstra og hægra megin. Shorthand skilgreining á margin er:

margin: 1em;           /* margin: allar hliðar; */
margin: 1em 0;         /* margin: top&bottom right&left; */
margin: 0 1em 2em;     /* margin: top right&left bottom; */
margin: 0 1em 2em 3em; /* margin: top right bot left; */

Þar sem margin er ysta lag boxisns geta lóðrétt margin tveggja eða fleiri boxa í röð geta fallið saman og er það kallað collapsing margin. Einnig getur það gerst fyrir box innan í boxi. Getur oft komið á óvart en getur líka verið gagnlegt. Nokkuð flóknar reglur segja til um hvenær og hvernig það gerist.

<p>Fyrsta málsgrein.</p>
<p class="more">Önnur málsgrein.</p>
<p>Þriðja málsgrein.</p>
p { margin: 50px; }
/*
á milli tveggja p er aðeins 50px margin
ekki 50px+50px þar sem þau falla saman
*/
p.more { margin-bottom: 100px; }
/*
milli p.more og næsta p er 100px margin ekki 100px + 50px
einnig vegna þess að margin falla saman
*/
Útskýringar mynd fyrir collapsing margins, milli fyrstu tveggja málsgreina er 50px margin og milli annarar og þriðju 100px.

Skjáskot af birtingu dæmis fyrir ofan.

Mynd frá höfundi.

11.2 Border

Border er næst ystalag boxins og teiknar jaðar utan um það. Hægt er að skilgreina:

  • þykkt (e. width) sem jákvætt tölulegt gildi með border-width.
  • stíl (e. style) með lykilorðum, t.d. solid (lína), dotted (teiknaður jaðar er röð af punktum), double (tvær línur með bili á milli, summa alls er jafn þykk gildi þykktar) með border-style.
  • lit (e. color) sem litagildi með border-color.

Fyrir hverja átt er hægt að skilgreina hvert gildi, t.d. border-top-width. Eða nota border shorthand sem skilgreinir allt fyrir allar hliðar eða per hlið með t.d. border-top.

border: 1px solid #000;    /* svört 1px lína allt um kring */
border-top: 0;             /* nema engin lína efst */
border-bottom-width: 3px;  /* og 3px þykk í botninum */
border-left-style: dotted; /* og punktar til vinstri */

11.3 Padding

Næst innst í boxinu er padding. Það er skilgreint eins og margin, einnig fyrir shorthand. Munur er:

  • Padding getur ekki verið skilgreint með neikvæðu gildi.
  • Padding fær bakgrunnslit sem skilgreindur er á elementi.

11.4 Efni

Við getum skilgreint breidd efnis með width og hæð með height. Heildarstærð sem boxið tekur er þá:

width = left margin + right margin + left border + right border +
        left padding + right padding + content width
height = top margin + bottom margin + top border + bottom border +
         top padding + bottom padding + content height

Það getur leitt til vandræða þar sem útlit notar hlutfallslegar stærðir og nákvæmar stærðir, t.d. ef við skilgreinum border með px en viljum að boxið í heild sinni fylli alveg upp í foreldri sitt með 100%.

Að takmarka hæð á elementum er hættulegur leikur. Breidd á elementum miðast alltaf við breidd á vafra (eða því tæki sem við erum að skoða með) og því auðveldara að takmarka það og þá sérstaklega með hlutfallslegum lengdum. width: 100%; á element þýðir að það fyllir upp í lárétt pláss foreldris. Ef við skilgreinum height: 100%;, hvað þýðir það? Hæð á allri síðu? Hæð á foreldri? Hvað ef sú hæð er skilgreind útfrá hæð barnsins? Við lendum í enn frekari vandræðum ef við grípum til þess að nota nákvæm gildi, t.d. height: 100px;, því hvað gerist ef efnið þarf meira pláss? Í flestum tilfellum viljum við því takmarka breidd en láta hæðina flæða eftir því sem efnið þarf.

p {
  border: 1px solid #000;
  width: 10%;
  height: 100px;
}

Því minna pláss sem foreldri býður upp á, því meiri líkur á að textinn „flæði út úr“ p elementi.

Skjáskot af því sem getur gerst þegar við takmörkum hæð.

Mynd frá höfundi.

11.5 Box sizing

CSS3 skilgreinir box-sizing sem breytir því hvernig box modelið er reiknað:

  • content-box - sjálfgefið gildi, allt tekið með í reikninginn.
  • border-box - aðeins margin er tekið með í reikninginn.

Að breyta því hvernig við reiknum heildarstærð á boxi getur oft á tíðum verið til góðs. Við höfum þá frelsi til að eiga við „innri“ gildi boxsins (border og padding) án þess að það hafi áhrif á heildarstærðina. T.d. ef við höfum box sem eiga að raðast saman í lárétta röð og hvert box á að taka 25% af breidd foreldris en við viljum líka að það hafi border og padding svo efni fái að anda. Án þess að nota box-sizing: border-box; þyrftum við því að fara í að reikna width án þessara gilda, sem eru hugsanlega nákvæm gildi, eða bæta við fleiri elementum innan boxsins til að útbúa pláss.

.box {
  width: 25%; /* á að taka 25% af breidd foreldris */
  padding: 10px; /* en hafa 10px padding */
  border: 1px solid #000; /* og border */
  /*
  en núna mun allt boxið verða á breiddina:
  25% + 2*10px + 2*1px
  og það verður ekki pláss fyrir fjögur box í röð
  */
  box-sizing: border-box;
  /* allt í góðu núna! box verður 25% að breidd */
}

11.6 Takmarkanir á hæð og breidd

Stundum viljum við að boxin okkar séu aldrei minni eða stærri en ákveðið (oftast nákvæmar stærðir) á hæð eða breidd:

  • min/max-height: x; takmarkar box þ.a. það sé aldrei minna/stærra en x.
  • min/max-width: x; takmarkar box þ.a. það sé aldrei mjórra/breiðara en x.

Þetta getur verið gott þegar við vinnum með box sem skalast en við vitum að undir/yfir ákveðinni breidd líta þau ekki vel út eða verða ónothæf. Þá getum við skilgreint breidd þeirra í hlutfallslegri stærð, t.d. width: 100%; en takmarkað þá með min-width og max-width með nákvæmum stærðum.

.box {
  width: 100%;     /* fyllir upp í foreldri */
  max-width: 40em; /* aldrei breiðari en um 40em */
  min-width: 20em; /* og aldrei minni en um 20em */
  /*
  Stærð á elementi með .box verður því á bilinu
  [20em, 40em] sama þó foreldri sé minni eða stærri.
  */
}

Þegar við byrjum að vinna með útlit í CSS er mjög gott að muna það að lang flest í CSS er rétthyrnt box!

Kafli 12: Sértækni & flóðið

um 5 mínútna lestími.

Þegar við erum búin að setja upp HTML, skrifa CSS sem velur element með selectorum og gefa eigindum gildi innan reglusetta, hvernig veit vafrinn nákvæmlega hvaða gildi fyrir hvert eigindi eigi að nota þegar útlitið er teiknað? Þá koma tvö hugtök til tals: sértækni (e. specificity) og „flóðið“ (e. the cascade).

12.1 Sértækni

Fyrir allar CSS reglur og fyrir hvern selector er reiknað sértækni (e. specifitcy) sem er á forminu a,b,c,d þar sem:

  • a, 1 ef skilgreint í style attribute, annars 0
  • b, fjöldi id selectora
  • c, fjöldi attribute selectora og gervi-klasa
  • d, fjöldi elementa og gervi-elementa

Við fáum síðan gildi sem er fernd (gætum hugsað sem tölu með því að skeyta gildinu saman í tölu, en er samt ekki tala) sem er sértækni gildið.

li.first                 /* a=0 b=0 c=1 d=1 → 1,1 */
.item .link:active       /* a=0 b=0 c=3 d=0 → 3,0 */
#main                    /* a=0 b=1 c=0 d=0 → 1,0,0 */
style="" beint á element /* a=1 b=0 c=0 d=0 → 1,0,0,0 */

Þetta gildi, ásamt öðru, ræður því hvaða reglur eru notaðar fyrir hvert eigindi. Hærra sértækni gildi þýðir að líklegra er að sú regla sé notuð. Eins og sést er ID selector með næst hæsta sértækni gildið og er því óæskilegt að nota þessa selectora nema í sérstökum tilvikum. Sama gildir um CSS skilgreint í style attribute á elementi.

12.2 Flóðið

Þegar útlit er sett saman þarf að komast að því nákvæmlega hvaða skilgreiningar eigi við fyrir hvert element. Þá er „flóðið“ (e. cascade) notað. Þetta er það mikilvægur partur af CSS að þetta er það sem fyrsti stafurinn stendur fyrir: Cascading Style Sheets. Skilgreiningar geta komið frá þremur stöðum:

  • User agent, tæki sem birtir (yfirleitt af vafra) ef það skilgreinir sjálfgefna stíla.
  • Notanda, notandi tækis getur skilgreint með stillingum hvernig hlutir líta út, t.d. að allt sé stækkað.
  • Höfundi, skilgreiningar frá höfundi vefs, yfirleitt okkar sem vefforritara.

Eftir að allt CSS hefur verið lesið frá öllum upprunum er skilgreiningum raðað eftir:

  1. Skilgreiningum user agents
  2. Skilgreiningum notanda
  3. Skilgreiningum höfundar
  4. Skilgreiningum höfundar merktar með !important
  5. Skilgreiningum notanda merktar með !important
  6. Sértækni
  7. Skilgreiningar röð innan skjals þar sem seinna skilgreint fær hærra gildi

Þessi röðun er síðan notuð til að reikna hvaða gildi hver yfirlýsing fær.

12.2.1 !important

Með því að skilgreina !important á yfirlýsingar höfum við áhrif á það hvar í röðinni yfirlýsingin lendir. Þetta gæti hljómað sem góð hugmynd en í raun er hún það ekki. Yfirlýsingar með !important hunsa sértækni gildi og skilgreiningar röð. Þær vinna því gegn almennu reglunni um það hvernig gildi eru reiknuð og geta valdið rugling.

div {
  font-size: 100px !important;
  /* það er mjög mikilvægt að allur texti sé 100px! */
}

Ef tveir eða fleiri aðilar vinna í sama CSS verkefni sem spannar hugsanlega fleiri skrár, og aðili lendir í einhverjum vandræðum með að fá rétt gildi með því að nota selectora og setur !important á yfirlýsingu. Næsti aðili hefur verið að nota rétta selectora til að fá fram útlit en allt í einu hætta þær skilgreiningar að vera réttar því !important gildi tekur yfir skilgreiningar. Þarf þá að skoða öll möguleg skjöl til að finna hvaðan gildið kemur.

12.2.2 Gildi

Þegar útlit er birt þarf að reikna gildi fyrir allar yfirlýsingar sem tæki styður. Til þess er byrjað á að finna skilgreint gildi eftir reglu:

  • Ef „flóðið“ gefur okkur gildi, notum það
  • Annars, erft gildi
  • Annars, upphafsgildi

Sum gildi eru erfð í börnum frá foreldri sínu, þetta sparar okkur heilmikla vinnu og lætur CSS virka eins og við myndum gera ráð fyrir.

<h1>Halló <em>heimur</em></h1>
h1 { color: blue; }
/*
  allur texti innan h1 er blár, líka sá
  sem er innan em, þar sem color erfist
*/

Fyrir aðrar yfirlýsingar eru skilgreind upphafsgildi. Þau eru yfirleitt rökrétt en stundum geta þau valdið okkur vandræðum, sérstaklega þegar við notum shorthand. T.d. er background-color með sjálfgefna gildið transparent, engin bakgrunnslitur.

Þegar komið er að því að fá raun gildi er það fengið með eftirfarandi reglu:

  • Reiknað gildi – reiknað úr hlutfallslegum gildum eins langt og hægt er, t.d. hlutfallsleg breidd m.v. foreldri
  • Notað gildi – fáum nákvæm gildi úr öllum, leyst úr háðum gildum
  • Raun gildi – gildi notað við birtingu, t.d. þarf að námunda tölur að einhverjum aukastaf
<section>
  <div>halló</div>
</section>
html {
  font-size: 10px;
}
section {
  width: 10em;
  /* reiknað, notað og raun gildi: 10px * 10 = 100px */
}
div {
  font-size: 2em;
  /* reiknað, notað og raun gildi: 10px * 2 = 20px */
  border: 0.01em solid black;
  /*
  reiknað og notað gildi: 0.01 * 20px = 0.2px
  raun gildi: 1px, rúnað upp
  */
  width: auto;
  /*
  reiknað gildi: auto
  notað gildi: 100px, búið að reikna section
  raun gildi: 98px, út frá box model og border
  */
}

Kafli 13: Að skrifa CSS

um 3 mínútna lestími.

Eins og með HTML skiptir máli að huga að því hvernig við formum og skrifum CSS.

Algeng leiðin til að skrifa CSS er að hafa einn selector per línu með { á línu seinasta selectors. Allar yfirlýsingar eru síðan dregnar inn innan reglusetts.

/* ekki svona */
.text, .list, div { font-size: 1em;
color: black; }
/* heldur svona */
.text,
.list,
div {
  font-size: 1em;
  color: black;
}

Almennt ættum við ekki að nota ID selectora þar sem þeir hafa hærra specifity en class selector og geta því valdið vanda. Einnig ætti id aðeins að vera skilgreint einu sinni fyrir element per síðu og því ekki hægt að endurnýta fyrir fleiri. Þetta þýðir þó ekki að við notum id aldrei, þegar við vissulega viljum finna einstök element með JavaScript getum við notað id.

#main .list { font-size: 2em; }
/*
  getum ekki náð hærra specificity nema með því að nota líka id
  eða fara út í að nota !important
*/
.list { font-size: 1.5em; }

Einnig er æskilegt að nýta sér „flóðið“ þar sem það á við, t.d. til að skilgreina leturgerð aðeins einu sinni, þarf ekki að skilgreina aftur og aftur fyrir mörg element.

Stundum eru yfirlýsingum raðað á einhvern sérstakan hátt og þeim hópað saman, t.d. allt sem á við texta saman, allt sem á við staðsetningu. Þetta á sérstaklega við í verkefnum sem margir vinna í.

Þegar við skrifum class á element til að velja með selector þá er venjan að skrifa þá með kebab-case á ensku:

/* ekki svona */
.MikilvaegurTexti
.ListOfItems
/* heldur svona */
.important-text
.list-of-items

Kebab-case er ein af nokkrum leiðum til að skrifa samsett orð án bila en sú þörf kemur oft upp í forritun þegar bil hefur merkingu. Í CSS er bil leið til að sameina selectors svo velja þarf einhverja leið til að útbúa samsett orð. Aðrar leiðir eru t.d.

  • lowerCamelCase
  • UpperCamelCase
  • snake_case
  • Upper_Snake_Case

Eins og með annað sem viðkemur kóðastíl er mikilvægt að gæta samræmis og velja sér „nafnahefð“ (e. naming convention) sem getur fylgt hefðum forritunarmáls, forritarahóps eða fyrirtækis.

13.1 CSS validation

W3C heldur úti validation þjónustu sem bæði bendir okkur á beinar villur en einnig hugsanlega vandræði sem CSS gæti skapað. Til þess að fá allar upplýsingar þurfum við að kveikja á öllum warnings undir more options.

Fyrir eftirfarandi CSS:

p {
  font-size: 1en;
  margim: 1em;
}
.list {
  background-color: #999;
}

fáum við villur:

2 p Value Error : font-size Unknown dimension 1en
3 p Property margim doesn't exist : 1em

og viðvaranir:

7 You have no color set (or color is set to transparent) but you have set
  a background-color. Make sure that cascading of colors keeps the text
  reasonably legible.

Sem bendir okkur á að þar sem við setjum bakgrunnslit en ekki lit, þá gætum við lent í því að flóðið gefi okkur ólæsilegan texta, eða texta sem ekki hefur nægilega mikið contrast.

13.2 Reset

Hver „user agent“ (í flestum tilfellum vafri) setur sín eigin sjálfgefnu gildi sem eru notuð ef við skilgreinum ekkert. Þetta getur verið mismunandi milli vafra og því varð hugtakið um css reset til, en það eru reglusett sem setur öll element í „núllstöðu“. Fyrsta reset.css skjalið var búið til af Eric Meyer.

Kafli 14: Visual Formatting módel

um 10 mínútna lestími.

CSS 2.1 skilgreinir visual formatting model sem skilgreinir hvernig við stýrum uppsetningu og flæði efnis á síðu.

14.1 Normal flow – eðlilegt flæði

Ef við höfum ekki skilgreint hvernig element á að haga sér er það í eðlilegu flæði og er sjálfgefið annað hvort block eða inline. Við getum stýrt hvernig element hegðar sér með display eigindinu, sem tekur eftirfarandi gildi (ekki tæmandi listi):

  • block, element forma „blokkir“ og fylla upp í breidd foreldris.
  • inline, element forma ekki „blokkir“ heldur dreifir sér í línur, inline element fá ekki lárétt margin, width eða height.
  • inline-block, element myndar blokk (og getur því fengið lárétt margin) en dreifir sér í línu.
  • none, element er fjarlægt með öllu úr flæði og tekur ekkert pláss.

Ef við viljum ekki ganga svo langt að fjarlægja box með display: none; getum við falið allt efni innan þess með visibility: hidden;. Það felur boxið og allt efni í því en reiknar með því í útliti.

Fyrir eftirfarandi HTML:

<div class="box block">block</div>
<div class="box inline">inline</div>
<div class="box inline">inline</div>
<div class="box none">none</div>
<div class="box block">block</div>
<div class="box inline-block">inline block</div>
<div class="box inline">inline</div>
<div class="box inline-block">inline block</div>

og eftirfarandi CSS:

.box {
  width: 10vh;
  height: 10vh;
  margin: 20px;
  border: 2px solid #f00;
  padding: 20px;
  background-color: #eee;
  color: #111;
}
.block {
  display: block;
}
.inline {
  display: inline;
}
.inline-block {
  display: inline-block;
}
.none {
  display: none;
}

fáum við birtingu þar sem við skilgreinum að element með class .box fái fasta breidd og hæð, fast margin og padding á öllum hliðum; og 2px rauðan border til að sjá hvar þau eru. Útfrá eðlilegu flæði og því hvert display gildið er, eru þessi element birt, í okkar tilfelli:

  • Fyrsta element fyllir út í allt það pláss sem er í boði en vegna þess að width er skilgreint er það takmarkað við það, það hegðar sér eins og við gerum ráð fyrir útfrá skilgreiningu á .box því það er skilgreint með `display: block``.
  • Næstu tvö element sitja hlið við hlið en alveg ofan í fyrsta og fjórða element og eru nákvæmlega nógu stór til að birta textann inni í þeim. Það er vegna þess að þau eru skilgreind með display: inline og **fá ekki lárétt margin gildi eða skilgreind width og height gildi.
  • Fjórða element er eins og fyrsta.
  • Fimmta og sjöunda element haga sér eins og fyrsta og fjórða, en eru í línu með sjötta (sem hegðar sér eins og element tvö og þrjú) vegna display: inline-block.
Dæmi

Skjáskot af birtingu dæmis fyrir ofan.

Mynd frá höfundi.

14.2 Efni í boxi

Þegar við stýrum stærð á elementum með height eða width hættum við á að elementið verði of lítið fyrir efni sitt. Þá getur overflow hjálpað en það leyfir okkur að skilgreina hvað gerist við efnið sem flæðir út fyrir:

  • visible (sjálfgefið) sýnir efni sem flæðir út fyrir
  • hidden felur efni sem flæðir út fyrir
  • scroll efnið flæðir og skrunstikur birtast
  • auto birtir efni ef pláss, annars skrunstikur

Í þeim tilfellum sem við takmörkum hæð á elementum sem innihalda texta þá viljum við hugsa sérstaklega um overflow. Það er auðvelt að gera ráð fyrir því að texti muni alltaf vera jafn langur og sá sem við höfum í forritun, en hvað gerist ef einhver bætir við tvisvar sinnum lengri texta? Eða ef fyrirsögn er það löng að hún fari í tvær línur? overflow: hidden er lausn sem viðheldur útliti en felur efni og er því ekki æskilegt. overflow: auto setur sjálfkrafa þær skrunstikur sem verða að vera og er yfirleitt besta lausnin. overflow er short-hand gildi fyrir overflow-x og overflow-y sem við getum notað til að stýra birtingu á x eða y ás sérstaklega.

14.3 Staðsetning

Við getum stýrt staðsetningu á elementum með position eigindinu. Það tekur nokkur lykilorð sem stýra hvernig við viljum breyta staðsetningu. Ásamt því notum við top, right, bottom og left eigindin (stundum kölluð offset eigindi) til þess að staðsetja elementið. Þau taka öll bæði jákvæð og neikvæð gildi sem lengd. static er sjálfgefna gildi position og staðsetur það í eðlilegu flæði. Að gefa element position gildi annað en static gerir það að containing block sem notast er við í suma útreikninga. Fyrsta containing block er rótar elementið, yfirleitt <html>.

14.3.1 Hlutfallsleg staðsetning

Við staðsejum element hlutfallslega í eðlilegu flæði með position: relative;. Staðsetning á elementi er reiknuð út frá eðlilegu flæði en síðan er það flutt hlutfallslega miðað við þá staðsetningu eftir gildum offset eiginda. Eftir flutning er „plássið“ í eðlilegu flæði eftir.

<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
.box {
  margin-bottom: 10px;
  padding: 20px;
  height: 50px;
}
.box:nth-child(2) {
  position: relative;
  top: 150px;
  left: 50px;
}
.box:nth-child(4) {
  position: relative;
  top: -200px;
  left: -50px;
}

Box 2 er flutt niður og til vinstri. Box 4 er flutt upp í pláss box 2 og dregið út til vinstri með neikvæðu gildi. Bæði eru reiknuð fyrst í eðlilegu flæði og fá breidd þaðan og skilja eftir sig pláss.

Mynd frá höfundi.

14.3.2 Nákvæm staðsetning

Við staðsetjum element nákvæmlega með position: absolute;, út frá containing block. Element sem eru staðsett nákvæmlega eru ekki reiknuð í eðlilegu flæði og skilja því ekki eftir sig pláss. Að auki þar sem þau eru ekki með í útreikning í eðlilegu flæði, þá fá þau ekki breidd út frá því. width: 100%; mun ekki gefa breidd sem er jöfn fullri breidd foreldris, heldur mun það taka stærð sem efni krefst.

<div class="absolute">
  <div class="box">1</div>
  <div class="box">2</div>
  <div class="box">3</div>
  <div class="box">4</div>
</div>
.absolute {
  /* gerum foreldri að containing block */
  position: relative;
  border: 1px solid #000;
}
.box {
  margin-bottom: 10px;
  padding: 20px;
  height: 50px;
}
.box:nth-child(1) {
  position: absolute;
  top: 0;
  right: 0;
}
.box:nth-child(3) {
  position: absolute;
  bottom: 0;
  left: 50px;
  width: 100px;
}

Foreldri er containing block svo staðsetning miðast við það. Box 1 er flutt í efra hægra horn, það fær ekki stærð þar sem það er ekki reiknað í eðlilegu flæði. Box 3 er staðsett í botni 50px frá vinstri og gefin 100px breidd.

Mynd frá höfundi.

Með því að nota position: absolute; getum við látið element fylla út í foreldri sitt að öllu leiti með því að tilgreina öll staðsetningar eigindi í 0. Foreldri verður að vera containing block, annars er barnið staðsett ofar í trénu.

<div class="box">
  <div class="child">
    Box 1 – barn
  </div>
</div>
<div class="box parent">
  <div class="child fill">
    Box 2 – barn
  </div>
</div>
.fill {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}
.parent {
  position: relative;
}

Barn í boxi 2 fyllir alveg út í foreldri sitt þar sem það er containing block.

Mynd frá höfundi.

14.3.3 Föst staðsetning

Við staðsetjum element fast út frá viewporti með position: fixed;. Element sem eru fast staðsett eru ekki reiknuð í eðlilegu flæði og skilja því ekki eftir sig pláss. Element er fast að því leiti að þegar síða er scrolluð helst element í stað.

/* element er alltaf staðsett uppi í vinstra horni vafra */
.fixed {
  position: fixed;
  top: 0;
  left: 0;
}

14.3.4 Klístruð staðsetning

Klístruð staðsetning með position: sticky; notar samblöndu af hlutfallslegri og fastri staðsetningu. Staðsetning er reiknuð út frá eðlilegu flæði en þegar komið er að ákveðnum þröskuldi á containing block sem getur skrunað, þá er það reiknað sem það væri hlutfallslega fast.

.sticky {
  /* staðsett hlutfallslega þangað til... */
  position: sticky;
  /* 200px frá top á containing block sem skrunar, þá fast */
  top: 200px;
}

14.3.5 Þriðja víddin

Element sem hafa annað gildi en position: static; eru ekki aðeins staðsett í tvívíðu rúmi, þau liggja líka á z-ás. Þetta kemur fram t.d. í því að ef tvö eða fleiri element eigi að birtast í efra vinstra horni, hvert þeirra sést? Þessi staðsetning ræðst af stacking order og hvernig það er reiknað út sjálfgefið fylgir ákveðnum reglum. Við getum ákvarðað hvar í röðinni element liggur með því að gefa því sitt eigið gildi með z-index: <tala>;. Hærra z-index gildi raðar element nær notanda þ.e.a.s. ofar á z-ás.

<div class="zindex">
  <div class="box">1</div>
  <div class="box">2</div>
  <div class="box">3</div>
  <div class="box">4</div>
</div>
.zindex {
  position: relative;
  border: 1px solid #000;
}
.zindex .box:nth-child(1) {
  position: absolute;
  top: 60px;
  right: 0;
  z-index: 4;
}
.zindex .box:nth-child(2) {
  position: relative;
  z-index: 1;
}
.zindex .box:nth-child(3) {
  position: absolute;
  bottom: 50px;
  left: 50px;
  z-index: 1;
  width: 100px;
}
.zindex .box:nth-child(4) {
  position: relative;
  z-index: 3;
}

Box 1 liggur ofan á öllum öðrum boxum en box 3 liggur ofan á boxi 2 en undir boxi 4.

Mynd frá höfundi.

Eitt sem getur valdið vandræðum með z-index er þegar við viljum birta element innan elements sem hefur skilgreint z-index og hefur systkini sem hafa sama z-index, fyrir utan það. T.d. ef við viljum birta upplýsingar þegar hoverað er yfir eitthvað eða smellt á takka í lista af boxum. Boxin hafa sama z-index og reglur segja til um að seinna í DOM trénu (þ.e.a.s. seinna í HTML röð) hefur forgang í birtingu ef sama z-index gildi er skilgreint.

Texti sem birtist þegar hoverað er yfir texta liggur undir boxi sem kemur á eftir og hefur sama z-index.

Mynd frá höfundi.

14.4 Fela efni ætlað skjálesurum

Það geta komið upp þau tilvik þar sem við viljum fela efni frá vöfrum en gera það aðgengilegt skjálesurum. T.d. „beint í efni“ tenglar eða textar sem auðveldara er að lesa úr samhengi hönnunarsíðu en ef hún er lesin. Til þess að gera þetta „skjálesara aðgengilega efni“ falið, er CSS notað. Það eru nokkrar leiðir til þess að ná þessu fram, t.d. að skilgreina .sr-only skipun:

.sr-only {
  position: absolute;
  left: -10000px;
  top: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

14.5 Floats

Önnur leið sem CSS 2.1 skilgreinir til að hafa áhrif á eðlilegt flæði er með floats en það getum við skilgreint fyrir element með float eigindinu sem getur tekið gildin left, right eða sjálfgefna gildið none. Með því að skilgreina float: left; eða float: right; fjarlægjum við element úr eðlilegu flæði og „fleytum“ því til vinstri eða hægri m.v. þá línu sem það er í. Þessi lína er efri brún staðsetningar elements í eðlilegu flæði áður en því er fleytt. Fleiri en eitt element sem fleytt er í sömu átt munu sitja hlið við hlið lárétt svo lengi sem þau hafa pláss. Um leið og plássið er ekki til staðar mun elementi vera ýtt niður og „ný“ lína mynduð.

<div class="img">mynd</div>
<p>Lorem ipsum dolor sit amet…</p>
.img {
  float: left;
  margin: 0 10px 10px 0;
}

„Mynd“ er fleytt til vinstri og liggur við hliðina á texta.

Mynd frá höfundi.

Við getum stýrt flæðinu í kringum element sem er fleytt með clear eigindinu sem tekur við gildunum left, right, both eða sjálfgefna gildinu none. Ef við „hreinsum“ ekki innan foreldris, sem aðeins inniheldur element sem er fleytt, getum við lent í vandræðum þar sem það fær þá ekki hæð og fellur saman (collapses). Nokkrar leiðir eru til að koma í veg fyrir þetta en sú sem var vinsælust meðan float var meira notað var clearfix sem er sett á foreldrið og útbýr gervi-element á eftir því sem sér um að hreinsa.

.clearfix::after {
  content: '';
  display: table;
  clear: both;
}

Á einum tímapunkti var float töluvert notað til þess að stýra heildar útliti á síðum, t.d. til að fleyta dálkum til hliðar, við hliðina á meginmáli. Í dag ættum við ekki að nota float til að stýra útliti heldur aðeins til að fleyta elementum innan annars efnis, t.d. myndum sem eiga við texta. Til þess að stýra útliti notum við Flexbox eða CSS grid.

Kafli 15: Letur & litir

um 9 mínútna lestími.

15.1 Letur

Þegar við birtum texta er mikilvægt að huga að leturgerð og hvernig textinn er birtur, hvort sem það er sem meginmál, fyrirsagnir eða á einhvern annan hátt. CSS hefur mörg eigindi sem skilgreina hvernig það er gert.

Leturgerð segir til um hvaða hönnun á letri við notum til að birta texta. Í grunninn höfum við aðgang að almennum leturgerðum:

  • serif, letur með þverendum.
  • sans-serif, letur án þverenda.
  • cursive, letur sem lítur út fyrir að vera handskrifað.
  • monospace, letur þar sem allir stafir eru jafnbreiðrir.
  • fantasy, ævintýralegt letur.

og vef öruggum (web safe) leturgerðum sem aðgengilegar eru á lang flestum tækjum:

  • „Times New Roman“, serif týpa.
  • „Georgia“, serif týpa.
  • „Arial“ (sem ætti að skilgreina með Helvetica), sans-serif týpa.
  • „Verdana“, sans-serif týpa.
  • „Courier new“, monospace týpa.

Mismunandi leturgerðir og vef öruggar leturgerðir.

Mynd frá höfundi.

Við nýtum síðan font eigindi til að velja og breyta hvernig leturgerðin hagar sér:

  • font-family skilgreinir hvaða leturgerðir við notum sem forgangsröðuðum lista af strengjum skiptum með , (kommu) sem ætti alltaf að enda á vef öruggri leturgerð.
  • font-style, sjálgefið normal, skásetur letur með gildinu italic.
  • font-variant setur ýmsar breytur á leturgerð, t.d. að setja texta í small-caps.
  • font-weight setur þyngd letur í tölum (t.d. 700) eða heitum (t.d. bold).
  • font-size setur stærð leturs.
  • line-height setur hæð línu (hlutfall af leturstærð), skilgreint án einingar.

Dæmi þar sem margar stillingar á leturgerð eru settar:

p {
  font-family: helvetica, arial, sans-serif;
  font-style: italic;
  font-variant: small-caps;
  font-weight: bold;
  font-size: 1em;
  /* 1.5 línubil, ef grunnstærð er 16px mun línan verða 24px há */
  line-height: 1.5;
}

Með font shorthand getum við skilgreint mörg af þessum gildum í einu:

/* font: (style|variant|weight) size/line-height family; */
font: italic small-caps bold 1em/1.5 helvetica, arial, sans-serif;

Þegar við viljum setja textann okkar á baseline og fylgja vertical rhythm eða lóðréttum hrynjanda þurfum við að passa upp á hver og einasta lína og bil á milli þeirra séu margfeldi af grunnstærðinni okkar. Þessi grunnstærð er sett sem einhver tala sem við verðum síðan að fylgja í öllum útreikningum, til þess að geta séð að við séum að fylgja kerfinu okkar er hægt að setja inn línur sem hjálpa okkur að sjá kerfi.

15.1.1 Leturgerðir

Með @font-face at reglunni getum við sótt aðrar leturgerðir og gert þær aðgengilegar í CSS. Við skilgreinum hvað leturgerðin heitir og hvernig hún hagar sér (er hún italic eða bold o.s.fr.) og, hvar hana er að finna og á hvaða formi.

Dæmi þar sem Roboto leturgerðin er sótt í ./fonts/roboto.woff2 og hún skilgreind fyrir normal style og 400 weight. Leturgerðin er síðan notuð fyrir p element:

@font-face {
  font-family: 'Roboto';
  font-style: normal;
  font-weight: 400;
  src: url(path-to-font) format('woff2');
}
/* skilgreinum aðrar gerðir, t.d. italic, í öðrum @font-face blokkum */
p {
  font-family: 'Roboto';
  font-style: normal;
  font-weight: 400;
}

Athuguð að leturgerðin mun aðeins vera rétt fyrir skilgreind eigindi, ekki verður rétt birting ef við notum t.d. italic eða bold (weight stærri en 400). Það sem vafri mun gera er að nota gervi italic (e. faux italic) þar sem letrinu er einfaldlega hallað eða gervi bold (e. faux bold) útlit þar sem letrið er þykkt jafnt. Það er mjög mikill munur á þessu og alvöru hönnuðu letri þar sem búið er að hugsa út í útlit og lesanleika letursins.

Til þess að fá raun leturgerðina fyrir mismunandi stíla þarf að sækja þær allar sérstaklega (oft margar skrár sem hægir á síðu), eða nýta variable fonts.

Þegar við sækjum leturgerðir getum við lent í því að tæki sé búið að þátta allt HTMLið okkar og sé búið að birta all efni, en leturgerðin (eða leturgerðirnar) sé ekki komin. Ef við stillum það ekki sérstaklega getum við lent í því að efnið sé ósýnilegt þar til leturgerðin sé komin. font-display leyfir okkur að stjórna þessu. Fyrir utan auto sér þetta eigindi um að ákvarða og birta letur eins hratt og mögulegt er. Eftir biðtíma er leturgerð með minni forgang notuð. Hvort sé skipt út er síðan stillingaratriði:

  • auto, sjálfgefið, vafri sér um birtingu.
  • block, bíðum eftir leturgerð í stutta stund og skiptum út þegar hún er sótt.
  • swap, bíðum í mjög stutta stund eftir leturgerð og skiptum út þegar hún er sótt.
  • fallback, bíðum í mjög stutta stund eftir leturgerð og í stuttan tíma eftir henni til að skipta.
  • optional, bíðum í mjög stutta stund eftir leturgerð og skiptum ekki út eftir það.

Variable fonts er nýleg tækni þar sem leturgerðir eru hannaðar og útfærðar þannig að hægt sé að stilla og stjórna útliti þeirra. T.d. er hægt að stilla þyngd mun nánar, oft alveg frá mjög „léttu“ (200) letri yfir í mjög „þungt“ (900). Þetta þýðir að aðeins þarf að sækja eina leturgerð og hægt er að fá allar útgáfur (og töluvert fleiri) af birtingu þess leturs. Margar af þessum breytum fylgja hefðum úr gerð stafrænna leturgerða og geta því verið óljósar.

p {
  font-variation-settings:
    'wght' 375, /* weight */
    'wdth' 100, /* width */
    'opsz' 16,  /* optical size */
    'GRAD' 88;  /* Grade */
}

Annar kostur við að geta breytt þessum gildum með CSS er að við getum notað kvikun og látið letrið okkar „lifna við“.

Nokkrar þjónustur eru til sem bjóða upp á ókeypis leturgerðir, til dæmis:

  • Google Fonts hefur mörg hundruð leturgerðir í boði og býður upp á hýsingu svo einfalt er að byrja að nota þær leturgerðir. Bjóða upp á variable leturgerðir.
  • Font Squirrel hefur einnig margar leturgerðir í boði en hægt er að sækja þær leturgerðir og hýsa sjálf.

15.1.2 Texti

Við getum breytt útliti á texta:

  • text-transform stýrir hvort texti sé aðeins í hástöfum (uppercase), lágstöfum (lowercase) eða hver stafur í hástöfum (capitalize).
  • text-decoration stýrir strikun gegnum texta, underline, overline eða line-through.
  • letter-spacing stýrir hversu mikið bil er milli hvers stafs, yfirleitt sett í em, þ.a. letter-spacing: 1em; setur eitt leturbil milli hvers stafs. Neikvæð tala dregur texta saman.
  • text-shadow setur skugga á letur text-shadow: offset-x | offset-y | blur-radius | color þar sem offset gildi segja til um hversu mikið skuggi er dreginn eftir x eða y ás.

Texta er hægt að skipta upp í dálka með columns. Við tilgreinum hámarksfjölda dálka sem við viljum skipta textanum í með column-count og hversu breiðir þeir mega í minnsta lagi vera með column-width. Vafrinn reiknar síðan út hvernig dálkar birtist best m.v. stærð foreldis, glugga o.s.fr. column-gap getur einnig tekið lengd og er þá pláss á milli dálka, column-rule getur skilgreint línu sem skiptir dálkum.

section {
  columns: 3 14em;
  column-gap: 2em;
  column-rule: inset 1px #999;
}
writing-mode eigindið leyfir okkur að stilla það hvort texti sé teiknaður lóðrétt eða lárétt og hvar hann byrjar.
writing-mode: horizontal-tb;
/* sjálgefið, lárétt frá vinstri til hægri, lóðrétt frá toppi til botns */
writing-mode: vertical-rl;
/* lárétt hægri til vinstri, lóðrétt frá toppi til botns */
writing-mode: vertical-lr;
/* lárétt vinstri til hægri, lóðrétt frá toppi til botns */

15.1.3 Prentstílar

Við getum haft áhrif á það hvernig vefirnir okkar prentast út með CSS. Það á helst við síðan sjálf hefur mikið af óþörfum elementum fyrir prentun, t.d. valmynd eða fótur eða stýra því hvar síða má skiptast, t.d. viljum við ekki að mynd prentist á tveim síðum. Bæði er hægt að vísa sérstaklega í prent css með <link rel="stylesheet" media="print" href="print.css"> eða nota at-reglu:

@media print {
  nav,
  footer {
    display: none; /* ekki birta valmynd eða fót */
  }
  img {
    page-break-inside: avoid; /* forðast að prenta myndir á tveim síðum */
  }
}

15.2 Bakgrunnur og litir

Þegar við vinnum með myndir í CSS er það sem bakgrunnur á element. Við tilgreinum hvaða mynd á að birta og stillum síðan birtinguna á henni

  • background-color setur lit á bakgrunn, sjálfgefið gildi er gegnsætt (transparent).
  • background-image setur mynd á bakgrunn eftir slóð.
  • background-repeat segir til um hvernig bakgrunnurinn endurtekur sig, repeat og hann endurtekur sig á báðum ásum, repeat-x og repeat-y skilgreina endurtekningu á einum ás.
  • background-attachment skilgreinir hvernig bakgrunnur hagar sér í skrolli – með (scroll) eða fastur (fixed).
  • background-position skilgreinir hvar myndin birtist eftir lykilorðum (right, left, top, bottom, center), nákvæmum einingum eða hlutföllum.
  • background-size skilgreinir hvernig fara eigi með stærð myndar innan elements, t.d. background-size: contain skalar mynd þannig að hún verði eins stór og mögulegt sé án þess að teygja eða klippa af mynd eða background-size: cover skala mynd í að vera eins stór og mögulegt sé en ef hún fyllir ekki út í element er hún klippt lóðrétt eða lárétt til að hún passi.

Til að skilgreina margt af þessu í einu getum við notað background shorthandið:

/* background: [color] [image] [repeat] [attachment] [position] */
background: #fff url(bg.png) no-repeat left top; /**/

Við getum skilgreint stigul (gradient) sem bakgrunn á element en það eru litir sem blandast saman eftir ákveðnum formerkjum. Vafrar hafa mismunandi útfærslur og þarf að skilgreina með vafraforskeytum og gott að nota tól, t.d. Ultimate CSS Gradient Generator.

Til að breyta lit á texta elements notum við color.

15.2.1 Gegnsæi

Með rgba() og hsla() getum við stýrt því hversu gegnsæir litir eru frá, 0 alveg gegnsætt upp í 1 ekki gegnsætt.

Við getum einnig stýrt því hversu gegnsætt allt efni í elementi er með opacity sem tekur tölu frá 0 og upp í 1. Oft notum við opacity þegar við erum að láta eitthvað birtast eða hverfa á vefnum okkar. Einnig getum við notað opacity til að útbúa mjög mikið gegnsætt lag yfir myndir sem við ætlum að setja texta ofan á. Það gerir það að verkum að þó svo að myndin breytist muni textinn alltaf vera sýnilegur (t.d. ljós texti ofan á mynd með miklu hvítu).

.half-opaque {
  /* bakgrunnslitur er hálf gegnsær en allur texti mun vera ógegnsær */
  background-color: rgba(0, 0, 0, 0.5);
  color: #fff;
}
.protection {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  /* 80% gegnsæ vörn sem hægt er að setja ofan á mynd svo texti sjáist */
  background-color: rgba(255, 255, 255, 0.2);
}
.almost-all-opaque {
  /* allt efni í elementi er næstum alveg gegnsætt */
  opacity: 0.1;
}

15.2.2 Bakgrunnur í stað texta

Stundum höfum við element sem inniheldur texta en útlitslega viljum við birta mynd og hafa stjórn með CSS, t.d. logo í staðinn fyrir heiti fyrirtækis. Það væri einfaldlega hægt að hafa tómt element og bæta síðan myndinni á með CSS en aðgengislega gengur það ekki. Við getum haldið textanum á sínum stað til að hann sé lesinn en falið hann sjónrænt með CSS trikkum.

.hide-text {
  text-indent: 100%;
  white-space: nowrap;
  overflow: hidden;
}

Kafli 16: CSS stuðningur

um 8 mínútna lestími.

16.1 Progressive enhancement

Hugtakið um progressive enhancement segir að við eigum að einbeita okkur að upplifun sem krefst minnstu mögulegrar tækni og bæta hana í lögum, progressively. Á hverju af þessum lögum nær notandi að upplifa efnið okkar. Þetta má hugsa í tilfelli vefforritunar svona:

  1. Skrifum áhugavert, skýrt efni.
  2. Setjum það upp með aðgengilegu, merkingarfræðilegu HTML.
  3. Bætum við grunn útliti sem er vel stutt.
  4. Bætum við flóknara útliti sem er e.t.v. minna stutt.
  5. Bætum við aukinni virkni með JavaScript.

Með hverju skrefi verður vefurinn fallegri, skemmtilegri og meira töff fyrir einhverjar skilgreiningar af þessum orðum. En, á hverju stigi er efnið okkar, aðal ástæða fyrir vefnum okkar, aðgengilegt.

16.1.1 Shim og polyfill

Almennt er talað um shim sem virkni sem „stungið“ er inn í umhverfi til þess að veita nýja virkni í gömlu umhverfi (eða öfugt, gamalli virkni í nýrra umhverfi). Þegar umhverfið er síðan uppfært ætti shim virknin að detta út og allur kóði ætti að virka í nýja umhverfinu. Þessi virkni er e.t.v. ekki alveg kórrétt eða hröð, en hún veitir fyrr aðgang að nýrri virkni.

Fyrir vefinn er talað um polyfill sem kóða sem veitir aðgang að nýrri virkni áður en allir vafrar bjóða upp á hana, þ.e.a.s. polyfill er shim fyrir vafra virkni. Polyfill eru ekki eingöngu fyrir CSS virkni heldur eru til polyfill fyrir mikið af virkni sem komið hefur til á seinustu árum og koma einhversskonar stuðningi í jafnvel elstu vafra, sjá t.d. HTML5 Cross Browser Polyfills.

16.1.2 CSS og progressive enhancement

Við getum notað í dag virkni sem verður ekki að fullu studd í öllum vöfrum fyrr en í framtíðinni og við höfum plan um hvernig. Í því plani tökum við tillit til þess að:

  • Ákveða hvaða vafra og stýrikerfi við ætlum (eða ætlum ekki að styðja).
  • Prófa í viðeigandi tækjum.
  • Nýta okkur progressive enhancement.

16.2 „Nýleg“ virkni í CSS

Ný veftækni er ekki alltaf að fullu studd í öllum vöfrum sem notaðir eru dagsdaglega. Við viljum því ekki nota þá virkni blint ef það getur á einhvern hátt dregið úr upplifun notenda. Það eru nokkrar leiðir til að skrifa CSS með þetta allt saman í huga. Eftir því sem árin líða og vafrar eru fljótari að bæta við virkni (eða vöfrum fækkar…) á þetta minna við, samt sem áður þarf að hugsa um þetta til að skilja ekki einhverja sem heimsækja vefina okkar eftir úti í kuldanum.

Auðveld leið er að skilgreina fallback gildi, en það er gildi sem við eru viss um að allir vafrar styðji áður en við skilgreinum gildi sem nýtir nýrri tækni sem ekki er að fullu studd.

width: 99%;
width: calc(100% - 30px);

Fallið calc() leyfir okkur að reikna saman lengdir sem hafa mismunandi lengdir. T.d. getum við reiknað calc(50% - 2px); og miðað við hvað 50% verður reiknað sem, verða 2px dregnir frá þeirri stærð þegar notað gildi er fundið.

Önnur leið sem vafraframleiður bjóða upp á (eða, buðu upp á) er að nota vafraforskeyti (vendor prefixes) á ákveðnum eigindum og gildum. Þá er boðið upp á virknina áður en vafrinn er með fullkominn stuðning eða á meðan staðallinn er ekki að fullu skilgreindur. Þetta hefur farið minnkandi seinustu ár þar sem vefforritarar uppfærðu ekki endilega vefi eftir að forskeyti urðu óþarfi og vafrar urðu að halda áfram að styðja þau.

display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;

Ekki er æskilegt að handskrifa vafraforskeyti heldur nota sjálfvirk tól til að sjá um, t.d. autoprefixer.

Báðar þessar leiðir nýta sér villumeðhöndlun CSS: eigindi og gildi sem ekki eru þekkt af vafra er einfaldlega sleppt og næsta er skoðað.

caniuse.com hefur yfirgripsmikinn gagnagrunn yfir stuðning vafra á ákveðinni virkni. Við getum nýtt okkur þennan gagnagrun til að taka ákvörðun um það hvort það sé þess virði að leggja í að nota nýja virkni yfir höfuð fyrir verkefnið okkar.

16.2.1 Feature queries

Nýlegri leið til að skrifa CSS sem ekki er tryggt að allir vafrir styðja er að nota feature queries með @supports at-reglunni. @supports leyfir okkur að athuga hvort að eigindi og gildi séu studd, þá getum við innan reglunnar skilgreint CSS sem er notað. Það ber þó að fara sparlega með notkun á þessu og ætti aðeins að nota ef við þurfum að skrifa fleiri en eina línu af CSS, hugsanlega með nýrri virkni og eldri í bland. Ef við ætlum einfaldlega að bæta við virkni í einni línu þá notum við fallback.

/* ef við getum breytt því í hvaða átt texti er skrifaður með writing mode
   gerum það *og* fleytum texta til vinstri */
@supports (writing-mode: vertical-lr) {
  h1 {
    float: left;
    writing-mode: vertical-lr;
  }
}
/* ekki gera svona, bara bæta við border-radius sem progressive enhancement */
@supports (border-radius: 50%) {
  .box {
    border-radius: 50%;
  }
}

16.2.2 CSS custom properties

CSS custom properties (eða CSS variables) leyfa okkur að skilgreina breytur, t.d. fyrir lit, ákveðna lengd eða eitthvað annað sem er mikið notað. Þetta leyfir okkur að gera breytingar á auðveldari máta og getur bætt lesanleika. Breyturnar eru skilgreindar með --<heiti> en það er vegna þess að þær nýta sömu hugsun og í vafraforskeytum og eru í raun að nota tóma forskeytið. Til þess að nýta breytu notum við var(--<heiti>) fallið í CSS. Ef breyta er ekki skilgreind getum við sent aðra færibreytu sem er þá fallback gildi, var(<breyta>, #000). Breytur sem skilgreindar eru munu erfast frá foreldri til barns og eru háðar cascade.

<h1>Halló <span>heimur</span></h1>
<p><span>bless</span></p>
h1 {
  --main-color: #f0f;
  color: var(--main-color);
}
span {
  color: #000;
  /* ef við höfum aðgang að breytu er hún notuð, annars #000 */
  background-color: var(--main-color, #0f0);
}

Litum stýrt með CSS breytum.

Mynd frá höfundi.

Til þess að skilgreina breytur alveg efst í trénu svo hún sé aðgengileg öllu getum við notað :root gerviklasann (pseudo-class). Þessi gerviklasi er alltaf jafngildur rótinni á skjalinu sem er verið að stíla. Fyrir HTML væri það eins og að skilgreina fyrir html nema :root hefur hærri sértækni.

:root {
  --main-color: #f0f;
}
h1 {
  color: var(--main-color);
}

Aðrir hlutir sem við getum gert með CSS breytum:

  • Breytt dýnamískt gildi með því að setja breytu með style attribute.
  • Margfaldað tölulegt gildi breytu með calc(), t.d. calc(--multiplier * 1em).
  • Skilgreint mörg gildi í einu, t.d. --margins: 10px 20px;, margin: var(--margins);.

16.2.3 Border radius

Hægt er að rúnna horn á boxi með border-radius, það virkar hvort sem border hafi verið skilgreindur eða ekki. Líkt og með border er border-radius shorthand fyrir border-top-left-radius o.s.fr.

Ef við skilgreinum eina tölu er miðað við hringlaga horn en tvær tölur miða við sporöskjulaga horn. Hægt er að nota t.d. border-radius generator frá Mozilla til að skilgreina hin fullkomnu rúnuðu horn.

16.2.4 Box shadow

Líkt og með skugga á texta getum við skilgreint einn eða fleiri skugga á boxum. Þessir skuggar geta bæði legið utan (outset, sjálfgefið gildi) eða innan boxsins (inset). Við skilgreinum hvernig skugginn liggur frá boxinu á x og y ás, hversu mikið hann er bluraður, hvernig hann dreifist og hvernig hann er á litinn. Fyrir flóknari skugga má nota box-shadow generator frá Mozilla.

16.2.5 CSS shapes

Þar sem lang flest í CSS er skilgreint sem rétthyrnt box getur verið skemmtilegt að brjóta upp þessi box og gera eitthvað öðruvísi. CSS shapes leyfa okkur skilgreina hvernig inline element leggjast upp að boxunum okkar, í staðinn fyrir að nota ytra byrði þeirra. Við getum skilgreint form (t.d. hring, polygon) eða alpha channel á mynd, þau svæði myndar sem eru gegnsæ. Í dag er hægt að nota í einhverjum vöfrum shape-outside sem leyfir að gera þetta fyrir efni utan boxa, en unnið er að skilgreiningu á shape-inside.

img {
  float: left;
  /* efni leggst eftir sporöskjulaga ferli utan um myndina */
  shape-outside: ellipse(50% 50%); 
  margin: 1em;
}

Texti legst upp að mynd með gegnsæan hluta.

Mynd frá höfundi.

16.2.6 object-fit

Þegar við fellum inn annað efni á síðuna okkar, eins og mynd með <img> þá gætum við þurft að skilgreina hvernig það meðhöndlað til að passa í foreldri sitt. Með object-fit getum við skilgreint nokkrar leiðir til að meðhöndla:

  • object-fit: fill;, sjálfgefið, fyllir algjörlega út í foreldi. Ef stærðarhlutföll (aspect ratio) passar ekki, er hlutur teygður
  • object-fit: cover;, hlutur fyllir út í box en stærðarhlutföllum er haldið, ef hlutur passar ekki er klippt af honum
  • object-fit: contain;, hlutur fyllir út í box en stærðarhlutföllum er haldið, ef hlutur passar ekki er hann skalaður, getur myndast „letterbox“
  • object-fit: none;, ekkert er átt við hlut

Einnig er hægt að stýra staðsetningu hlutar í tvívíðu rúmi með object-position: <x-ás> <y-ás>;. Sjálfgefið gildi er object-position: 50% 50%;, hlutur er miðjaður.

Dæmi um hvernig object-fit kemur mynd fyrir, mynd er skilgreind til að vera nákvæmlega 600x200.

Mynd frá höfundi.

Kafli 17: Flexbox

um 5 mínútna lestími.

Það kom snemma í ljós að noktun á visual formatting model með position og float var ekki nóg til að gera flókin útlit. Sérstaklega getur verið erfitt að nota það til að útbúa útlit þar sem hlutir voru jafn háir eða eru miðjaðir lóðrétt innan foreldris. Flexbox var búið til með það að leiðjarljósi að einfalda gerð flókinna útlita og bjóða upp á meiri sveigjanleika.

Í júli 2009 kom fyrsta útgáfa af staðlinum sem kynnti til leiks display: box; sem síðan í mars 2011 breyttist í display: flexbox; sem að lokum endaði í display: flex; árið 2012 þegar fyrsta candidate recommendation kom út. Stuðningur við flexbox (með vafraforskeytum) er í dag mjög mikill og er aðalleiðin til þess að útbúa útlit í dag.

Flexbox er skilgreint með því að setja display eigindið display: flex; en þá er element í eðlilegu flæði og börnum þess er raðað með flexbox. Einnig er hægt að setja display: inline-flex; en þá er element túlkað inline í eðlilegu flæði en börnum þess raðað með flexbox. Þegar börnum elements er raðað með flexbox er margin á alla kanta gleypt með auto, ekki bara lárétt.

Börn elements sem er raðað með flexbox eru kölluð flex items. Þau raðast sjálfgefið í þeirri röð sem þau eru skilgreind í HTML en við getum breytt þeirri röðun með order eigindinu. Hægt er að skilgreina order fyrir hvert flex item og er þeim síðan raðað þar sem hærri tala raðar flex item seinna. Sjálfgefið gildi er order: 0;.

Þegar flexbox er notað til að skilgreina útlit er mikilvægt að gera greinarmun á elementi sem hefur display: flex; (flexbox/flex container) og börnum þess (flexbox/flex items). Það mun ekki virka að skilgreina flexbox eigindi fyrir container á flex items en það er hinsvegar hægt að láta flex items væra bæði flex item og flex container.

17.1 Ásar

Ásar í flexbox.

Mynd frá W3C.

Í flexbox eru skilgreindir tveir ásar, aðalás (e. main axis) og krossás (e. cross axis) sem eru hornréttir hvorn annan. Með því að nota flex-direction getum við skilgreint aðalásin:

  • flex-direction: row;, sjálfgefið gildi, aðalás frá vinstri til hægri (eða hægri til vinstri ef texti er lesinn þannig).
  • flex-direction: row-reverse;, aðalás frá hægri til vinstri.
  • flex-direction: column;, krossás (m.v. row) verður skilgreindur sem aðalás og öfugt. Aðalás frá toppi til botns.
  • flex-direction: column-reverse;, eins og column en aðalás frá botni til tops.

Athugið að ekki er skilgreint með heitum á áttum (t.d. left) þar sem flexbox á að virka óháð því hvort verið sé að teikna útlit þar sem lesið er frá vinstri til hægri, hægri til vinstri eða frá toppi niður. Þetta heldur áfram í CSS staðli fyrir logical properties þar sem búið er að bæta við lógískum heitum við hluti sem hafa beina vísun í vídd eða átt. block og inline er notað sem grunn hugtök um í hvaða átt texti flæðir ásamt start og end, t.d. margin-inline-start: 1px; eða border-block-start-width: 1px;.

Sjálfgefið er öllum flex itemum troðið á aðalás og þau minnka í samræmi til að fá pláss. Hægt er að nota flex-wrap til að láta flex item flæða í nýja flex-línu ef ekki er nóg pláss:

  • flex-wrap: nowrap;, sjálfgefið, ekki flæða í nýja línu.
  • flex-wrap: wrap;, ef það er ekki pláss, flæða í nýja línu (vinstri hægri eða hægri vinstri ef texti lesinn þannig).
  • flex-wrap: wrap-reverse;, eins og wrap en í öfugri röð.

17.2 Röðun á ás

Til að skilgreina hvernig flex item er raðað á aðalás notum við justify-content:

  • justify-content: flext-start;, sjálfgefið, raðar við byrjun á ás.
  • justify-content: flex-end;, raðar við enda á ás.
  • justify-content: center;, raðar fyrir miðju áss.
  • justify-content: space-between;, dreifir plássi milli flex itema.
  • justify-content: space-around;, dreifir plássi milli og utanum flex item.

Mismunandi röðun með justify-content.

Mynd frá W3C.

Staðsetningu innan línu á krossás er skilgreind með align-items:

  • align-items: stretch;, sjálfgefið, jafnar við stærstu línu.
  • align-items: flex-start;, byrjun línu.
  • align-items: flex-end;, enda línu.
  • align-items: center;, miðju línu.
  • align-items: baseline;, jöfnuð við baseline.

Mismunandi röðun með align-items.

Mynd frá W3C.

Með align-self getur hvert og eitt flex item skilgreint hvernig það hagar sér m.t.t. align-items.

Til að breyta staðsetningu lína á krossás notum við align-content, en það hefur því aðeins áhrif ef flex-wrap er ekki no-wrap.

  • align-content: stretch;, sjálfgefið, línur teygðar til að taka allt pláss.
  • align-content: flext-start;, raðar við byrjun á ás.
  • align-content: flex-end;, raðar við enda á ás.
  • align-content: center;, raðar fyrir miðju áss.
  • align-content: space-between;, dreifir plássi milli flex itema.
  • align-content: space-around;, dreifir plássi milli og utanum flex flex item.

Mismunandi röðun með align-content.

Mynd frá W3C.

17.3 Stærðir á flex item

Við getum stýrt því hvernig flex item taka pláss innan flexbox með flex-grow, flex-shrink og flex-basis.

Við skilgreinum flex-grow með rauntölu, stærri en 0 og skilgreinir hvernig flex item stækkar, sjálfgefið er 0.

  • Ef öll flex item hafa flex-grow: 1; taka þau öll jafnt pláss.
  • Ef öll hafa 1 en eitt þeirra hefur 2 mun það taka tvisvar sinnum meira pláss (eins og hægt er) en hin flex item fá jafn mikið af plássi sem eftir er.
  • Ef aðeins eitt flex item hefur flex-grow skilgreint mun það taka allt pláss sem önnur flex item þurfa ekki.

Við skilgreinum flex-shrink eins og flex-grow en það stýrir því hvern flex item minnkar, sjálfgefið er 1.

Upprunastærð á flex item er skilgreind með flex-basis, þá getum við skilgreint hversu mikið pláss flex item á að taka áður en plássi er dreift til flex itema, sjálfgefið er auto.

Þessi þrjú eigindi ætti alltaf að skilgreina með flex eigindi en það stillir óskilgreind gildi rétt m.v. sett gildi. Í flestum tilfellum ætti að vera nóg að setja gildið sem:

  • initial, sjálfgefið, flex item minnka ef ekki er nóg pláss en stækka ekki umfram width og height gildi sín.
  • auto, stærð skv. width og height en stækkar til að fá auka pláss í flexboxi.
  • none, flex item stækka hvorki né minnka.
  • <tala>, tilgreinir hlutfall sem flex item fær af plássi.

Kafli 18: Skalanlegir vefir

um 12 mínútna lestími.

The web’s greatest strength, I believe, is often seen as a limitation, as a defect. It is the nature of the web to be flexible, and it should be our role as designers and developers to embrace this flexibility, and produce pages which, by being flexible, are accessible to all.

Skalanleg vefhönnun (e. responsive web design) er þegar við sættum okkur við það að vefurinn hvorki er né verður birtur í einni fastri „fullkominni“ stærð sem við hönnum fyrir. Hann er eins margbreytilegur og tækin sem hann birtist í. Að sætta sig við fjölbreytileika vefsins krefst þess að við bæði hönnum og forritum vefina okkar með það í huga.

Vefurinn er ekki ein föst skjástærð

Vefurinn er ekki ein föst skjástærð.

Mynd frá Brad Frost:
http://bradfrost.com/blog/post/this-is-the-web/
Vefurinn er margar skjástærðir á mörgum tækjum

Vefurinn er margar skjástærðir á mörgum tækjum.

Mynd frá Brad Frost:
http://bradfrost.com/blog/post/this-is-the-web/
Vefurinn mun aðeins halda áfram að verða flóknari

Vefurinn mun aðeins halda áfram að verða flóknari.

Mynd frá Brad Frost:
http://bradfrost.com/blog/post/this-is-the-web/

Fyrir tíma snjallsíma (fyrir árið 2007, þegar fyrsti iPhone kom út) voru vefir langflestir forritaðir fyrir fastar skjástærðir. Þær stærðir sem voru vinsælastar á hverjum tíma voru þær sem flestir notendur höfðu á sínum skjám. Í fyrstu 640×480 skjáir (640 pixel breiða og 480 pixel háa), síðan 800×600 og að lokum aðallega fyrir 1024×768 skjái. Þegar komið var að 1024×768 upplausn myndaðist samstaða um að hann fyrir 960px væri algildur grunnur, þar sem sú tala deilist þægilega. Þegar snjallsímar komu fyrst á markað og fólk fór að skoða vefi hannaða fyrir 960px í töluvert minni skjám var lausnin yfirleitt sú að hanna sérstaka „mobile“ vefi sem aðeins voru ætlaðir fyrir minni skjái, þá yfirleitt á m lénum, t.d. m.example.org.

Árið 2010 skrifaði Ethan Marcotte greinina „Responsive Web Design“ í A List Apart þar sem hann kynnti aðferð til að hanna og byggja vefi sem ekki voru fastir í þessum viðjum, heldur sköluðu upp og niður með tækjum sem þeir birtust í. Þessari grein fylgdi hann svo eftir með bók með sama nafni árið 2011. Skalanleg vefhönnun byggir á þremur atriðum, í mikilvægis röð:

  1. Sveigjanlegu umbroti, byggðu á grind.
  2. Sveigjanlegum myndum og miðlum.
  3. CSS media queries.

Þegar verið er að hanna eru grindur oft notaðar til þess að hafa undirliggjandi skipulag á því hvernig efnið er sett upp. Í stað þess að raða efni úti um hvippinn og hvappinn er röð og regla til staðar. Grindur eru yfirleitt notaðar fyrir lárétta staðsetningu á vefnum. Með því að nota bæði grind og lóðréttum hrynjanda (e. vertical rhythm) getum við skipulagt efnið okkar bæði lóðrétt og lárétt.

Dæmi um grind í prent hönnun.

Mynd frá Wikimedia:
https://commons.wikimedia.org/wiki/File:Grid2aib.svg

Með því að útfæra skalanlega vefi getum við birt sama efnið, með sama HTML, á sömu slóð en aðlögum okkur að allskonar tækjum. Útlitið er ekki alltaf eins, en efnið okkar er nothæft í öllum stærðum.

Þó svo að á fyrstu árum eftir að skalanleg vefhönnun kom fram á sjónarsviðið hafi verið talað um hana sérstaklega, þá er hún í dag (að mestu leiti) farin veg töflulausar hönnunar. Við gerum einfaldlega ráð fyrir því að vefir í dag skali með tækjunum sem við notum. Að gera það ekki frá grunni skilar sér í slakari vefjum sem erfitt er að laga eftir á.

Annað hugtak sem kom upp á svipuðum tíma og skalanleg vefhönnun er mobile first. Luke Wroblewski skilgreindi hugtakið í bók sem einnig kom út hjá A Book Apart. Mobile first beitir progressive enhancement á það að byggja skalanlegan vef, við byrjum á því að einblína á upplifun á minni skjám. Með því að byrja með minna pláss neyðumst við til þess að taka ákvarðanir um það hvað sé virkilega mikilvægt. Það einfaldar ákvörðunartöku um hvað sé raunverulega mikilvægast og setur efnið í fyrsta sætið.

18.0.1 Sveigjanleg grind

Þegar við vinnum með sveigjanlega grind megum við ekki skilgreina neinar breiddir í nákvæmum stærðum, við verðum að nota hlutfallslegar stærðir. Með því að notafæra okkur formúluna target ÷ context = result getum við breytt úr nákvæmu gildi í hlutfallsegt fyrir breiddir, margin, padding og letur. T.d. ef við höfum 1600px umgjörð og innan hennar erum við með efnissvæði sem á að vera 1200px. Þá getum við sett umgjörðina með max-width: 1600px; og efnissvæðið með 1200px ÷ 1600px = 0.75 eða width: 75%;.

Með sveigjanlegri grind festum við ekki stærð hennar í ákveðnum pixlum. Við skilgreinum fjölda dálka (oft eru 12 dálkar notaðir), bil á milli þeirra (kallað gutter) og hámarksstærð svæðis. Síðan reiknum við stærð hvers dálks sem 100% / <fjöldi dálka>. Innan grindarinn búum við síðan til raðar og dálka sem passa í grindina og staðsetjum efnið okkar í þeim. Fyrir hverja röð viljum við almennt ekki hafa samtölu dálka hærri en fjölda dálka. Það er þó hægt að „brjóta grindina“ til að láta efni standa út úr.

Það er ekki krafa að byrja hvern dálk nákvæmlega í fyrsta. Með því að nota margin getum við fært dálka innan grindar svo lengi sem gildin eru hlutfallsleg, t.d. miðjað 50% dálk með margin-left: 25%;11 Þetta dæmi notar margin og flexbox en yfirleitt ættum við að nota CSS grid í dag til þess að útfæra grindur..

Þegar við erum að vinna með grindur er oft búið að skilgreina grind í hönnunarskjölum og getur þá verið gott að hafa þá grind sem við stefnum að lagða yfir (e. overlayed) á efnið okkar, t.d. með aðferð í greininni „Building a CSS Grid Overlay“.

<div class="grid">
  <div class="row">
    <div class="col-6">50% dálkur</div>
    <div class="col-6">50% dálkur</div>
  </div>
</div>
.grid {
  max-width: 1600px;
}
.row {
  display: flex;
  margin-left: -10px;
  margin-right: -10px;
}
.col-6 {
  /* gutter verður 20px */
  padding-left: 10px;
  padding-right: 10px;
  width: 50%;
}
Skjáskot

Skjáskot af birtingu á grind með grid overlay sem aðstoðar við að viðhalda réttri grind.

Skjáskot frá höfundi.

Þegar við skilgreinum grind með bili í CSS setjum við helming bilsins sem padding sitthvoru megin á hvern dálk þ.a. þegar þeir liggja hlið við hlið þá verður til heilt bil. Til þess að halda samræmi stækkum við röðina í samræmi um eitt bil með því að draga röðina út sitthvoru megin um hálft bil.

Grindina notum við fyrir layout, skipulag á aðalatriðum á vefnum. Innan grindar falla síðan efnissvæði, hlutir, myndir og miðlar. Fyrir hvern ef þessum hlutum látum við þá fylla upp í 100% af mögulegri breidd foreldris, nota border-box: box-sizing; og almennt ekkert margin þ.a. þeim sé alveg stjórnað af dálkum grindarinnar. Ef við skilgreinum margin er það yfirleitt margin-bottom en það gerir það að verkum að hver hlutur ýtir hlutum aðeins frá sér að neðan og við þurfum ekki að hugsa um collapsing margin. Lárétt margin myndu rugla í grindinni.

18.0.2 Sveigjanlegar myndir og miðlar

Þegar við erum að útfæra vefi sem eiga að birtast í mörgum mismunandi skjástærðum getum við ekki sett inn myndir og miðla sem eru af fastri stærð. Mynd sem er 1200px breið og á að birtast í dálk sem búið er að skala niður í 600px mun ekki birtast snyrtilega nema við gerum ráðstafanir. Við getum fest breidd mynda og miðla við breidd foreldris og látið skalast og þurfum þá aðeins að skilgreina max-width: 100%; en þá mun efnið alltaf fylla upp í breiddina. Við getum átt við hvernig efnið birtist með því að skera (crop) myndina til, object-fit getur hjálpað okkur við að skilgreina hvernig myndin er skorin eða sköluð og þá stundum í samhengi við height og overflow: hidden;.

img {
  /*
  mynd skalast þ.a. hún fyllir alltaf upp í
  lárétt pláss í foreldri og ekki meira
  */
  max-width: 100%;
}

Ef við viljum viðhalda stærðarhlutföllum nákvæmlega getum við skilgreint aspect-ratio eigindi:

.image {
  aspect-ratio: 16 / 10;
}

þar sem gildi er ratio gildi: hlutfall breiddar og hæðar (eða gildið 1) eða auto sem notar hlutfall innfelds efnis og er sjálfgefið gildi.

Einnig væri hægt að nota „trikk“ sem nýtir sér gervi-element, barn sem fyllir upp í foreldri sitt, og það að padding-top með hlutfallslegri tölu reiknast út frá width:

<div class="box">
  <div class="content">16:10 efni</div>
</div>
.box {
  position: relative;
  width: 100%; /* fyllir upp í foreldri sitt, t.d. dálk */
}
.box::before {
  content: '';
  display: block;
  padding-top: 62.5% /* fyrir 16:10 setjum við 10/16*100=62.5% */
}
.content {
  /* fyllir upp í foreldri sitt */
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
  background-color: red;
}

18.0.3 Media queries

Með media queries getum við skilgreint „brotpunkta“ (e. breakpoints) í hönnun þar sem við breytum á einhvern hátt hvernig layout á vef hagar sér. Við miðum við heildar breidd á viewport og getum skilgreint CSS sem er notað upp að ákveðinni breidd, frá ákveðinni breidd, eða blandað þessu saman til að skilgreina á bili, skilgreint eins fyrir hæð og, fleira.

Við getum (og ættum) að beita progressive enhancement/mobile first þegar við notum media queries. Það þýðir að grunnstílar ættu að skilgreina hvernig hlutur lítur út þegar hann fyllir alveg út í pláss sitt – er í minnstri upplausn, t.d. í snjallsíma. Eftir því sem hlutur fær meira pláss skilgreinum við media queries sem breyta hegðun með auknu plássi.

/* almennt er section 100% breitt */
section {
  width: 100%;
}
/* frá 800px breiðum viewport er section 50% breitt */
@media (min-width: 800px) {
  section {
    width: 50%;
  }
}

Fyrir grindina verður það þó skrítið ef við byrjum að breyta dálka skilgreiningum með media queries. T.d. ef við höfum .col-6 sem á að taka 6 dálka af 12 en allt í einu frá og með einhverri breidd verða það 4 af 12 eða 12 af 12. Ein lausn á þessu er að útbúa skilgreiningar sem taka fram fyrir almennu skilgreininguna og nýta „flæðið“ og media queries til að fá mismunandi gildi eftir upplausn, t.d. .col-6 .col-sm-12, almennt taka 6 af 12 dálkum en í sm (small) upplausn, taka 12 af 12.

<div class="grid">
  <div class="row">
    <div class="col col-6 col-sm-12">
      <div class="box">50% dálkur almennt, 100% í minni upplausn</div>
    </div>
  </div>
</div>
.col-6 {
  width: 50%;
}
/* skilgreint seinna í skjali og fær því forgang */
@media (max-width: 599px) {
  .col-sm-12 {
    width: 100%;
  }
}

Önnur leið er að skilgreina ekki .col utan um efnið sjálft heldur láta hvern „hlut“ innan grindar stýra sinni stærð. T.d. ef við viljum að efni innan <section> falli að grind:

<div class="grid">
  <div class="row">
    <section class="my-box"></section>
    <section class="my-box"></section>
    <section class="my-box"></section>
  </div>
</div>
.my-box {
  width: 100%;
}
@media (min-width: 800px) {
  .my-box {
    padding-left: 10px;
    padding-right: 10px;
    width: 33.33333333%;
  }
}

Stór kostur við þessa lausn er að við þurfum ekki mikið af sértækum .col-x-n hjálpar klösum, heldur skilgreinir efnið sig innan grindar. Ókostur er að ef það er ósamræmi í media-queries (hvenær skipt er á milli) getur útlitið okkar orðið ósamræmt, t.d. í einhverri breidd eru box að taka 100% en önnur fyrir neðan taka 50% þó þau séu ca. jafn stór.

18.0.4 Skalanlegir vefir og upplausn

Mismunandi tæki sem birta vefina okkar hafa mismunandi upplausn, þau koma mismörgum pixelum fyrir á skjánum. Physical resolution segir til um raun upplausn á skjá, t.d. 960×640 en logical resolution segir til um raun stærð skjás, t.d. 480×320. Hlutfallið þarna á milli er device pixel ratio, t.d. 2x. Pixel density segir til um fjölda pixela á tommu eða cm. Retina display er markaðshugtak frá Apple þar sem pixel density er um 300 ppi og við horfum á skjáinn í um 25 cm fjarlægð — augað greinir ekki pixela.

Við getum leiðbeint vöfrum um hvernig við viljum að síða birtist með <meta name="viewport"> en í content attribute getum við sett einhver af eftirfarandi gildum:

  • width setur breidd viewports: tala eða device-width sem lætur viewport vera jafnt logical resolution ekki physical resolution.
  • initial-scale, upphafs þysjun (zoom) á síðu, yfirleitt 1.
  • minimum-scale, hversu lítil síða má verða — hve langt má þysja út.
  • maximum-scale, hversu stór síða má verða — hve langt má þysja inn.
  • user-scalable, má notandi þysja (e. zoom)? Þetta viljum við alltaf leyfa í þágu aðgengis, nema eitthvað sérstakt knúi okkur til þess að banna.
<meta name="viewport" content="width=device-width, initial-scale=1">

Ef við skilgreinum ekki width=device-width í <meta name="viewport"> og notum media queries mun vefurinn okkar ekki birtast eins og við höldum í tækjum með hærri raunupplausn.

18.0.5 Frekari stjórn yfir myndum

Ef við viljum fá enn frekari stjórn yfir hvernig mynd birtist getum við notað <picture> elementið. Það leyfir okkur að skilgreina mismunandi myndir sem birtast við mismunandi stærðir, byggðar á media query skipunum.

<picture>
  <source srcset="stor.jpg" media="min-width: 800px">
  <img src="litil.jpg" alt="">
</picture>

Hér mun litil.jpg birtast svo lengi sem skjástærð tækis er undir 800px breidd. Fyrir ofan það er stor.jpg birt. Þetta getur gefið möguleika á meiri listrænni stjórn: í minni vöfrum er hægt að nota mynd þar sem búið er að klippa myndina svo aðalatriði sjáist betur. Í öllum tilfellum þar sem við notum <picture> skilgreinum við <img> innan þess, sú mynd virkar sem fallback ef einhver af <source> elementum virka ekki eða ef stuðningur er ekki til staðar við <picture>. alt texti mun alltaf vera sá sem skilgreindur er á <img>.

Hægt er að nota <picture> og srcset attribute til að stjórna enn betur hvernig myndir birtast, í hvaða formati, í hvaða upplausn, og hversu hárri upplausn.

<picture>
  <!-- ef vafri styður webp formatið, nota það -->
  <source type="image/webp" srcset="img.webp, img-2x.webp 2x, img-3x.webp 3x">
  <!--
  fyrir skjái með 2x eða 3x device pixel ratio
  birtum við stærri myndir sem þá birtast „greinilegri“
  -->
  <img alt="" width="600" height="600" src="img.jpg" srcset="img-2x.jpg 2x, img-3x.jpg 3x">
</picture>

18.0.6 Skalanlegir vefir

Með því að nýta þessi þrjú hugtök:

  1. Sveigjanlegt umbrot, byggt á grind
  2. Sveigjanlegar myndir og miðlar
  3. CSS media queries

saman fáum við síðu sem bregst við umhverfi sínu og skalast alveg frá lítilli upplausn síma upp í háa upplausn á risa-sjónvarpi. Eins og marg annað er þetta einföld hugmynd sem fljótt verður flókin í útfærslu. Við getum nýtt okkur tól í vöfrum til að prófa lausnirnar okkar, en til að vita nákvæmlega hvernig þetta hagar sér þarf að prófa á tækjunum sjálfum. Það getur síðan í sjálfu sér orðið erfitt þar sem þau eru mörg og engin tvö nákvæmleg eins.

Kafli 19: Kvikun

um 6 mínútna lestími.

Kvikun (e. animation) er þegar við látum eitthvað hreyfast eftir ákveðnum reglum. Í CSS er hægt að gera það með transition og animation eigindunum. Með því að nota hreyfingar getum við gert viðmót eðlilegra, vinalegra og skemmtilegra. Viðmót geta orðið fágaðari, þar sem við fjarlægjum „grófleikann“ sem getur orðið ef við breytum einhverju samstundis. Of mikið af hreyfingum er þó ekki eitthvað sem við viljum, það þarf ekki allt að hreyfast alltaf.

19.1 Umskipti

Með umskiptum (e. transition) látum við eitt gildi breytast í annað á skilgreindum tíma. Breytingin gerist ekki strax, það er einhver brúun á milli upphafs og endagildis. Við skilgreinum hvaða eigindi eigi að breyta, á hve löngum tíma og með hvaða hröðun. Vafrinn sér síðan um að brúa gildið miðað við það sem við viljum.

Umskipti virka þannig að vafri fylgist með gildi og ef við skilgreinum að það breytist (t.d. ef við setjum nýtt gildi með :hover) þá er gildinu ekki breytt samstundis. transition er shorthand fyrir:

  • transition-property, hvaða eigindi eigi að umskipta.
  • transition-duration, hve lengi umskipti eigi að taka.
  • transition-timing-function, hröðunar fall umskipta.
  • transition-delay, hve lengi skuli bíða með umskipti.
/* transition: <property> <duration> <timing-function> <delay> */
/* color gildi mun breytast með línulegri hröðun á 250 millisek */
transition: color 250ms linear 0;

Hægt er að skilgreina fleiri en eitt umskipti með því að skipta á kommu, ,:

transition: color 250ms, background-color 250ms;

Með transition-property skilgreinum við með hvaða eigindi við fylgjumst. Það er leyfilegt að setja all sem gildi en þá er fylgst með breytingum á öllum eigindum og getur það valdið óþarfa hægagangi. Við viljum vera nákvæm í því hvað á að breytast og forðumst það því. Tíma er hægt að skilgreina í millisekúndum (250ms) eða sekúndum (1.25s).

a {
  background-color: #000;
  color: #fff;
  /*
  í staðinn fyrir að skipta beint úr svörtu í hvítt gerum
  við það á 250ms svo það verður ekkert „blikk“
  */
  transition: color 250ms, background-color 250ms;
}
a:hover {
  background-color: #fff;
  color: #000;
}

19.1.1 Hröðun

Hröðunarfall er skilgreint með rúmfræðilegri bezier kúrvu (e. cubic bezier curve) eða lykilorði (sem er tengt við ákveðna bezier kúrvu).

Dæmi um bezier kúrvu.

Mynd frá MDN:
https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function

Bezier kúrvur eru föll sem skilgreina hvernig gildi breytist yfir tíma: hver hröðun þess er. Ef við höfum línulega hröðun fer gildið frá upphafsgildi til lokagildis með nákvæmlega sama hlutfalli á hverja tímaeiningu. cubic-bezier(x1, y1, x2, y2) er fall í CSS sem leyfir okkur að skilgreina nákvæmlega hvernig kúrvan hagar sér en við notum yfirleitt lykilorð sem skilgreina mikið notaðar kúrvur.

  • linear, hröðun er línuleg.
  • ease, sjálfgefið gildi fyrir þau eigindi sem nota hröðun, mikil hröðun í byrjun, hægir síðan á sér og kemur rólega í mark.
  • ease-in, byrjar hægt en eykur hröðun eftir því sem endi nálgast.
  • ease-in-out, byrjar hægt, eykur hraða en hægir aftur á sér þegar endi nálgast.
  • ease-out, byrjar hratt en hægir á sér þegar endi nálgast.

Línuleg hröðun með linear lykilorði.

Hröðun með ease-in-out lykilorði.

Mynd frá MDN:
https://developer.mozilla.org/en-US/docs/Web/CSS/easing-function

19.2 Animation

Með animation eigindinu getum við útbúið flóknari hreyfingar án þess að nota JavaScript. Við skilgreinum keyframes fyrir hreyfinguna með @keyframes at-reglunni. Hreiðraðar skipanir innan @keyframes hafa ekki selector heldur prósentugildi eða, lykilorðin from sem er jafngilt 0% eða to sem er jafngilt 100%. Gildin segja til um hvernig hreyfing lítur út á viðeigandi stað og mun vafri brúa á milli m.v. gefinn tíma og hröðun.

@keyframes fade {
  /* þegar hreyfing er í 0% er opacity: 0 */
  from {
    opacity: 1;
  }
  /* þegar hreyfing er í 50% er opacity: 0.4 */
  50% {
    opacity: 0.4;
  }
  /* þegar hreyfing er í 100% er opacity: 1 */
  to {
    opacity: 0;
  }
}

Við stýrum síðan hvernig hreyfing hagar sér með animation sem er shorthand fyrir:

  • animation-name, nafnið á hreyfingu skilgreindu með @keyframes
  • animation-duration, hversu langan tíma hreyfing eigi að taka
  • animation-timing-function, hröðunarfall
  • animation-delay, hversu lengi eigi að bíða með að byrja hreyfingu
  • animation-iteration-count, hversu oft á að keyra hreyfingu, tala sem sjálfgefið er 1, getur líka tekið gildið infinite
  • animtaion-fill-mode, hvernig á að tækla eigindi sem aðeins eru sett í hreyfingu eftir og áður en hún keyrir?
  • animation-play-state, í hvaða stöðu er hreyfing, sjálfgefið running en getur líka verið paused
  • animation-direction, í hvaða átt á að keyra hreyfingu

Fyrir animation-direction getum við notað lykilorðin:

  • normal, sjálfgefið, keyrð áfram og þegar hún klárast byrjað aftur frá byrjun
  • reverse, keyrð afturábak og byrjað á enda þegar hún klárast
  • alternate, keyrð áfram og afturábak til skiptis
  • alternate-reverse, keyrð afturábak og áfram til skiptis
/*
animation: duration | timing-function | delay |  iteration-count |
           direction | fill-mode | play-state | name 
*/
animation: 2s ease 0 infinite alternate both running fade;
/* animation: duration | name */
animation: 3s fade;

19.3 Transform

Með transform eigindinu getum við gert breytingar á tvívíðu og þrívíðu rúmi hluta með því að nota translate, rotate, skew og scale. Lang flestar af þessum aðgerðum verða fluttar af vafra frá CPU yfir á GPU (graphics processing unit, sérstakur kubbur í tölvu sérhannaður til að vinna með grafík) og eru þessar aðgerir því miklu hagkvæmari en að reikna út gildi og teikna allt útlit vefs aftur ef við myndum t.d. nota position.

Ef við viljum færa hlut notum við transform: translate(x, y) til að færa á x og y-ás. Getum einnig gert í þrívíðu rúmi með transform: translate3d(x, y, z).

Ef við viljum stækka eða minnka hlut notum við transform: scale(ratio); þar sem ratio er hlutfall, 1.0 og hlutur er í venjulegri stærð (m.v. teiknað útlit), 0.5 og hann er helmingi minni, 2.0 og hann er tvisvar sinnum stærri.

19.4 Sjónarhorn

Þegar við gerum breytingar í þrívíðu rúmi þurfum við að skilgreina hversu langt frá notanda núllpunktur z-áss er, hver sjónarhorn (e. perspective) okkar er. Það gerum við með perspective eigindinu. Sjálfgefna gildið er none sem þýðir að fjarlægð frá z-ás er óskilgreind og allar þrívíðar breytingar munu ekki sjást.

19.5 Jank

Þegar við erum að vinna með hreyfingar viljum við halda þeim mjúkum og fínum, án þess að þær haltri eða líti skringilega út. Galdratalan í því samhengi eru 60fps eða 60 rammar á sekúndu. Það þýðir að hver vafrinn (eða það sem er að birta hreyfingu) hefur 16,67 millisekúndu per ramma til að gera alla þá útreikninga sem þarf til að láta næsta ramma birtast rétt. Ef við erum að gera of mikið á þessum tíma, t.d. hreyfa of marga hluti eða á óhagkvæman máta, þá förum við að taka eftir jank, hlutir hreyfast óeðlilega.

TIl að komast hjá jank þegar við búum til hreyfingar er ein einföld regla sem kemur okkur vel áleiðis: aðeins breyta opacity og transform þegar við hreyfum hluti. Að breyta öðrum eigindum mun valda því að GPU er ekki notað.

Einnig getum við notað will-change eigindið sem lætur vafra vita að við munum breyta ákveðnum eigindi og er þá hægt að gera viðeigandi ráðstafanir. Listin að gera vefi sem eru hraðir og nýta hagkvæmar leiðir er mikil list, hægt er að læra meira á Jank Free.

Kafli 20: Hönnun

um 7 mínútna lestími.

Það er vert að tæpa aðeins á því sem ber að hafa í huga þegar við förum að hanna okkar eigið útlit. Forritarar eiga það margir til að hunsa skipulag og framsetningu á efni og einfaldlega koma allri virkni á skjáinn (stundum kölluð „forritaraútlit“).

20.1 Röðun og jöfnun

Röðun og jöfnun (e. alignment) á efni skiptir máli. Við ættum að leggja okkur fram við að setja hluti skipulega upp með reglu. Notkun á grind getur hjálpað til hér þar sem hún skilgreinir grunn til að vinna á. Eins ættu bil á milli efnis ekki að vera handahófskennd heldur fylgja reglu.

Í byrjun ættum við að setja okkur reglu um hvernig hlutum er raðað og þeir jafnaðir. Texti ætti að vera eins jafnaður (til vinstri, hægri eða jafnaður). Bil stöðluð og notuð á milli (margin) og innan (padding) hluta. T.d. ef við gefum okkur grunnbil upp á 20px getum við notað þá tölu og margfeldi af henni til að mynda bil, t.d. 3 * 20px sem gott bil á milli tveggja svæði.

Mynd af handahófskenndri staðsetningu með handahófskenndum bilum VS jöfnum bilum.

Mynd frá höfundi.

Þegar við erum að skipuleggja efni er mikilvægt að huga að hópun. Hlutir sem eiga að vera saman ættu að vera saman og ættu að vera líkir. Þetta getur átt við allt frá listum, til upplýsinga í fæti til mynda og texta tengdum þeim.

Listi með og án bils á milli hópa.

Mynd frá höfundi.

20.2 Andstæður

Andstæður (e. contrast) myndast þegar hlutir eru ólíkir og ekki aðeins ólíkir heldur mjög ólíkir. Með þvi getum við dregið athygli að ákveðnum hlutum og brotið upp hönnun. Andstæður er hægt að mynda með því að nota mismunandi letur, mismunandi þyngd og mismunandi stærð. Við getum líka notað liti til að mynda andstæður, með því að snúa við litum á bakgrunni og letri.

Dæmi um andstæður í fyrirsögnum.

Mynd frá höfundi.

20.3 Letur

Letrið sem við notum skiptir máli. Ekki allar leturgerðir eru ekki gerðar til þess að vera á meginmáli og ekki allar eru gerðar til þess að vera í fyrirsögnum. Við ættum að velja leturgerðir sem bjóða upp á andstæður (hvort sem það er innan leturgerðar með mismunandi þyngd), henta efninu okkar og ekki of margar. Tvær leturgerðir ættu að vera nóg fyrir flest verkefni.

Stærð á letrinu okkar ætti ekki heldur að vera handahófskennt, fyrir fyrisagnir, meginmál og annan texta ættum við að skilgreina stærðir. Hægt er að útbúa týpografískan skala sem skilgreinir stærðir á letri, svipar til tónlistarskala. T.d. er 12 14 16 18 21 24 36 48 skali sem oft er notaður fyrir letur.

Þegar við vinnum með fyrirsagnir og texta sem á einhvern hátt er dreginn út getur verið gott að huga að kerning en það er þegar við eigum við pláss á milli hvers og eins stafs. Ef við höfum átt við letter-spacing eða erum að nota leturgerð sem ekki hefur gott pláss á milli stafa gætum við þurft að gera ráðstafanir svo að textinn okkar skiljist og orð ruglist ekki, t.d. getur rn runnið saman í m eða LI í U.

Það er síðan hægt að fara enn lengra með skala, letur og grind með því að skilgreina lóðrétta grind fyrir letur, svokallaðan lóðréttan takt (e. vertical rhythm). Við gefum okkur þá pláss í grunninn sem hver lína af texta þarf að passa innan margfeldis af, og ekki bara það heldur þurfa öll bil á milli texta (margin) að vera í margfeldi líka. T.d. ef við gefum okkur grunngildið 16px þurfa allar línur að vera heilt, jákvætt margfeldi af því. Fyrirsögn passar t.d. innan 46px, millifyrirsögn innan 32px og meginmál innan 16px. Hver lína innan þessarar láréttu grindar er kölluð baseline.

Dæmi um texta sem hefur lóðréttan takt.

Mynd frá höfundi.

Allar þessar tilfærslur með letur eru ekki óþarfar; þær skapa sátt og jafnvægi.

20.4 Litir

Sama gildir um liti og letur, við ættum að ákveða litapallettu og nota hana. Ekki velja handahófskennda liti sem passa hugsanlega vel saman en hugsanlega ekki vel saman. Margar leiðir eru til þess að velja saman viðeigandi liti en margar þeirra snúast um að velja liti sem passa saman á litahjólinu. Til þess að velja þessa liti má nota tól eins og:

20.5 Veftré og wireframe

Áður en við förum beint að hanna vef er mikilvægt að gera sér grein fyrir umfangi hans. Til þess að komast að því er gott að byrja á að því að setja upp veftré en það er yfirlitsmynd yfir allar síður vefsins og hvernig þær tengjast innbyrðist.

Dæmi um uppbyggingu á veftré.

Mynd frá höfundi.

Með því að teikna upp veftré verður vefurinn og verkefnið sem við erum að fara að vinna skýrara og við sjáum jafnvel fram á hluti sem okkur hefði ekki dottið í hug. Ef við erum að vinna verkefnið með öðrum er þetta líka góð leið til þess að komast á sömu blaðsíðu um síður sem þarf að smíða og útbúa efni fyrir.

Wireframe er síðan það að taka hverja síðu (eða eina síðu fyrir hverja „síðutýpu“) og skissa upp hvernig hún mun líta út áður en farið er í beina hönnun. Þetta er hægt að gera með blað og blýanti, á tússtöflu eða í tóli (t.d. balsamiq). Þetta gefur okkur tilfinningu fyrir því hvaða efni þurfi að vera á hverri síðu, í hvaða forgangi það eigi að vera og hvernig það tengist öðru efni.

Dæmi um wireframe unnið í balsamiq.

Mynd frá Wikimedia:
https://commons.wikimedia.org/wiki/File:Profilewireframe.png

Þessi (ásamt mörgum öðrum mikilvægum verkefnum) eru unnin af fólki sem sérhæfir sig í notendaupplifunarhönnun (UX design eða user experience design).

20.6 CSS tól

Ef í harðbakkan slær og við treystum okkur ekki í að hanna okkar eigið útlit eru til tól sem geta hjálpað, oftast flokkuð saman sem framework, hönnunarsafn (e. design library) eða hlutasöfn (e. component library).

Bootstrap er framenda hlutasafn (frontend component library). Með Boostrap sníðum við HTML með ákveðnum klösum og fáum smekklegt útlit án mikils tilkostnaðar. Kostnaðurinn er þó helst sá að við fáum vef sem er mjög líkur mjög mörgum öðrum. Einnig getur verið erfitt að bæta við og blanda okkar eigin CSS við það sem kemur frá Bootstrap þar sem við þurfum að vita sértækni á boostrap selectorum og yfirskrifa það.

Dæmi um útlit smíðað með Bootstrap.

Mynd frá höfundi.
<div class="jumbotron">
  <h1 class="display-3">Hello, world!</h1>
  <p class="lead">
    This is a template for a simple marketing or informational website. It includes a
    large callout called a jumbotron and three supporting pieces of content. Use it as
    a starting point to create something more unique.
  </p>
  <p class="lead">
    <a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a>
  </p>
</div>

Tailwind er annað framework sem byggir á því að nota hjálparklasa (e. utility classes) til þess að byggja upp útlit. Það skaffar ekki tilbúnum hlutum til að búa til útlit (eins og t.d. takkar eða valmynd) heldur allskonar klasa sem við notum til að búa til þessi útlit.

Kostir við það að nota framework sem byggir á hjálparklösum er að það getur litið út fyrir „að vera manns eigið“ og eftir að hafa lært hvernig eigi að skrifa, þá er hægt að gera það hratt og örugglega.

Ókostir eru að þarna er beinlínis verið að blanda saman útliti og merkingarfræði. Það er ekki hægt að endurnýta útlit nema með því að nota einhversskonar sniðmát (e. template) sem væri búið til á vefþjóni. Einnig er erfitt að yfirskrifa þar sem langflestir selectorar nota !important.

<div class="md:flex">
  <div class="md:flex-shrink-0">
    <img class="rounded-lg md:w-56" src="https://images.unsplash.com/photo-1556740738-b6a63e27c4df?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=448&q=80" alt="Woman paying for a purchase">
  </div>
  <div class="mt-4 md:mt-0 md:ml-6">
    <div class="uppercase tracking-wide text-sm text-indigo-600 font-bold">Marketing</div>
    <a href="#" class="block mt-1 text-lg leading-tight font-semibold text-gray-900 hover:underline">
      Finding customers for your new business
    </a>
    <p class="mt-2 text-gray-600">
      Getting a new business off the ground is a lot of hard work.
      Here are five ideas you can use to find your first customers.
    </p>
  </div>
</div>

Mynd af birtingu af Tailwind kóða að ofan.

Skjáskot af vef Tailwind

Kafli 20: Grid

um 9 mínútna lestími.

Eins og farið var yfir í umfjöllun um skalanlega vefi er sveigjanlegt umbrot, byggt á grind aðalatriðið við útfærslu. Með flexbox er hægt að komast nokkuð langt en með tækni sem er ekki beint byggð til þess að útfæra grind. Það sést best á því hversu mikla útreikninga þarf að hafa í huga og hálf „hacky“11 „Hack“ eða „hacky“ lausn er oft notað yfir lausnir sem virka en eru ekki þær bestu með tilliti til hraða eða „snyrtileika“ (kóði er langur, flókinn, illskiljanlegur eða allt þrennt). Gæti einnig verið nefnt með „code smell“ eða „technical debt“. útfærslu.

Skjáskot

Skjáskot af caniuse.com árið 2023 sýnir 94,7% stuðning við CSS grid.

Skjáskot frá höfundi.

CSS grid er CSS virkni sem er skilgreind í einingunni „CSS Grid Layout Module Level 1“ sem er í vinnslu hjá W3C. Árið 2023 er einingin ennþá í Candidate Recommendation22 CSS grid hefur verið í vinnslu hjá W3C síðan 2011 og hefur gengið á ýmsu. Seinustu ár hafa Jen Simmons og Rachel Andrew stóðu í ströngu við að ýta á og kenna fólki á tæknina meðan stuðningur var ekki almennur. stöðu en er útfærð í öllum helstu vöfrum í dag. Element notar CSS grid ef því er gefið display: grid;.

20.1 Virkni

CSS grid er notað til að skilgreina skipulag eða útlit (e. layout) á síðu með því að skilgreina raðir (e. rows) og dálka (e. columns) sem efni er staðsett í. Þetta svipar til þess þegar síður voru skipulagðar með <table> en er sérhannað til þess og tekur tillit til skalanleika. CSS grid nýtir hugtakið grind úr grafískri hönnun, ekki birtingu á töflulegum gögnum.

Þegar við skilgreinum grindina okkar notum við nákvæmar eða hlutfallslegar einingar, þó við ættum að halda okkur eins og hægt er við hlutfallslegar einingar vegna skalanleika. Við skilgreinum grid tracks og grid lines sem við staðsetjum hluta (grid items) út frá. Líkt og með flexbox tölum við um grid container ef element hefur skilgreint display: grid; og þá öll börn þess elements sem grindar hluta (grid items).

20.1.1 Grid tracks og grid lines

Grid line er lína í grid sem er talin frá byrjun (talið frá 1) að enda fyrir bæði raðir og dálka. Grid track er plássið á milli lína og er plássið þar sem hlutir lenda, bæði fyrir raðir og dálka.

Skjáskot

Mynd frá MDN: Basic concepts of grid layout.

Á mynd sést skilgreining fyrir grind þar sem við höfum fjögur grid lines fyrir dálka (talið innan grárra hringja) og þrjú grid lines fyrir raðir (talið innan svartra hringja). Grindin hefur þrjú dálka grid track og tvö raða grid track.

20.2 Gildi í CSS grid

CSS grid skilgreinir einingar og föll til þess að vinna með grind og efni innan grindur:

  • fr, sveigjanleg lengd, hlutfallsleg eining fyrir fraction af plássi, hagar sér svipað og þegar við setjum flex-grow í flexbox.
  • max-content (skilgreint í CSS Box Sizing Module Level 3), eining fyrir hámarks eða „bestu“ (e. ideal) breidd efnis, minnsta breidd sem box gæti tekið þannig að efni þess passi og overflow verði ekki.
  • min-content (skilgreint í CSS Box Sizing Module Level 3), eining fyrir minnstu breidd efnis sem myndi ekki lenda í overflow.
  • fit-content, fall sem klemmir (e. clamp)33 Klemmun (e. clamping) er notað til að passa upp á að gildi falli innan skilgreinds bil samkvæmt formúlunni clamp(a, x, b) = max(a, min(x, b)) þar sem gildið x verður aldrei minna en a og aldrei stærra en b. CSS hefur clamp skilgreint sem almennt fall. stærð efnis innan lágmarks og hámarksgildis.
  • minmax(min, max), fall sem velur gildi sem er jafnt eða stærra en min og minna eða jafnt max.
  • repeat(), fall sem leyfir að skilgreina mörg track í einu ef þau fylgja endurteknu mynstri, t.d. repeat(4, 1fr) sem skilgreinir fjögur track þar sem hvert tekur 1fr af plássi.

Út frá þessum gildum og föllum má sjá að hugsað hefur verið um að geta skilgreint skalanlegar grindur, ekki eru skilgreindar fastar stærðir heldur bil og leiðir til að úthluta plássi eftir hlutföllum.

20.3 Skilgreining á grid

Þegar við skilgreinum grind með CSS grid getum við annaðhvort skilgreint beint (e. explicit) eða óbeint (e. implicit). Bein skilgreining er gerð með grid-template-columns og grid-template-rows. Ef við skilgreinum ekki beint er dálkum og röðum raðað óbeint og grid track búin til eftir þörfum, það er að segja útfrá því hve mörgum mismumandi grid items þarf að koma fyrir. Við getum stýrt hvernig stærð er útfærð í implicit grid með grid-auto-rows og grid-auto-columns eigindunum. Við getum blandað implicit og explicit grid skilgreiningum.

Fyrir eftirfarandi HTML:

<main>
  <div class="grid">
    <!-- Fyrsta röð -->
    <div class="item item-high">Lorem ipsum</div>
    <div class="item">Lorem ipsum</div>
    <div class="item">Lorem ipsum</div>
    <div class="item item-wide">Lorem ipsum</div>
    <!-- Önnur röð -->
    <div class="item">Lorem ipsum</div>
    <div class="item item-wide">Lorem ipsum</div>
    <div class="item">Lorem ipsum</div>
    <div class="item">Lorem ipsum</div>
    <!-- Þetta item býr til þriðja row trackið -->
    <div class="item">Lorem ipsum</div>
  </div>
</main>

skilgreinum við grind með:

main {
  max-width: 1200px;
  margin: 0 auto;
}
.grid {
  display: grid;
  /* explicit fjórir dálkar sem vilja taka jafnt pláss */
  grid-template-columns: repeat(4, 1fr);
  /* implicit raðir sem eiga að vera minnst 200px eða eins háar og þær þurfa */
  grid-auto-rows: minmax(200px, auto);
  gap: 10px;
}
.item {
  padding: 1rem;
  width: 100%;
  background-color: #999;
}
.item-high { min-height: 300px; background-color: #0f0; }
.item-wide { min-width: 400px; background-color: #0ff; }

og fáum eftirfarandi útlit:

Skjáskot

Birting á grind í 1300px breiðum Firefox vafra.

Skjáskot frá höfundi.

þar sem við höfum fjóra beina (e. explicit) dálka (það verða ekki fleiri en fjórir þrátt fyrir magn og breidd efnis) og óbeinar (e. implicit) raðir (það verða til eins margar raðir og efni krefst). Það sem við sjáum að grind er birt:

  • Hámarksbreidd grindar er 1200px þar sem það er max-width: 1200px; á <main>.
  • Bil á milli raða og dálka er gap: 10px;.
  • Höfum fjóra beina (e. explicit) dálka (það verða ekki fleiri en fjórir þrátt fyrir magn og breidd efnis) sem vilja vera 1fr að breidd hver um sig og að hámarki 300px hver.
  • Fyrst og önnur röð hafa bæði item sem er skilgreint min-width: 400px Efnið er skilgreint með px og er því ekki skalanlegt niður fyrir það pláss sem þessar raðir þurfa að lágmarki. Fyrsti og þriðju dálkar er því 185px breiðir en annar og fjórði eru 400px (185 * 2 + 400 * 2 + 10 * 3 = 1200)
  • Hæð óbeinna raða er skilgreind með grid-auto-rows: minmax(200px, auto);. Fyrsta röð hefur eitt item með skilgreinda min-height: 300px sem setur hæð allrar raðarinnar í 300px hæð. Önnur og þriðja röð hafa hæð 200px.

20.4 Staðsetning á hlutum á grid

Þegar við höfum skilgreint grindina okkar viljum við oft getað staðsett efni nákvæmlega, við getum þá notað: sjálfvirka staðsetningu, Línu (e. line-based) staðsetningu eða nefnd svæði.

Sjálfvirk staðsetning er sjálfgefin og nýtir grindar hluta staðsetningar reikniritið (e. grid item placement algorithm) til að staðsetja hluta í grind.

20.4.1 Línu staðsetning

Við getum skilgreint hvernig hlutar eru staðsettir í grind með því að nota línu staðsetningu:

  • grid-column-start skilgreinir hvar hlutur byrjar í dálk, eða hversu margar línur hlutur spannar með span.
  • grid-column-end skilgreinir hvar hlutur endar í dálk, eða hversu mörg spannar með span.
  • grid-column sem shorthand fyrir bæði.
  • grid-row-start skilgreinir hvar hlutur byrjar í röð, eða hversu margar línur hlutur spannar með span.
  • grid-row-end skilgreinir hvar hlutur endar í röð, eða hversu mörg spannar með span.
  • grid-row sem shorthand fyrir bæði.

Fyrir eftirfarandi HTML:

<main>
  <div class="grid-container">
    <div class="col col-12">
      <div class="box">100% dálkur</div>
    </div>
    <div class="col col-6">
      <div class="box">50% dálkur</div>
    </div>
    <div class="col col-3">
      <div class="box">25% dálkur</div>
    </div>
    <div class="col col-3">
      <div class="box">25% dálkur</div>
    </div>
    <div class="offset-3 col col-3">
      <div class="box">25% dálkur sem byrjar frá 25%</div>
    </div>
    <div class="col col-6">
      <div class="box">50% dálkur</div>
    </div>
  </div>
</main>

skilgreinum við grind með:

:root {
  --max-width: 1400px;
  --columns: 12;
  --gutter: 30px;
  --offset: 20px;
}
main {
  margin: 0 auto;
  width: calc(100% - (2 * var(--offset)));
  max-width: var(--max-width);
}
.grid-container {
  display: grid;
  grid-template-columns: repeat(var(--columns), 1fr);
  gap: var(--gutter);
}
.col-12 { grid-column-end: span 12; }
.col-6 { grid-column-end: span 6; }
.col-3 { grid-column-end: span 3; }
.offset-3 { grid-column-start: 4; }

og fáum eftirfarandi útlit:

Skjáskot

Birting á grind í 1400px breiðum Firefox vafra með grind lagða yfir.

Skjáskot frá höfundi.

20.4.2 Nefnd svæði

Með því að nota grid-template-areas getum við gefið svæðum nöfn til að einfalda staðsetningu og síðan notað grid-area til að tilgreina hvaða element fari í hvaða nefnda svæði. Við getum einnig blandað nefndum svæðum og línu staðsetningu, t.d. með grid-column: first / middle;.

Fyrir eftirfarandi HTML:

<div class="container">
  <header>Header</header>
  <nav>Navigation</nav>
  <main>Main area</main>
  <footer>Footer</footer>
</div>

skilgreinum við grind með nefndum svæðum:

.container {
  display: grid;
  width: 100%;
  min-height: 100vh;
  /* skilgreinum „mobile first“ nefnda grind */
  grid-template-areas:
    "header"
    "nav"
    "main"
    "foot";
  /* skiptum lóðréttu plássi út frá hlutfalli af viewport með vh */
  grid-template-rows:
    minmax(10vh, auto) minmax(20vh, auto) minmax(60vh, auto) minmax(10vh, auto);
}
@media (min-width: 1000px) {
  .container {
    grid-template-areas:
      "header header"
      "nav    main"
      "nav    foot";
    /* áfram hlutfallslega en núna aðeins þrjár raðir */
    grid-template-rows:
      minmax(20vh, auto) minmax(60vh, auto) minmax(20vh, auto);
    /* höfum tvö dálka og skilgreinum hlutfallslega með fr */
    grid-template-columns: 2fr 8fr;
  }
}
/* staðsetjum hvert og eitt element í nefnd svæði */
header { grid-area: header; background-color: #8ca0ff; }
nav { grid-area: nav; background-color: #ffa08c; }
main { grid-area: main; background-color: #ffff64; }
footer { grid-area: foot; background-color: #8cffa0; }

og fáum eftirfarandi útlit:

Skjáskot

Birting á grind í 1000px breiðum Firefox vafra.

Skjáskot frá höfundi.
Skjáskot

Birting á grind í 500px breiðum Firefox vafra.

Skjáskot frá höfundi.

Kafli 22: CSS í stærri verkefnum

um 7 mínútna lestími.

Þegar við byrjum að skrifa CSS ein í verkefni er það tiltölulega einfalt, fáar línu (taldar í tugum eða fáum hundruðum) og við höfum yfirsýn yfir hvað gerir hvað. Línurnar þurfa ekki að vera orðnar ýkja margar áður en yfirsýnin fer að dala og við förum að verða hrædd um að skemma eitthvað með breytingunum okkar. Sérstaklega út af því að CSS er hannað þannig að allir hlutir „flæði“ yfir alla — allt er almennt og getur haft áhrif á allt. Nokkrar leiðir hafa komið fram í gegnum árin til að halda í stjórnina og yfirsýnina.

22.1 „Append only stylesheets“

Ef við pössum okkur ekki mun CSS í verkefnum okkar hægt og rólega falla í óreiðu. Viðbætur sem verða til eftir upprunaleg skrif verða erfiðar þar sem ekki er augljóst hvernig hlutirnir virka, mismunandi forritarar skrifa á mismunandi vegu, blanda af selectorum gerir hluti óljósa o.fl. Hræðsla við að brjóta útlit á einhverri síðu á vefnum gerir það að verkum að tiltekt verður erfið og við endum með „append only stylesheets“: ný virkni er alltaf skrifuð sérstaklega og bætt við aftast.

/* einhverjar reglur eru skilgreindar beint á type */
button { }
/* önnur tegund notar class selector */
.button { }
/* enn önnur type og class */
button.button { }
/* eða önnur, óljós nöfn */
.button2 { }
.fancy-button { }
.new-button { }

22.2 CSS viðmiðunarreglur

Í stórum verkefnum þar sem við erum að vinna ein eða í teymi er mikilvægt að eyða tíma í það að búa til viðmiðunarreglur (e. guidelines) um það hvernig við skrifum CSS. Þær geta varðað marga hluti

  • Hvernig nefnum við og skiptum upp hlutum?
  • Hvernig skrifum við selectora?
  • Hvernig högum við layout? Notum við grind?
  • o.s.fr.

Nokkrar aðferðir hafa verið búnar til og getum við tileinkað þær, t.d.:

  • SMACSSScalable and Modular Architecture for CSS.
  • OOCSSObject oriented CSS.
  • SUIT CSSStyle tools for UI components.
  • BEMBlock Element Modifier.

Allar af þessum aðferðum koma með viðmiðunarreglum en sumar koma einnig með tæki og tól sem hjálpa enn frekar til.

22.3 BEM

BEM, Block Element Modifier, er tiltölulega einföld aðferð þar sem hún einblínir á það hvernig við skrifum selectora. Við notum aðeins class selector, enga type eða id selectors. Einnig leyfum við okkur að aðskilja merkingarfræðina enn frekar frá útliti, þar sem við getum sett class á hvaða element sem er til þess að fá viðeigandi útlit á það.

  • Block - hæsta stig á component, foreldrið, t.d. .button
  • Element - börn undir block, t.d. .button__price
  • Modifier - breytir block án þess að hafa áhrif almennt, t.d. .button--wide
.block { }
.block--modifier { }
.block__child { }
.block__child--modifier { }

Með BEM skrifum við flata selectora, við erum ekki að hreiðra undir öðrum. Í HTML verðum við að tryggja að við hreiðrum rétt.

/* Ekki svona */
.block .block__child { }
/* heldur svona */
.block__child { }
/* en modifer getur haft áhrif á child */
.block--modifier .block__child { }

22.4 CSS framework

Ef við notum CSS framework, eins og Tailwind eða Bootstrap, þurfum við að huga að þeim kostnaði sem það getur haft í för með sér til lengri tíma litið. Það getur verið erfitt að nota þessi framework en líka ætla að skrifa okkar eigið sérstaka CSS. Huga þarf að hvernig rétt sé að , hvort það sé yfirhöfuð ráðlagt að skrifa það utan framework og sértækni11 Dæmi um hvernig Tailwind, Bootstrap og MaterialUI mælir með að skrifa sérsniðið CSS. Allar leiðir eru nokkuð ólíkar og krefjast þess að við aðlögum okkur að þessum kerfum.. Með því að nota svona framework getum við verið fljót að byggja upp viðmót í byrjun en lent í því að útlit sem passar ekki við eða er öðruvísi er erfitt í útfærslu. Tími sem fer í að vinna „á móti“ frameworki í stað „með því“ getur á einhverjum tímapunkti breyst og þá er ekki auðvelt að bakka, annaðhvort er farið í þá miklu vinnu að fjarlægja framework eða hreinlega byrja viðmót aftur.

22.4.1 CSS layers

Tækni sem getur hjálpað í þessu og öðrum verkefnum þar sem unnið er með mismunandi kynslóðir (útgáfa 1 unnin af einu teymi, útgáfa 2 sem nýtti framework, útgáfa 3 sem fór frá frameworki o.s.fr.) af CSS er cascade layers sem leyfir skilgreiningu á lagi (e. layer) þar sem cascade virkar eingöngu innan þess lags en ekki utan. Hægt er að skilgreina mörg mismunandi lög og lög innan laga, hvar lög eru skilgreind og í hvaða röð skipta ekki máli, en við getum skilgreint forgang laga:

/* Röð laga, `override` hefur forgang yfir `framework` */
@layer framework, override;
@layer reset {
  /* Einhverjar CSS reset reglur */
}
@layer framework {
  /* CSS reglur fyrir framework */
  @layer default {
    /* CSS reglur fyrir sjálfgefin gildi */
  }
  @layer theme {
    /* Gildi í þemu sem skrifa yfir sjálfgefin gildi */
  }
}
@layer framework.theme {
  /* Gildi skilgreind utan `framework` */
}
@layer override {
  /* Gildi sem munu alltaf yfirskrifa allt í `framework` */
}

22.5 Style Guides & Pattern Libraries

Önnur góð leið til að viðhalda skipulagi er að útbúa style guide eða pattern library. Þau safna saman hlutum sem mynda vefinn okkar, ekki eingöngu i hönnunarskjölum heldur sem dæmi í kóða. Með þessu höfum við einn stað til að fá og sjá yfirlit yfir það úr hverju vefurinn okkar er byggður. Hönnun verður samræmdari, við vitum hvernig hlutir munu líta út og ef við smíðum eitthvað nýtt bætum við því við svo aðrir sjái. styleguides.io er vefur sem heldur utan um mörg mismunandi styleguide.

Skjáskot

Skjáskot úr styleguide Mailchimp sem sýnir fyrirsagnir.

Skjáskot

Skjáskot úr styleguide Mailchimp sem sýnir takka.

22.6 Atomic Design

Atomic design er leið, þróuð af Brad Frost, sem skilgreinir hvernig við getum búið til kerfi utan um vefina okkar. Í grunninn skiptist hún í að skilgreina:

  • Atóm – grunn element, t.d. input, litir.
  • Sameind – sameinuð atóm, t.d. form.
  • Lífvera – hópur af sameindum, t.d. leitar form, navigation.
  • Sniðmát – hópa saman lífverum og mynda síður.
  • Síða – ákveðin tilvik af sniðmátum með alvöru efni sem notendur sjá.

Yfirlitsmynd yfir atomic design.

Hægt er að lesa nánar um atomic design í Atomic Design bók Brad Frost sem hægt er að nálgást ókeypis á vefnum.

22.7 Prófanir í öllum vöfrum

Yfirleitt vinnur vefforritari í sínum uppáhalds textaritli og þróar vefi með hjálp síns uppáhalds vafra. Þessi vafra er eflaust með góð developer tools sem hjálpa til við forritunina, og góðan stuðning við nýlega virkni. Þetta á hinsvegar ekki við um alla sem nota vefinn. Í gegnum árin hafa mjög margir mismunandi vafrar verið gefnir út með mjög mismunandi stuðning við HTML, CSS og JavaScript. Á seinni árum með sjálfvirkum uppfærslum hefur þó dregið töluvert úr þessu.

Þegar kemur að því að ákveða hvaða vafra eigi að styðja (og það er gott að ákveða sem fyrst í ferlinu) er mikilvægt að gera sér grein fyrir því að með hverjum vafra sem þarf að prófa í eykst tíminn sem verkefnið tekur. Þessi auka tími getur verið lítill fyrir einfaldari verkefni eða mikill fyrir flóknari. Þegar inn í þetta spila einnig mismunandi tæki er mikilvægt að hafa plan. Ein leið til að útbúa svona plan er að skoða heimsóknartölur fyrir núverandi vef til að fá tilfinningu fyrir því hvaða vafra notendur séu að nota. Ef það er ekki möguleiki má skoða hvaða vafra fólk er að nota í því svæði sem verkefnið verður mest notað.

Það sem er mikilvægast eftir að búið er að útbúa plan um hvaða stuðning við ætlum að hafa er að komast í raun útgáfur af tækinu til að prófa í. Hvort sem það er að hafa sér tölvu með windows stýrikerfinu til að prófa verkefnið á Edge, eða tölvu með macOS stýrikerfinu til að prófa í Safari. Einnig eru til þjónustur eins og Browserstack sem leyfir okkur að tengjast úr vafranum okkar við sýndarumhverfi sem keyrir mjög margar útgáfur af stýrikerfum og vöfrum.

Kafli 23: CSS tæki & tól

um 4 mínútna lestími.

Þar sem CSS hefur ekki föll og flóknari aðgerðir er búið að útbúa ýmis tól sem hjálpa okkur við að skrifa skipulegra CSS með leiðum til að draga úr endurtekningum, t.d.:

  • Breytur, getum skilgreint fyrir liti, stærðir o.fl. Þessar breytur eru öðruvísi en CSS breytur þar sem þær eru ekki dýnamískar og nýta ekki cascade.
  • mixins, leiðir til að endurýta reglublokkir, virka svipað og föll.
  • nesting, skrifum reglublokkir innan reglublokka og nýtum selector að ofan.

Dæmi um mál sem útfæra þetta eru:

  • LESS, It's CSS, with just a little more.
  • Stylus, Expressive, dynamic, robust css.
  • Sass, Syntactically Awesome Style Sheets.

Flest af þessum tólum virka sem superset af CSS, sem þýðir að „venjulegt“ CSS virkar en ef við bætum við það virkni úr málinu bæta þau við virkni. Við þurfum að sækja okkur þýðanda fyrir málið sem þá þýðir fyrir okkur úr því í „venjulegt“ CSS.

23.1 Sass

Sass er töluvert mikið notað og hefur þýðendur í mörgum umhverfum. Eldri útgáfa af málinu notaði .sass endingu á skjölum en nýrri („sassy CSS“) notar .scss.

Sass útfærir breytur með $ fyrir framan eigindi og leyfir okkur að nota á öðrum stöðum með virkjum og hjálparföllum:

@use "sass:math";
// svona komment virka
$blue: #3bbfce;
$margin: 16px;
.box {
  margin: math.div($margin / 2);
  background-color: $blue * 2; // líka fyrir liti!
}

sem er þýtt yfir í:

.box {
  margin: 8px;
  background-color: #76ffff;
}

Við getum líka notað mixin og hreiðraðar reglur sem geta nýst okkur t.d. ef við erum að skrifa BEM:

@mixin rounded($color: transparent) {
  border: 1px solid $color;
  border-radius: 5px;
}
.box {
  &__header {
    @include rounded;
  }
  &__content {
    @include rounded(#000);
  }
}

sem er þýtt yfir í:

.box__header {
  border: 1px solid transparent;
  border-radius: 5px;
}
.box__content {
  border: 1px solid #000;
  border-radius: 5px;
}

Media queries geta verið settar undir selector sem getur hjálpað töluvert við að hópa saman hvernig hlutur hegðar sér í mismunandi upplausnum:

.box {
  width: 100%;
  @media (min-width: 800px) {
    width: 50%;
  }
}

Við getum nýtt okkur mixins og hreiðrun til að einfalda grid virkni og gera læsilegri:

$gutter: 20px;
.row {
  display: flex;
  flex-wrap: wrap;
  margin-right: -($gutter / 2);
  margin-left: -($gutter / 2);
}
// mixin sem reiknar nákvæmar prósentur útfrá dálkum
@mixin columns($col: 1) {
  // margföldum með "1%" til að breyta gildi í prósentu gildi
  width: ($col / 12 * 100) * 1%;
}
.col {
  padding-right: $gutter / 2;
  padding-left: $gutter / 2;
  &-12 {
    @include columns(12);
  }
  &-sm {
    // viljum að col-sm-* sé notað alveg upp að 800px, ekki í 800px samt
    @media (max-width: 799px) {
      &-12 {
        @include columns(12);
      }
    }
  }
  // o.s.fr...
}
// eða...
.my-box {
  @include columns(12);
  @media (min-width: 800px) {
  .my-box {
    @include columns(4);
  }
}

Með Sass og @import at-regluna til þess að skipuleggja skránar okkar betur, í grunn skránni okkar (t.d. styles.scss) setjum við almennar skilgreiningar og sækjum síðar aðrar skrár. Þannig getum við ennfrekar skipulagt CSS virknina okkar og komið í veg fyrir stórar, flóknar skrár:

// Almennar breytur
$max-width: 1200px;
$gutter: 20px;
main {
  max-width: $max-width;
  margin: 0 auto;
}
// Sækjum skjöl sem skilgreina almenna virkni, t.d. grid
@import "scss/grid";
// ...
// Sækjum skjöl fyrir hvern „hlut“
@import "scss/header";
@import "scss/button";
@import "scss/nav";
// ...

Að skipta skjölum upp á þennan máta, samnýta almenna virkni gegnum mixin, velja eða skilgreina viðmiðunarreglur og nota öguð vinnubrögð hjálpar mikið í stærri CSS verkefnum.

Hægt er lesa nánar um virkni sem Sass bíður upp á í skjölun og prófa sig áfram með Sassmeister sem þýðir Sass í vafra.

Þá er næsta spurning, hvernig getum við notað svona tól í okkar verkefnum?

Kafli 24: NPM og almenn tæki og tól

um 7 mínútna lestími.

24.1 npm

npm er pakkastjóri (package manager) fyrir JavaScript en leyfir okkur líka að setja upp og nota allskonar tól sem byggð eru með JavaScript.

Pakkastjóri sér um að sjálfvirknivæða það að setja upp, stilla og fjarlægja hugbúnað. Í staðinn fyrir að þurfa að sækja einhvern hugbúnað, finna hvert við sóttum hann, keyra eitthvað uppsetningarforrit og síðan keyra forritið, þá keyrum við eina skipun og höfum aðgang að forriti.

npm er sett upp með node.js og þurfum við því að setja það upp, en hægt er að nálgast nýjustu útgáfu af node.js á vef þess. Það koma reglulega upp tilvikt þar sem við þurfum að hafa fleiri en eina útgáfu af node.js aðgengilega, þá getum við notað nvm (mac og linux) eða nvm-windows

Eftir að hafa sett upp node.js getum við opnað terminal og staðfest að við höfum aðgang að báðu:

> node -v
v20.7.0 (eða sú útgáfa sem við sóttum)
> npm -v
10.1.0

Með node.js og npm uppsett getum við sótt okkur tæki og tól til þess að auðvelda líf okkar í vefforritun. Það eru tvær aðferðir til þess:

  • setja tól upp almennt, eða
  • setja upp tól sérstaklega í verkefninu okkar

24.2 Almenn tól

Með því að setja upp almennt tól getum við notað það hvar sem er gegnum terminal. browser-sync er dæmi um svona tól, en það leyfir okkur að keyra lítinn vefþjón á okkar eigin vél og sjálfkrafa endurhlaða síðu þegar við gerum breytingar sem getur sparað okkur ófáa smellina.

Byrjum á því að setja upp browser-sync almennt með npm með því að nota -g flaggið sem stendur fyrir „global“.

> npm install -g browser-sync
...
added 153 packages in 5s # eða eitthvað álíka

Ef við förum nú í möppu þar sem við höfum index.html og styles.css skjal getum við kveikt á browser-sync vefþjóninum með:

> cd /slóð/á/verkefni
> browser-sync start --server --files index.html styles.css
[Browsersync] Access URLs:
 ----------------------------------------
       Local: http://localhost:3000
    External: http://192.168.1.1:3000
 ----------------------------------------
          UI: http://localhost:3001
 UI External: http://192.168.1.1:3001
 ----------------------------------------
[Browsersync] Serving files from: ./
[Browsersync] Watching files...

nú fylgist browser-sync með index.html og styles.css og sjálfkrafa endurhleður síðuna. En núna erum við búin að setja upp þetta tól og getum notað fyrir einhver verkefni, en hvað ef við viljum leyfa öðrum í teyminu okkar að njóta þess sama?

24.3 Tól í verkefnum

Með því að innifela tólin sem við notum við þróun á verkefni í verkefninu sjálfu erum við nákvæm um hver dependency okkar eru. Ef aðrir (þar með talið við sjálf eftir einhvern) koma að verkefninu viljum við að allt sé skýrt, hvaða tól sé verið að nota og hvernig. npm getur hjálpað okkur með þetta.

Ef við förum í möppuna þar sem verkefnið okkar er geymt og keyrum npm init skipunina sem spyr npm okkur um uplýsingar varðandi verkefnið okkar. Þær eru síðan geymdar í package.json skrá. Við getum síðan bætt sérstaklega við dependency á ákveðin tól, t.d. browser-sync með því að nota npm install <pakki> --save-dev en það segir npm að vista vísun í browser-sync í package.json þar sem browser-sync er development dependency. Ef við tilgreinum --save erum við að segja að pakkinn sé keyrslu dependency, þ.e.a.s. til að verkefnið keyri þarf þessi pakki að vera til.

> cd /slóð/á/verkefni
> npm init
…svara spurningum
> npm install browser-sync --save-dev
added 412 packages in 37.537s # eða eitthvað álíka

þá lítur package.json einhvern vegin svona út:

{
  "name": "prufa",
  "version": "0.0.1",
  "description": "Prufupakki Óla",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Óli",
  "license": "ISC",
  "devDependencies": {
    "browser-sync": "^2.26.12"
  }
}

en hún er geymd á json formi sem er gagnaform sem á rætur sínar að rekja til JavaScript. Að auki package.json verður til package-lock.json sem geymir nákvæmar útgáfur þeirra forrita sem við treystum á, því þau sjálf hafa sín eigin dependency. ./node_modules er síðan mappa sem verður til samhliða þessum skrám og geymir hún forritakóða fyrir alla pakka sem við höfum sett upp. Þessi mappa er útbúin út frá package.json og package-lock.json og þarf því ekki að geyma hana eða senda með sérstaklega. Við einfaldlega keyrum npm install og npm sér um að sækja allt sem sækja þarf.

En hvernig keyrum við þá browser-sync?

24.4 npm scripts

npm býður upp á leið til þess að skilgreina skriptur sem við getum keyrt með npm run <nafn-á-skriptu>. Við skilgreinum þessar skriptur undir "scripts" hlutanum í package.json, ef við bætum við skriptu til að keyra browser-sync við dæmið að ofan fáum við:

"scripts": {
  "browser-sync": "browser-sync start --server --files index.html styles.css"
},

sérstaklega þarf að passa upp á að hafa , á eftir hverri skriptu ef önnur fylgir og enga kommu í lokin.

Við getum þá keyrt browser-sync í verkefninu okkar með:

npm run browser-sync

og fengið sömu virkni og áður en núna tekur verkefnið okkar skýrt fram að það noti browser-sync.

24.5 sass

sass er þýðandi fyrir Sass skrifaður fyrir node.js sem við getum sótt með npm.
npm install --save sass

Með sass kemur CLI forrit sem við getum keyrt og gefið slóð á .scss skrár og nafn á .css skrá og er þá sass þýtt yfir í CSS skrá. -w flag lætur forritið vakta skránna okkar og þýða hana aftur ef .scss skrár breytast.

"scripts": {
  "browser-sync": "browser-sync start --server --files index.html styles.css",
  "sass": "sass styles.scss styles.css -w"
},
> npm run sass
=> changed: /slóð/á/verkefni/styles.scss
Rendering Complete, saving .css file...
Wrote CSS to /slóð/á/verkefni/styles.css

Núna lendum við í því að hafa tvö tól sem við viljum keyra á sama tíma, við því eru tvær lausnir:

  1. Keyra tvö terminal sem keyra sitthvort command, það getur virkað en verið heldur leiðinlegt í uppsetningu
  2. Finna annað tól sem leyfir okkur að keyra bæði í einu!

Eitt svona tól er concurrently er einn af mörgum pökkum sem leyfir okkur að keyra margar skipanir í einu. Ef við setjum það upp og keyrum:

> npm install --save-dev concurrently

og bætum við skriptum

"scripts": {
  "browser-sync": "browser-sync start --server --files index.html styles.css",
  "sass": "sass styles.scss styles.css -w",
  "dev": "concurrently npm:sass npm:sass"
},

og þá getum við keyrt bæði tólin okkar í einu með:

> npm run dev

Það er venja að hafa skriptu sem heitir eitthvað í áttina að dev (fyrir development) til að keyra þróunartól í gang. Ef við bætum við skriptu sem heitir start er búist við að hún keyri upp raunkeyrslu útgáfu (e. production) af verkefninu. Þá er líka hægt að nota beint npm start.

24.6 stylelint

Seinasta CSS þróunartólið sem við setjum upp er stylelint en eins og nafnið gefur til kynna er það linter fyrir CSS (og fleiri mál, t.d. Sass). Því fylgja margar reglur sem hægt er að sér sníða fyrir hvert og eitt verkefni, eða fá ákveðnar best practices reglur með, t.d. stylelint-config-primer sem inniheldur grunnreglur og styður sass.

npm install --save-dev stylelint
npm install --save-dev stylelint-config-primer

Til þess að kveikja á stylelint-config-primer reglunum þurfum við að búa til .stylelintrc skrá (skrár sem byrja á . eru oft notaðar til að geyma stillingar, en þær geta líka valdið vandræðum þar sem mörg stýrikerfi fela þær) sem inniheldur:

{
  "extends": "stylelint-config-primer"
}

og bætum við skriptu sem keyrir tólið:

"scripts": {
  "browser-sync": "browser-sync start --server --files index.html styles.css",
  "sass": "sass styles.scss styles.css -w",
  "dev": "npm-run-all --parallel sass browser-sync",
  "lint": "stylelint styles.scss --syntax scss"
},

Ef við núna skrifum sass/css sem ekki er talið gott samkvæmt reglunum sem við höfum valið okkur:

h1 {
  color: red;
}

og keyrum lint til að athuga (-s stendur fyrir silent, en þá sleppir npm að sýna upplýsingar um keyrslu)

> npm run lint -s
styles.scss
1:1   ✖  Expected "h1" to have no more than 0 type  selector-max-type selectors
3:10  ✖  Unexpected named color "red"               color-named

Þegar við vinnum í verkefnum í teymi, þar sem ákveðnar reglur um kóðastíl hafa verið skilgreindar förum við eftir þeim til að halda samræmi. Við erum e.t.v. ekki alltaf sammála reglunum, en við treystum því að það séu góðar ástæður þar að baki, eða ræðum við teymið okkar um að breyta þeim.

Allar reglur sem hægt er að stilla í Stylelint má nálgast á vefnum. Ef við viljum breyta því hvernig regla virkar getum við stillt hana sérstaklega í .stylelintrc, t.d. banna tómar athugasemdir:

{
  "extends": "stylelint-config-primer",
  "rules": {
    "comment-no-empty": true
  }
}

Það geta þó komið upp aðstæður þar sem við viljandi brjótum almenna reglu fyrir sértækt tilvik. T.d. viljum við setja letur á html en Stylelint vill ekki að við notum type-selector. Við getum þá slökkt á athugun á þeirri línu með /* stylelint-disable-line */ (einnig hægt að slökkva á fleiri vegu).