Dans ce chapitre nous allons voir quelques fonctions utiles que l'on retrouvera assez souvent dans du code JavaScript côté navigateur.
Positionnement
Il existe 2 moyens de récupérer la position d'un élément.
- getBoundingClientRect() retourne un DOMRect fournissant des informations sur la taille de l'élément et sa position de l'élément par rapport à la zone d'affichage.
- offsetLeft et autre propriété commençant par "offset" permet de récupérer la position de l'élément par rapport à son noeud
offsetParent()
.
Il est possible d'utiliser les propriétés offset de manière récursive pour connaitre la position d'un élément par rapport au haut du document à l'aide de la récursivité.
/**
* Récupère la position d'un élément par rapport au document
* @param {HTMLElement} element
**/
function recursiveOffsetTop (element) {
if (element.offsetParent) {
return element.offsetTop + recursiveOffsetTop(element.offsetParent)
}
return element.offsetTop
}
Dataset
Les éléments HTML peuvent recevoir des attributs de données qui permettent de passer des information vers le JavaScript. Ces attributs seront préfixé par un data-
.
<article data-author="John Doe" data-author-age="18">
...
</article>
Il sera ensuite possible de récupérer ces attributs avec une propriété spéciale dataset
.
const article = document.querySelector('article')
article.dataset.author // "John Doe"
article.dataset.authorAge // "18"
Vous pouvez aussi utiliser dataset en écriture pour ajouter des attributs de données à un élément.
article.dataset.publisher = "Mon Petit Livre"
Animation CSS
Il est possible d'animer un élément à l'aide de la méthode animate qui utilisera le même principe d'animation que les animations CSS.
document.querySelector("button").animate([
// étapes/keyframes
{ transform: 'translateY(0px)' },
{ transform: 'translateY(-300px)' }
], {
// temporisation
duration: 1000,
iterations: Infinity
})
Les média query
Si on souhaite effectuer une opération en fonction de la dimension de l'écran il est possible d'utiliser le système de media-query déjà vu en CSS.
const mediaQuery = window.matchMedia("(min-width: 400px)")
mediaQuery.matches // true ou false suivant la taille de l'écran
Il est aussi possible d'utiliser un écouteur d'évènement pour détecter le changement.
mediaQuery.addEventListener('change', e => {
e.matches // true ou false suivant la taille de l'écran
})