Basiscursus HTML en CSS
Relatief en absoluut positioneren
De volgende opdracht gaat over het positioneren van elementen op de pagina.
We gaan twee methoden oefenen. absoluut en relatief.
Met absoluut positioneren bepalen we heel nauwkeurig de positie van een element.
Het nadeel van absoluut positioneren is dat op een telefoon een heel andere indeling van de pagina nodig is.
Met relatief positioneren is de positie van een element afhankelijk van de directe omgeving van dat element.
Daardoor is de indeling veel flexibeler en zal de opmaak gemakkelijker voor de verschillende maten devices in orde gemaakt kunnen worden.
In de vorige opdracht leerde je de afmetingen van een div in pixels te definieren.
Ook dat levert vaak een probleem op bij de weergave op andere formaten beeldschermen.
Daarom wordt er zoveel mogelijk gebruik gemaakt van procenten bij het bepalen van de afmetingen van elementen.
Voorbeeld: Een website wordt weergegeven op een laptop. Het scherm, dus ook de browser is 1200 pixels breed.
Als een div met een breedte van 50% de body staat heeft deze div een breedte van 600pixels.
Als de browser een andere breedte krijgt verandert ook de breedte van de div.
The Wall
- Maak een nieuw project door de map basisbestanden te kopieren.
Noem de nieuwe map opdracht-4 - Download hier de bestanden die je nodig hebt voor deze opdracht.
Zet de bestanden in de map images van opdracht-4 - Verander de titel in de index in Frame on the wall
- Maak in de body een div met de id wall
- Neem de CSS code voor #wall over in jouw CSS-bestand.
- Als je nu het resultaat in Firefox controleert zie je nog een wit vlak.
Dat komt omdat de elementen body en html nog geen hoogte hebben.
Voeg de css-rule voor body en html toe aan je css-code. - De achtergrond is nu een stenen muur.
Maar er staat nog een witte rand omheen.
Dat komt omdat alle elementen standaard een margin en een padding krijgen.
Deze begrippen worden in een volgende les nog behandeld.
Nu schakelen we die standaardinstelling uit door de code met de asterisk (*) toe te voegen. - Controleer vanaf nu na elke property in Firefox het resultaat.
Door telkens het resultaat in Firefox te controleren leer je vanzelf om de verschillende properties te herkennen. Je kunt ze dan ook gebruiken als je een toets moet maken.
En nog een keer! Gebruik de suggesties van Sublime Text om sneller te werken en minder fouten te maken.
Frame on the wall
@charset "UTF-8";
#wall{
position: relative;
margin: 0 auto;
width: 100%;
height: 100%;
background-image: url(images/brick_wall.jpg);
background-repeat: no-repeat;
background-size: cover;
}
@charset "UTF-8";
body,html {
height: 100%;
}
@charset "UTF-8";
*{
padding: 0;
margin: 0;
}
Picture on the wall
Frame on the wall
- Maak in de div #wall een geneste div met de id picture1 en de classname picture.
Als je je werk bekijkt in Firefox zie je nog niets.
Dat komt omdat #picture1 geen eigenschappen en geen inhoud heeft.
We gaan er dus maar meteen een afbeelding inzetten.
- Zet in #picture1 een img-element met de classname photo.
Het pad naar de afbeelding is images/carnaval (en vergeet de extensie niet)De foto staat nu linksboven voor de muur. We gaan de grootte en de positie van #picture1 aanpassen en vervolgens .photo dezelfde breedte geven als zijn parent-element.
Het parent element is dus de div waar de afbeelding in staat.
- Neem de css-code over en controleer weer elke keer wat er verandert in het resultaat.
.picture{
position: relative;
top: 22%;
margin-left: 13%;
width: 30%;
}
.photo{
width: 100%;
}
Picture in a frame
Frame on the wall
- Plaats de afbeelding square_frame.png in #picture1.
In Firefox zie je dat de lijst veel te groot is en dat de afbeeldingen boven elkaar staan.
Dat gaan we nu meteen oplossen. - Voeg de css-code toe.
Beide images worden absoluut gepositioneerd.
Daardoor staan ze allebei linksboven in het parent-element: #picture1.
De breedte van .frame wordt ook op 100% van het parent-element ingesteld. - Omdat .photo en .frame precies dezelfde css-rule hebben mogen ze ook samengevoegd worden.
Verander de code als in het voorbeeld.
.photo{
position: absolute;
width: 100%;
}
.frame{
position: absolute;
width: 100%;
}
.photo, .frame{
position: absolute;
width: 100%;
}
Nog eentje dan!
Frame on the wall
- Kopieer de code van regel 10 t/m regel 13.
- Plak deze code op regel 14 t/m 17.
- Verander in de nieuwe div en img de cijfers 1 door een 2
- Controleer het resultaat.
Je ziet dat de foto’s op elkaar staan.
Los dat op door display: inline-block; toe te voegen aan de rule voor .picture.
De lijsten hangen nu netjes naast elkaar. Iets te netjes misschien?
Laten we ze dan een beetje scheef hangen.
- Neem de code over.
.picture{
position: relative;
top: 22%;
margin-left: 13%;
width: 30%;
display: inline-block;
}
#picture1{
transform: rotate(-5deg);
}
#picture2{
top: 17%;
transform: rotate(4deg);
}
Margin en width in procenten
Eerst even wat uitleg bij de vorige stappen.
Je hoeft de code in dit blokje dus niet over te nemen!!!
Bij het werken in HTML en CSS worden regelmatig fouten gemaakt met de parent-child relationship.
In het voorbeeldje hiernaast zijn 3 div’s gemaakt.
Kort gezegd: Body is de parent van wrapper, en wrapper is de parent van holder.
In het CSS wordt de breedte van de body op 100% gezet.
Dat betekent dat de body de volledige breedte van de viewport krijgt.
De breedte van de wrapper op 50%.
Daarbij wordt dan gekeken naar de breedte van het parent-element.
Als de body met 100% breedte 1200 pixels is, wordt de wrapper 600 pixels.
De breedte van de holder is 75%. Dat lijkt dus groter dan de wrapper, maar ook nu wordt weer gekeken naar de breedte van de parent.
De parend (wrapper) is 600 pixels, dus de holder is 75% van 600px = 450 pixels
De marge links is voor de wrapper 10% van de breedte van de parent. Dat is in dit voorbeeld 10% van 1200 is 120 pixels.
De marge links van de holder is 5% van 600 is 30 pixels.
procenten
@charset "UTF-8";
*{
padding: 0;
margin: 0;
}
body,html {
height: 100%;
background-color: gold;
}
#wrapper{
width: 50%;
height: 300px;
margin-left: 10%;
background-color: silver;
}
#holder{
width: 75%;
height: 200px;
margin-left: 5%;
background-color: steelblue;
}
Terug naar de muur
De margin is dus de ruimte rondom het element.
margin-left is dan de ruimte links naast het element.
Er wordt hierbij natuurlijk weer gekeken naar de breedte van het parent-element.
Laten we er in het volgende voorbeeld weer van uitgaan dat #wall 1000 pixels breed is.
Als we de afbeelding dan bekijken met de informatie uit het CSS bestand kunnen we de volgende rekensom maken:
- Elke afbeelding is 30% breed.
- Elke afbeelding heeft links 13% ruimte.
- Dat is 2 x (30+13) = 86%
- De ruimte rechts naast de tweede afbeelding is dus:
100% – 86% = 14%
Maak nu een derde image.
Pas de breedte en margin zo aan dat de drie foto’s netjes verdeeld aan de muur hangen.
Geef de derde afbeelding een andere rotatie en positie vanaf de bovenkant van de muur.
Kennis en vaardigheden
Controleer of je de begrippen uit onderstaande lijst begrijpt en kunt toepassen.
Ze kunnen in een toets aan de orde komen.
- Position absolute
- Position relative
- Afmeting
- Margin-left
- Top
- Geneste divs
- Parent-element en child–element
- Werken met procenten
- backgroundImage