Parallax Vanilla

Mieux que mieux !

En modifiant uniquement les éléments transform et opacity des objets parallaxés, on gagne en performance par rapports aux parallax qui modifient les margin, padding, top, left, etc. Alors, c'est mieux.
Et comme c'est un constructeur vanilla, pas besoin de jQuery. Alors, c'est encore mieux.

Nouveauté aout 2021 !

Maintenant, on peut appliquer des transform et une opacité aux objets parallaxés via CSS sans que ceux-ci ne soient écrasés par le script !

La méthode ?
Récupérer la valeur du transform initial dans un objet matrice var matrix = getComputedStyle(plugin.el).transform;.
Manipuler cet objet pour retrouver les valeurs de translate, rotate, scale, skew et opacity.
Modifier les paramètres du parallax en fonction de ces valeurs.
Du bon jus de cerveau qui m'a presque grillé quelques neurones !

Télécharger les fichiers

Fichier source JS
Fichier JS minifié

Utilisation du plugin

Inclure le plugin à sa page

<script type="text/javascript" src="js/regal-parallax-vanilla.js"></script>

Déclarer les objets :

var regalParallax = document.querySelectorAll('.js-regaloeb-parallax');
for(var i=0; i<regalParallax.length; i++){
    new RegalParallax( regalParallax[i]);
}

HTML

On détermine les propriétés à animer avec des attributs "data-XXX".
L'attribut data-x="INITIAL#FINAL" indique que le translateX sera modifiée via la propriété translate3d.
L'attribut data-y="INITIAL#FINAL" indique que la translateY sera modifiée via la propriété translate3d.
L'attribut data-scale="INITIAL#FINAL" indique que la scale sera modifiée, INITIAL: scale initiale, FINAL: scale finale.
L'attribut data-scaleX="INITIAL#FINAL" indique que la scaleX sera modifiée, INITIAL: scaleX initiale, FINAL: scaleX finale.
L'attribut data-scaleY="INITIAL#FINAL" indique que la scaleY sera modifiée, INITIAL: scaleY initiale, FINAL: scaleY finale.
L'attribut data-rotate="INITIAL#FINAL" indique que la rotation sera modifiée, INITIAL: rotate initiale, FINAL: rotate finale.
L'attribut data-skewX="INITIAL#FINAL" indique que le skewX sera modifiée, INITIAL: skewX initiale, FINAL: skewX finale.
L'attribut data-skewY="INITIAL#FINAL" indique que le skewY sera modifiée, INITIAL: skewY initiale, FINAL: skewY finale.
L'attribut data-o="INITIAL#FINAL" indique que l'opacité sera modifiée.
L'attribut data-end="NUM" indique à quel endroit du viewport l'objet atteint ses valeurs finales : 2 = au milieu, 3 = au 2/3, 1 au scroll 0. Valeur par défaut: 2.

Lorsque l'élément arrive dans le viewport, la propriété prend la valeur INITIAL
À l'endroit du viewport déterminé par data-end (au milieu par défaut), la propriété prend la valeur FINAL.

On peut aussi déterminer les propriétés à animer en javascript :
var monParallax = new RegalParallax( document.querySelector('.element'), {'y':'110#0', 'x':'-30#0', 'end':'4'});
Les noms des paramètres sont les mêmes qu'en version HTML sans "data-".
Les propriétés déclarées en javascript écrasent les valeurs déclarées en HTML.

C'est ouam

data-rotate="360#0"
scaleX(-1) en CSS
Une scale négative permet d'appliquer un effet miroir à l'élément.

C'est ouam

data-x="500#0" data-skewX="40#0"
skewX:10deg, skewY:25deg et translateX:-50% initiaux en CSS

C'est ouam

data-x="-500#0"

C'est ouam

data-y="-200#0"

C'est ouam

data-scaleX="0#1" data-scaleY="0#1"
scaleX(-.5) scaleY(.5) en CSS.

C'est ouam

data-scaleY="2#1"

C'est ouam

data-o="0#1"
opacity:.5 en CSS

C'est ouam

data-skewX="50#0"

C'est ouam

data-skewY="50#0"

C'est ouam

data-skewX="50#0" data-skewY="50#0"

C'est ouam

data-rotate="360#0" data-x="true" data-x-depth="-2" data-o="0#1" data-scale="0#1"

C'est ouam

data-rotate="360#0" data-end="1"

Pour parallaxer un background, il faut ruser...
Un conteneur principal (.bg) avec position: relative; et overflow: hidden;
L'élément parallaxé est en position: absolute; z-index: -1; left: -50%; top: 0; width: 200%; height: 200%; background-position: 50% 50%; et il a une image de fond plus grande que son conteneur.
On y applique un data-y="INITIAL#FINAL".

Avec un data-x="INITIAL#FINAL".

C'est ouam C'est ouam

Avec data-x="INITIAL#FINAL" + data-y="INITIAL#FINAL".

Avec un data-x="INITIAL#FINAL" et data-end="2".

C'est ouam

Autre méthode bien plus simple car on n'utilise pas le plugin !! :
Juste appliquer un background-fixed au conteneur !

Mais beaucoup de mobiles ne comprennent pas le background-fixed (les nazes)...

Merci, c'est tout pour l'instant.