Dans mon cas, des solutions comme setTimeout
ou MutationObserver
n'étaient pas totalement fiables. Au lieu de cela, j'ai utilisé le ResizeObserver. Selon MDN:
Les implémentations devraient, si elles suivent la spécification, déclencher des événements de redimensionnement avant le rendu et après la mise en page.
En gros, l'observateur se déclenche toujours après la mise en page, donc nous devrions pouvoir obtenir les bonnes dimensions de l'élément observé. En bonus, l'observateur renvoie déjà les dimensions de l'élément. Par conséquent, nous n'avons même pas besoin d'appeler quelque chose comme offsetWidth
(même si cela devrait fonctionner aussi).
const myElement = document.createElement("div");
myElement.textContent = "chaîne de test";
const resizeObserver = new ResizeObserver(entries => {
const lastEntry = entries.pop();
// utiliser contentBoxSize ici en alternative
// Remarque : les anciennes versions de Firefox (<= 91) ont fourni un objet de taille unique au lieu d'un tableau de tailles
// https://bugzilla.mozilla.org/show_bug.cgi?id=1689645
const width = lastEntry.borderBoxSize?.inlineSize ?? lastEntry.borderBoxSize[0].inlineSize;
const height = lastEntry.borderBoxSize?.blockSize ?? lastEntry.borderBoxSize[0].blockSize;
resizeObserver.disconnect();
console.log("largeur :", largeur, "hauteur :", hauteur);
});
resizeObserver.observe(myElement);
document.body.append(myElement);
Cela peut également être enveloppé dans une fonction asynchrone pratique comme ceci:
function appendAwaitLayout(parent, element) {
return new Promise((resolve, reject) => {
const resizeObserver = new ResizeObserver((entries) => {
resizeObserver.disconnect();
resolve(entries);
});
resizeObserver.observe(element);
parent.append(element);
});
}
// appelez-le de cette manière
appendAwaitLayout(document.body, document.createElement("div")).then((entries) => {
console.log(entries)
// faire des choses ici ...
});