Regendruppels op een waterplas als achtergrond
Hieronder zie je een foto van een roos. Die lijkt op/in water te drijven. Een simulatie van regendruppels en de kringen
die daardoor in het water ontstaan versterkt de illusie.
Als je op een willekeurige plek in het document klikt ontstaan ook van die kringen.
Met de drie knoppen kun je het effect laten pauzeren, weer hervatten en helemaal uitschakelen. In het laatste geval verdwijnt de 'uitschakelen'-knop en kan het effect alleen weer worden ingeschakeld door de pagina te verversen.
Op deze bladzijde wordt beschreven hoe je zoiets maakt. De benodigde code is beschikbaar op GitHub.
- Er worden twee items besproken:
- De werking van het script, in algemene termen.
- Inbouwen in je eigen site.
- Dit effect vraagt veel rekenkracht van je computer, zowel van de CPU als van de grafische kaart. Op wat oudere en/of tragere machines kan het effect schokkerig verlopen.
- Om dit te laten werken is WebGL nodig. Alle grote browsers ondersteunen
dat, mits die goed up-to-date zijn. Met browsers die WebGL niet ondersteunen, krijg je een foutmelding te zien. Die verschijnt
onder de drie knoppen.
- De werking van het script
- Dit script is een jQuery-plug-in. Behalve het script heb je dus ook jQuery nodig. De originele code gebruikt versie 3.0. Op deze pagina is versie 1.9.1 gebruikt. Dat werkt ook prima.
- jQueryDit kun je het beste van een CDN halen. Hier is Google Apis ingezet.
- Het script zelf bestaat uit een JavaScript-bestand met de naam jquery.ripples-min.js. Dat hoef je niet aan te passen.
- Behalve jquery.ripples-min.js is er ook een $(document).ready()-function. Daarin worden de de kringen gedefinieerd en worden de acties van de drie knoppen vastgelegd. Ook wordt de animatie gestart van de regendruppels op de foto.
- N.B.: Het JavaScript bevat naast de $(document).ready()-function geen andere code. Daarom hoeft het JavaScript niet onderaan de pagina te staan.
- HTML wordt gebruikt om de foto te positioneren en om de knoppen te maken. Al het andere wordt geregeld door CSS.
- De foto is de achtergrond van de –lege–tag <div id="roosje">. Hij is te vinden op mijn
fotosite.
- Om het effect op je scherm je krijgen roep je de methode ripples() aan. Je geeft daar een of meerdere parameters aan mee, waarvan de eerste een keyword is, waarmee je aangeeft wat er gedaan moet worden.
Keyword | Betekenis | |
(object) | Maak een ripples-effect. Geef een aantal instellingen op in een object; de parameterlijst
mag leeg zijn. $(selector).ripples() $(selector).ripples({ imageURL: ....., // string. Indien leeg dan wordt de achtergrond van het betreffende element gebruikt. default: leeg dropRadius: ..., // float. Straal (in px) van de druppels die worden gemaakt. default:20 perturbance: .., // float. Mate van verstoring. Dit bepaalt de hoogte van de golf. Er is geen golf als dit nul is. default: 0.03 resolution: ..., // integer. Afmetingen van het blok waarin wordt door WebGL gerenderd. Hoe hoger dit getal, hoe mooier het effect en hoe trager de golf loopt. default: 256 interactive: .., // boolean. Bepaalt of muisklikken en -bewegingen het effect start. default: true }) |
|
drop | Laat een druppel vallen op de plaats die wordt aangegeven door x en y. De druppel
heeft een straal van radius en de amplitude (de golfhoogte van de kring) is strength: $(selector).ripples('drop', x, y, radius, strength) |
|
destroy | Verwijder het effect van het element $(selector).ripples('destroy') Het effect zet je weer terug door het opnieuw op te bouwen. Dat doe je door een nieuw object op te bouwen. |
|
hide / show | Verberg of toon het effect. $(selector).ripples('hide') $(selector).ripples('show') Gebruik dit in combinatie met 'pause' resp. 'play'. |
|
pause / play | Pauzeer het effect of laat het verder gaan. $(selector).ripples('pause') $(selector).ripples('play') Gebruik dit in combinatie met 'hide' resp. 'show'. |
|
set | Verander een enkele waarde van het ripless()-object. $(selector).ripples('set', name, value) Voor name kun je gebruiken: dropRadius, perturbance, interactive en imageUrl. Voor value geef je de gewenste waarde op. Het is, om begrijpelijke redenen, niet mogelijk om resolution aan te passen. Als je dat toch wilt, moet je een nieuw object maken. |
|
updateSize | Stel de afmetingen van het effect opnieuw in. $(selector).ripples('updateSize') Deze code moet je uitvoeren als de afmetingen het element, waarop het effect actief is, veranderen. |
- In het overzicht zijn combinaties genoemd van pause en hide resp. play en show. Daarmee wordt
bereikt dat het effect net even iets mooier verloopt bij in- en uitschakelen. Als je alleen pause en show zou
gebruiken, blijft het script doorlopen wat zich uit in druppels die geen kringen veroorzaken. Dat wordt zichtbaar als witte
vlekjes die op de foto ontstaan. Als je daarna weer show toepast, ontstaan de kringen alsnog. Er zijn dan (te) veel
kringen en dat is lelijk.
- Inbouwen in je eigen site
- Ga naar de GitHub-pagina. Klik op de groene knop "Clone or download". Klik daarna op "Download ZIP".
- Pak het gedownloade .zip-bestand uit. Zoek de map dist op en open die. Kopieer het bestand jquery.ripples-min.js naar de map waar je website-bestanden staan. De overige bestanden in de file die je van GitHub hebt gehaald zijn niet nodig om het effect werkend te krijgen.
- Download de .zip file van deze site en pak hem uit. Hierin vind je de code om in te bouwen in je eigen website-pagina.
- Regel een goede foto om het effect op te laten werken. Pas de afmetingen height en width aan in het CSS-blok #roosje. Hier staan die op 420px resp. 560 px.
- Maak desgewenst de knoppen op naar je eigen smaak. Dat doe je door CSS-opmaak instellingen de maken voor de button-tag,
of apart voor de drie klassen js-ripples-pause, js-ripples-play en js-ripples-disable.
- Het is mogelijk de foto en de knoppen weg te laten. In dat geval verwijder je de regel <div id="roosje"></div>
uit het document, evenals de drie button tags.
Verwijder ook de blokken body en #roosje uit de CSS. Verwijder ook de blokken die verwijzen naar #roosje en de drie button-klassen uit het JavaScript, alsmede de setInterval function waarmee de regendruppels op de foto worden gemaakt.
- Het is mogelijk om het regendruppels uit te schakelen die in het document verschijnen na een muisklik. Verwijder dan het blok dat verwijst naar body uit de try ... catch in het JavaScript.
- Om de druppels op het hele document te laten vallen vervang je de verwijzingen naar #roosje door body. Je kunt hier ook blok-elementen in zetten zoals main, article, section, enz.
Gebruik:
- De code staat gedeeltelijk in de <HEAD> en gedeeltelijk in de <BODY>.
De code van het voorbeeld ziet er als volgt uit:
(Zet dit in de <HEAD>).
<style>
body {
overflow-x: hidden;
}
#roosje {
background-image:url("foto.jpg");
position:relative;
left:50%;
top:0;
transform:translateX(-50%);
width:560px;
height:420px;
}
.error {
font-weight:bold;
color: red;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js">
</script>
<script src="jquery.ripples-min.js"></script>
<script>
$(document).ready(function() {
try {
$('body').ripples({
resolution: 512,
dropRadius: 20, //px
perturbance: 0.04,
});
$('#roosje').ripples({
resolution: 256,
dropRadius: 10, //px
perturbance: 0.004,
interactive: false
});
}
catch (e) {
$('.error').show().text(e);
}
$('.js-ripples-disable').on('click', function() {
$('#roosje').ripples('destroy');
$(this).hide();
});
$('.js-ripples-play').on('click', function() {
$('#roosje').ripples('play');
$('#roosje').ripples('show');
});
$('.js-ripples-pause').on('click', function() {
$('#roosje').ripples('pause');
$('#roosje').ripples('hide');
});
// Automatic drops
setInterval(function() {
var $el = $('#roosje');
var x = Math.random() * $el.outerWidth();
var y = Math.random() * $el.outerHeight();
var dropRadius = 10;
var strength = 0.04 + Math.random() * 0.04;
$el.ripples('drop', x, y, dropRadius, strength);
}, 400);
});
</script>
(Zet dit in de <BODY> op de plaats waar de prent met het regendruppel-effect moet verschijnen).
<div id="roosje"></div>
<div style="text-align:center;margin:15px 0;">
<button class="js-ripples-pause" type="button">Effect
pauzeren</button>
<button class="js-ripples-play" type="button">Effect
hervatten</button>
<button class="js-ripples-disable" type="button">Effect
uitschakelen</button>
</div>
<div class="error"></div>