XHTML en CSS Ruud Koortens Frans Peeters januari 2008 Inhoudsopgave Inleiding i 1. XHTML 1.0 1 1.1. XML Declaratie 1 1.2. Het juiste DOCTYPE in hoofdletters 2 1.3. De XML-namespace 2 1.4. De
Hier komt de website.
1.1. XML Declaratie Wanneer XHTML wordt gebruikt voor de markup van websites kun je een zogenaamde XML declaratie gebruiken vóór de DOCTYPE declaratie. De XML declaratie kan weggelaten worden maar dan kan het document van geen andere karakterset dan utf-8 of utf-16 gebruik maken. 1.2. Het juiste DOCTYPE in hoofdletters De eerste regel in een XHTML-bestand geeft altijd het juiste documenttype aan. Hiervoor wordt de tag gebruikt. Dit vertelt de browser dat het navolgende document geïnterpreteerd moet worden als XHTML-document en welke regels moeten worden toegepast bij het parsen en renderen van de pagina. Bovendien wordt het DOCTYPE gebruikt voor de juiste validatie, zoals je die bij http://validator.w3.org kunt laten doen. DOCTYPE bestaat ook in HTML 4.0 maar geen browser maakt er zich druk om als het ontbreekt. Alle XHTML-tags worden in kleine letters geschreven maar het woord DOCTYPE staat altijd in hoofdletters. Aangezien er drie typen XHTML 1.0 zijn, zijn er ook drie DOCTYPES beschikbaar voor XHTML, namelijk Transitional, Strict en Frameset. We kiezen voor het DOCTYPE dat past bij XHTML Strict. Het DOCTYPE verwijst altijd naar de site van de W3C en het komt te staan vóór . 1.3. De XML-namespace Aangezien elk XHTML-bestand een valide XML-document is, moet ook de namespace worden opgegeven. Een namespace is een verzameling bij elkaar horende elementen en hun attributen die bij een zogenaamde Document Type Definition (DTD) horen. In de DTD worden formele specificaties vastgelegd op grond waarvan ze kunnen worden gevalideerd. Een DTD geeft onder meer aan wat de elementen zijn, waar ze voorkomen, wat de kenmerken zijn waaraan ze moeten voldoen, enzovoorts. Je geeft de namespace aan door de basistag uit te breiden met een aantal attributen. Behalve de locatie waar de namespace gevonden kan worden, wordt aangegeven in welke taal de XML-versie is gesteld en in welke taal het document is gesteld. De tag komt er dan op de volgende manier uit te zien: 1.4. De
Maar in XHTML moet dat zijn:
.
2.4. Elk genoemd attribuut moet een waarde hebben
Elk genoemd attribuut moet een waarde hebben, maar soms is de waarde van het attribuut gelijk aan de naam van het attribuut. Kijk maar naar het volgende voorbeeld. Het ziet er een beetje vreemd uit maar het moet wel zo.
2.5. Afbeeldingen moeten een alt hebben
In een alt wordt een beschrijving gegeven van de afbeelding die je gebruikt. Vroeger was de alt belangrijk voor browsers die bepaalde afbeeldingen niet konden weergeven, maar dat is al lang niet meer zo. Je kunt je wel voorstellen dat de alt belangrijk is voor slechtziende mensen die een spraakmodule gebruiken. De alt mag wel leeg zijn: alt=””.
2.6. Alle elementen moeten correct genest zijn
Bij het nesten van elementen moet je van binnen naar buiten werken. Het element dat het laatst is geopend, moet het eerst worden gesloten. Aan deze twee voorbeelden kun je zien wat er bedoeld wordt.
Hier is goed genest:
schuin en vet
En hier is niet goed genest:
schuin en vet
2.7. Commentaar
Normaal commentaar in HTML code ziet er als volgt uit:
Dit mag in XHTML ook zo, maar je mag niet meer dan twee streepjes na het uitroepteken plaatsen. In plaats daarvan kun je bijvoorbeeld spaties tussen de streepjes zetten.
2.8. De & en < correct coderen
De ampersand en het kleiner-dan-teken hebben een speciale betekenis en ze moeten daarom altijd aangegeven worden met hun entiteitnamen & en <. Het is trouwens altijd verstandig de entiteitnamen te gebruiken of de unicodenotatie. Een mooi overzicht vind je op Handleiding HTML: www.handleidinghtml.nl/html/karakters/karakters03.html.
3. Cascading Style Sheets
3.1. Scheiding tussen structuur, inhoud en opmaak
De structuur (en de inhoud) van een document regel je met XHTML en de opmaak leg je vast in CSS. Alles wat mogelijk was met HTML kan met CSS, maar alles wat je met CSS kunt, was lang niet mogelijk in HTML.
3.2. Overerving
De afkorting CSS staat voor Cascading Style Sheets. Een cascade is een waterval en de naam is gekozen omdat stylesheets elkaar kunnen aanvullen of overrulen via overerving. Elementen kunnen eigenschappen erven van het bovenliggende element. In CSS heet dit inheritance of overerving. Het betekent dat een kindelement de waarde van bepaalde eigenschap overneemt van het ouderelement.
Boomstructuur van overerving
Hieronder zie je de boomstructuur van een document. Hier spelen de begrippen als parent, child en afstammeling een belangrijke rol.
De bijbehorende HTML code is:
Een alinea met nadruk op een woord.
vet als het een directe nakomeling van
is. body > p { font-weight: bold; } 3.5.9. Adjacent selector Als twee elementen onder elkaar staan, krijg je soms te veel of te weinig witruimte tussen de headers. Met de adjacent selector kun je aangeven wat de afstand tussen elementen moet zijn als ze pal onder elkaar staan. Je plakt de elementen aan elkaar met het + teken en legt vast wat de afstand tot elkaar moet zijn zoals in onderstaand voorbeeld van twee headers: h1+h2 { margin-top: 11px; } Opdracht: Bestudeer het onderstaande stijlblad en beantwoord de volgende vragen. Is er sprake van een class selector of een id selector bij container, kopregel, kopregel_onder, hoofdsectie, inhoud en zijbalk? Wat is het verschil tussen een class selector en een id selector? Waar gebruik je een class selector voor en waarvoor gebruik je een id selector? Wat voor selector wordt gebruikt bij het body element? Worden er ook pseudo-class selectors gebruikt? Zo ja, noem deze. Worden de hoofdsectie, de zijbalk en de voetregel absoluut of relatief gepositioneerd? Waar kun je dit uit afleiden? /* CSS stijl */ body { /* rand, uitvulling, achtergrond, lettertype instellen */ margin: 0; padding: 0; background-color: #666666; font: small Arial, Helvetica, sans-serif; color: white; } #container{ /* plaatshouder voor alle pagina-elementen */ background-color: #ffffff; color: #000000; margin: 30px 40px 30px 40px; /* padding creëert ruimte tussen de elementen en de rand van de division */ padding: 10px; border: 1px; } /* division met elementen voor de kopsectie */ #kopregel{ background-color:#ffffff; height: 1%; } #kopregel_onder{ border-top:solid 1px #333333; background-color:#ffffff; border-bottom: 1px solid #333333; height: 1%; } #kopregel_onder a:link, #kopregel_onder a:visited{ text-decoration: none; background-color:#ffffff; color: #333333; font-style:oblique; } #kopregel_onder h1{ color: #333333; font-size:14px; font-style:oblique; font-weight: bold; } #hoofdsectie{ /*position: relative; top:0; left: 0;*/ width: 100%; margin-top: 10px; } #inhoud{ /* top right bottom left, in de richting van de klok */ margin: 0 0 0 240px; padding: 0; border: 1px solid #000059; background-color: #FFFFFF; color: #000000; } #zijbalk{ float: left; border: 1px solid #000059; width: 230px; background-color: #FFFFFF; color: #000000; margin: 0; padding: 0; } #voetregel{ clear: both; border: 1px solid #000059; margin-top: 10px; 3.6. Positionering van pagina-elementen Bij het bepalen van de positie van de verschillende pagina-elementen is het belangrijk om enkele basisprincipes voor het definiëren van een CSS lay-out te begrijpen. Aan de orde komen: de display eigenschap, positionering en de CSS Box Model techniek. 3.6.1. Display De display eigenschap kan een grote invloed hebben op een pagina lay-out. Deze eigenschap bepaalt hoe een browser een element toont en afhandelt, als een blok, een inline tekstfragment of als iets anders. Er zijn 17 mogelijke waarden, de volgende zes worden veel gebruikt: • block • inline • list-item • none • table-footer-group • table-header-group De standaard waarde wisselt van element tot element. Block elementen als p, h1, div hebben als standaard waarde block, inline elementen (binnen een deel van een tekst) als strong, span, etc. hebben standaard inline als waarde. Het toewijzen van niet-standaard waarden aan elementen kan nuttige effecten tot gevolg hebben. Als je none als waarde kiest, zal het element niet getoond worden, de ruimte die het element zou innemen wordt vrijgegeven. Dit in tegenstelling tot de eigenschap visibility: hidden. Hierbij wordt het element wel verborgen maar blijft de ruimte voor het element bezet. Een voorbeeld van display zag je in het bovenstaande stijlblad: #kop-beneden li { display: inline; background-color: #ffffff; color: #050845; } Opdracht: Zoek op bijvoorbeeld www.handleidinghtml.nl de beschrijving van de display eigenschap en de zes genoemde waarden op, noteer de waarden en de betekenis van deze waarden. Maak een webpagina met zes voorbeelden waarbij de verschillende waarden zijn toegepast. 3.6.2. Het Box Model Bij CSS wordt vaak gesproken over het Box Model. Elk element zit opgesloten in een box. Het basis CSS Box Model ziet er als volgt uit: Kijk goed naar wat het verschil is tussen de padding en de margin. Padding is de ruimte tussen het element en de (wel of niet getoonde rand (grens). De marge is de ruimte tussen de rand en een volgend element. Bij margin en padding kun je vier verschillende maten opgeven, waarbij je begint bij de top en met de wijzers van de klok meegaat. Een ezelsbruggetje dat hiervoor vaak gebruikt wordt is TRBL (trouble). Een padding van 15px 20px 30px 25px wil dus zeggen dat de top-padding 15 pixels bedraagt, de right-padding 20 pixels, de bottom-padding 30 pixels en de left-padding 25 pixels. Met padding: 15 px 25 px geef je aan dat de boven- en onderkant een padding hebben van 15 pixels en de linker- en rechterkant 25 pixels. Met padding: 20px bepaal je dat de padding aan alle kanten 20 pixels bedraagt. Opdracht: Bestudeer de onderstaande code en het voorbeeld in de browser. Padding en margin zijn hier toegepast. Ga na welk invloed margin en padding hebben op h1. Staan de zichtbare breedte en breedte van de inhoud hier vast of zijn ze afhankelijk van de grootte van het browservenster? Verklaar je antwoord.
De Watertoren in Heemstede is aan een schilderbeurt toe. De steigers zijn ... enzovoort
Watertoren in Heemstede is aan een schilderbeurt toe. De steigers zijn al geplaatst … enzovoort
Met de clear eigenschap wordt aangegeven of er links en/of rechts van het element wel of geen zwevende elementen mogen voorkomen. De mogelijke waarden zijn none, left, right en both. De beginwaarde none van de clear eigenschap bepaalt dat zwevende elementen wel zijn toegestaan naast het element waaraan de eigenschap wordt toegevoegd. Er mogen dan ook wél zwevende elementen naast het element komen staan. clear: left geeft aan dat aan de linkerkant geen zwevende elementen mogen staan clear: right geeft aan dat aan de rechterkant geen zwevende elementen mogen staan clear: both geeft aan dat er géén elementen naast het element mogen staan 3.6.6. Float en clear in de praktijk In het onderstaande ontwerp wordt clear gebruikt om er voor te zorgen dat de lay-out in de browser wordt getoond zoals deze bedoeld is. Het ontwerp bestaat uit een kopregel, drie kolommen en een voetregel. De pagina zou zonder een gekoppeld stijlblad als volgt in de browser weergegeven worden: De bovenstaande weergave illustreert het gegeven dat met CSS de ‘natuurlijke flow’ kan worden beïnvloed. Kijk eens naar de volgorde waarin de elementen in de bovenstaande webpagina worden getoond, vergelijk dit met de HTML code en kijk daarna nog eens naar de weergave mét het stijlblad.Kop
Eerste zijbalk
Tweede zijbalk
Inhoud
Voetregel
| rij 1, cel 1 | rij 1, cel 2 | rij 1, cel 1 |
| rij 2, cel 1 | rij 2, cel 2 | rij 2, cel 1 |
| rij 3, cel 1 | rij 3, cel 2 | rij 3, cel 1 |