Basiscursus javascript en jQuery
Een website bouwen
Natuurlijk is het uiteindelijk de bedoeling dat de informatie niet in de console weergegeven wordt maar in een HTML pagina geplaatst wordt. En dat de gebruiker vanuit die pagina opdrachten kan geven aan het script.
In de opdracht arrays heb je geleerd hoe je jQuery objecten maakt en in de pagina plaatst.
Dit gaan we nu gebruiken om een website dynamisch op te bouwen.
Laten we beginnen met een voorbeeld met wat tekst, foto’s en knoppen .
- Maak een nieuw project aan.
- De foto’s staan altijd in een map met de naam images in de projectmap.
Maak in de projectmap een map images - Download hier de foto’s die je gaat gebruiken.
Plaats de foto’s in de map images.
In deze map staat ook een tekstbestand. Deze tekst heb je later in deze opdracht nodig. - Bouw stap voor stap mee met het voorbeeld.
- Controleer na elke stap in de browser of je de code goed hebt gemaakt.
Kijk ook in de console om foutmeldingen te zien en om te controleren of er ook gebeurt wat jij wilt. - Ga pas verder met een volgend blok als alles goed werkt en als je echt begrijpt hoe het werkt.
HTML - De wrapper
We beginnen net het maken van een div in het bestand index.html.
We geven deze div de id wrapper
Alles wat je altijd al over fruit wilde weten
CSS - Maak het zichtbaar
Dan schakelen we over naar het bestand style.css.
Nadat we enkele standaard rules gemaakt hebben geven we de body en de wrapper enkele eigenschappen mee.
In de CSS-rule met de asterisk (*) op regel 2 tot 6 maken we enkele declaraties die voor alle elementen in het project gelden.
We noemen deze rule een CSS reset
Een h1 tag heeft bijvoorbeeld standaard een margin van ongeveer 10px.
Die wordt met deze rule teruggezet naar 0px
het gedeelte van de interface van een webbrowser waarbinnen de inhoud van een website wordt weergegeven heet de viewport.
In de code wordt dat body genoemd.
Met de CSS-rule op regel 7 tot 10 krijgt de viewport een breedte en een hoogte, namelijk de actuele hoogte en breedte van het browserscherm.
De wrapper geven we ook wat uiterlijke kenmerken.
Met position en margin zetten we de wrapper horizontaal in het midden van de body.
Met width en height geven we het een afmeting en met background-color maken we hem zichtbaar.
De background zullen we later weer verwijderen. Die is er nu tijdelijk toegevoegd om de wrapper ook zonder inhoud zichtbaar te maken. Dat is gemakkelijk tijdens het werken.
@charset "UTF-8";
*{
margin: 0;
padding: 0;
font-family: sans-serif;
}
html, body{
width: 100%;
height: 100%;
}
#wrapper{
position: relative;
margin: 0 auto;
width: 80%;
height: 90%;
background-color: lightgreen;
}
Het menu
En nu dan eindelijk naar code.js om met ons eerste serieuze script te gaan beginnen.
Op regel 3 maken we een variabele menu van het type object
Tussen de haakjes achter het jQuery symbool typen we tussen aanhalingstekens een stukje HTML-code.
Voordat we verder gaan geef ik hier een korte uitleg over het opbouwen van het object. We doen dat met de volgende coderegel:
var menu = $(“<div id = ‘menu’></div>”);
- Eerst maken we een variabele met de naam menu waarin het object dat we gaan bouwen opgeslagen kan worden.
- Met $(); wordt aangegeven dat er een jQuery object gemaakt wordt.
- Tussen de haakjes plaatsen we een string met het HTML element dat we willen maken. In dit geval een div.
- Bij het geven van een id aan het element gebruiken we enkele aanhalingstekens omdat met dubbele aanhalingstekens de string afgebroken zou worden.
Het object is dus een div-element met de id menu.
Op regel 4 plaatsen we dat object in de wrapper.
In het CSS-bestand geven we de div menu een uiterlijk.
De achtergrondkleur is tijdelijk. Als het werk klaar is verwijderen we die weer, maar voor nu is het een gemakkelijk controlemiddel.
$(document).ready(function(){
var menu = $("");
$('#wrapper').append(menu);
}
#menu{
position: relative;
width: 100%;
height: 50px;
background-color: lightcoral;
}
De knoppen
Dan gaan we nu de buttons maken.
Op regel 6 van het voorbeeld maken we een array fruit met daarin de woorden die op de buttons moeten komen.
Op regel 8 tot 11 zien we een for-loop.
De for-loop maakt voor elk element in de array fruit een object button.
Zodra een button gemaakt is wordt deze in de div menu geplaatst.
Als je de werking van de for-loop niet goed begrijpt ga je even terug naar deze pagina om je kennis op te frissen.
Met CSS geven we wat uiterlijke kenmerken aan de buttons.
Voeg ook de text-align regel toe aan #menu.
$(document).ready(function(){
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
}
#menu{
position: relative;
width: 100%;
height: 50px;
text-align: center;
background-color: lightcoral;
}
.btn{
display: inline-block;
padding: 20px 10px 10px 10px;
}
De tekst klaarzetten voor gebruik
We maken een array waarin we de tekst over fruit opnemen.
De tekst staat in het tekstbestand in de map images.
Kijk goed in het voorbeeld hoe de structuur van de array is.
Let ook op de inline tag <br>
$(document).ready(function(){
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
Een pagina maken
De knoppen zijn gemaakt, maar nog niet klikbaar,
Dat komt later.
Nu gaan we de eerste pagina opbouwen.
We maken een nieuwe functie buildPage() waarin we een object gaan opbouwen en in de wrapper plaatsen.
Het object is een div waaraan we in de volgende stap inhoud gaan toevoegen.
Op de laatste regel van het script roepen we de buildPage functie aan.
De div wordt dan ook echt gemaakt en in de wrapper gezet.
Met CSS geven we de pagina een uiterlijk zodat we in firefox kunnen controleren of het werkt.
De achtergrondkleur is weer tijdelijk als controlemiddel toegevoegd.
$(document).ready(function(){
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
function buildPage(){
var pagina = $("");
$('#wrapper').append(pagina);
}
buildPage()
}
.page{
position: relative;
width: 100%;
height: 200px;
margin-top: 5px;
background-color:lightblue;
}
De kop en tekst toevoegen
We gaan verder met het opbouwen van de pagina in buildPage.
Nadat we de div in de wrapper hebben gezet maken we een object kop.
Dit is een h1-tag waarin we de waarde van het eerste element van de array fruit gaan plaatsen.
Om dat te doen maken we op de eerste regel van het script een globle variabele met de naam paginaNummer met de waarde 0.
Een globale variabele kan overal in het script gebruikt worden.
Als we in de buildPage functie fruit[paginaNummer] in de h1-tag zetten wordt het eerste element van fruit opgehaald en geplaatst.
Op dezelfde manier genereren we het object txt.
Daarin zetten we een p-tag met het eerste element uit de array beschrijving.
Tenslotte plaatsen we de objecten kop en txt in het object pagina.
$(document).ready(function(){
var paginaNummer = 0;
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
function buildPage(){
var pagina = $("");
$('#wrapper').append(pagina);
var kop = $(""+fruit[paginaNummer]+"
");
var txt = $(""+beschrijving[paginaNummer]+"
");
pagina.append(kop).append(txt);
}
buildPage()
});
De foto toevoegen
Nog steeds in dezelfde functie waar we de pagina opbouwen maken we een nieuw object met de naam foto.
In dit object maken we het HTML element img.
Bestudeer de opbouw van het object zorgvuldig.
Het pad naar de bron van het bestand moet correct genoteerd worden en ook de juiste extensie moet natuurlijk toegevoegd worden.
Vraag om extra uitleg als je het niet begrijpt!
Ook dit object plaatsen we met append in het object pagina dat zojuist is gemaakt.
$(document).ready(function(){
var paginaNummer = 0;
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
function buildPage(){
var pagina = $("");
$('#wrapper').append(pagina);
var kop = $(""+fruit[paginaNummer]+"
");
var txt = $(""+beschrijving[paginaNummer]+"
");
var foto = $("");
pagina.append(kop).append(txt).append(foto);
}
buildPage()
});
Display none & FadeIn
In het CSS verwijder je de achtergrondkleuren van het menu en de page. Die hebben we niet meer nodig.
Aan de page voegen we de regel display:none; toe.
De pagina zal daardoor niet weergegeven worden.
De image geven we een breedte van 100% zodat die dezelfde breedte krijgt als de wrapper.
In JS voegen we de regel pagina.fadeIn(500); toe.
Da pagina zal nu infaden. Deze animatie duurt 500 miliseconden.
.page{
position: relative;
width: 100%;
height: 200px;
margin-top: 5px;
display: none;
}
img{
width: 100%;
}
$(document).ready(function(){
var paginaNummer = 0;
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
function buildPage(){
var pagina = $("");
$('#wrapper').append(pagina);
var kop = $(""+fruit[paginaNummer]+"
");
var txt = $(""+beschrijving[paginaNummer]+"
");
var foto = $("");
pagina.append(kop).append(txt).append(foto);
pagina.fadeIn(500)
}
buildPage()
});
De knoppen klikbaar maken
Dan is het nu tijd om de knoppen klikbaar te maken.
Direct onder de builPage functie voegen we een nieuwe fucntie toe waarmee JS een klik op elk element met de classname btn kan detecteren.
We maken hier een lokale variabele met de naam gekozenFruit die als waarde krijgt; de tekst die op deze (this) knop staat.
Controleer in de console of de juiste tekst opgehaald wordt.
$(document).ready(function(){
var paginaNummer = 0;
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
function buildPage(){
var pagina = $("");
$('#wrapper').append(pagina);
var kop = $(""+fruit[paginaNummer]+"
");
var txt = $(""+beschrijving[paginaNummer]+"
");
var foto = $("");
pagina.append(kop).append(txt).append(foto);
pagina.fadeIn(500)
}
$('.btn').click(function(){
var gekozenFruit = $(this).text();
console.log(gekozenFruit);
});
buildPage()
});
Een nieuwe pagina maken
Als de juiste waarde in de variabele gekozenFruit bewaard is, gaan we kijken wat het volgnummer is van die waarde in de array fruit en slaan dat volgnummer op in de globale variabele paginaNummer.
Nu paginaNummer een nieuwe waarde heeft kan de functie buildPage opnieuw worden aangeroepen.
Er zal een nieuwe pagina opgebouwd worden en die zal onder de eerste pagina weergegeven worden.
Dat is uiteraard niet de bedoeling. We willen dat maar één pagina tegelijk gedisplayd wordt.
$(document).ready(function(){
var paginaNummer = 0;
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
function buildPage(){
var pagina = $("");
$('#wrapper').append(pagina);
var kop = $(""+fruit[paginaNummer]+"
");
var txt = $(""+beschrijving[paginaNummer]+"
");
var foto = $("");
pagina.append(kop).append(txt).append(foto);
pagina.fadeIn(500)
}
$('.btn').click(function(){
var gekozenFruit = $(this).text();
paginaNummer = fruit.indexOf( gekozenFruit )
buildPage()
});
buildPage()
});
fadeIn en fadeOut
Om de bestaande pagina te laten verdwijnen voegen we een regel toe aan de buildPage functie.
Met $(“.page”).fadeOut(500); faden we alle elementen met de classname page uit.
Pas daarna laten we de nieuwe pagina infaden.
Beide animaties duren weer een halve seconde, maar ze beginnen tegelijk.
Daardoor zal er bij de paginawisselen een onrustig beeld ontstaan.
Dat gaan we in de volgende stap oplossen.
$(document).ready(function(){
var paginaNummer = 0;
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
function buildPage(){
var pagina = $("");
$('#wrapper').append(pagina);
var kop = $(""+fruit[paginaNummer]+"
");
var txt = $(""+beschrijving[paginaNummer]+"
");
var foto = $("");
pagina.append(kop).append(txt).append(foto);
$(".page").fadeOut(500);
pagina.fadeIn(500)
}
$('.btn').click(function(){
var gekozenFruit = $(this).text();
paginaNummer = fruit.indexOf( gekozenFruit )
buildPage()
});
buildPage()
});
Timeout
Met de setTimeout functie laten we JS een halve seconde wachten voordat het codeblok in de timeout uitgevoerd wordt.
De fadeIn animatie start dus pas als de fadeOut klaar is.
$(document).ready(function(){
var paginaNummer = 0;
var menu = $("");
$('#wrapper').append(menu);
var fruit = ["fruit", "banaan", "druif", "mango", "aardbei"];
var beschrijving = ["Fruit komt in vele vormen en kleuren.
Elk stuk fruit heeft zijn eigen unieke vorm en kleur.",
"Bananen zijn lang en krom met een gladde, gele schil.
Binnenin zijn ze zacht en wit.",
"Druiven zijn klein, rond en komen in trossen.
Ze hebben een glanzende, vaak paarse of groene schil.",
"Mango's hebben een ovale vorm met een stevige, groene, gele of rode schil.
Hun vruchtvlees is oranje en sappig.",
"Aardbeien zijn klein, rood en hartvormig.
Ze hebben kleine zaadjes aan de buitenkant en een groene kroon bovenop."];
for(var i = 0 ; i < fruit.length ; i++){
button = $(""+fruit[i]+"
");
menu.append(button);
}
function buildPage(){
var pagina = $("");
$('#wrapper').append(pagina);
var kop = $(""+fruit[paginaNummer]+"
");
var txt = $(""+beschrijving[paginaNummer]+"
");
var foto = $("");
pagina.append(kop).append(txt).append(foto);
$(".page").fadeOut(500);
setTimeout(function(){
pagina.fadeIn(500)
}, 500);
}
$('.btn').click(function(){
var gekozenFruit = $(this).text();
paginaNummer = fruit.indexOf( gekozenFruit )
buildPage(paginaNummer)
});
buildPage()
});
Opdracht
Kennis en vaardigheden
- Bouw met behulp van de beschrijving bovenstaande website na.
- Voeg minimaal één extra pagina toe.
- Voeg op elke pagina minimaal één element toe. Dat kan een extra stukje tekst zijn, bijvoorbeeld een quote over het fruit dat op die pagina getoond en beschreven wordt.
- Maak met CSS de vormgeving aantrekkelijker.
- Vanuit JS een HTML-element aanroepen of bewerken.
- CSS reset
- Viewport
- Object
- Gebruik van enkele en dubbele aanhalingstekens.
- Globle variabele
- Lokale variabele
- FadeIn
- FadeOut
- Timeout
- This