Visez juste ! Position dans WebKit

Eric Bidelman

position: sticky est une nouvelle façon de positionner des éléments. Son concept est semblable à position: fixed. La différence réside dans le fait qu'un élément avec position: sticky se comporte comme position: relative dans son parent, jusqu'à ce qu'un seuil de décalage donné soit atteint dans la fenêtre d'affichage.

Cas d'utilisation

Reformulation de la proposition initiale d'Edward O'Connor concernant cette fonctionnalité:

Présentation du positionnement persistant

Démo persistante

LANCER LA DÉMO

En ajoutant simplement position: sticky (préfixé par le fournisseur), nous pouvons indiquer qu'un élément est position: relative jusqu'à ce que l'utilisateur fasse défiler l'élément (ou son parent) pour qu'il soit à 15 pixels du haut:

.sticky {
    position: -webkit-sticky;
    position: -moz-sticky;
    position: -ms-sticky;
    position: -o-sticky;
    top: 15px;
}

À top: 15px, l'élément est fixe.

Pour illustrer cette fonctionnalité dans un contexte pratique, j'ai créé une DÉMO qui affiche les titres des blogs lorsque vous faites défiler la page.

Ancienne approche: événements de défilement

Jusqu'à présent, pour obtenir l'effet persistant, les sites configuraient des écouteurs d'événements scroll en JavaScript. Nous utilisons également cette technique dans les tutoriels html5rocks. Sur les écrans de moins de 1 200 pixels, la barre latérale de table des matières passe à position: fixed après un certain temps de défilement.

Voici l'ancienne méthode, qui permet de conserver un en-tête en haut de la fenêtre d'affichage lorsque l'utilisateur fait défiler la page vers le bas, et de revenir en place lorsqu'il fait défiler la page vers le haut:

<div class="header"></div>

<script>
var header = document.querySelector('.header');
var origOffsetY = header.offsetTop;

function onScroll(e) {
    window.scrollY >= origOffsetY ? header.classList.add('sticky') :
                                    header.classList.remove('sticky');
}

document.addEventListener('scroll', onScroll);
</script>

Essayer: http://output.jsbin.com/omanut/2/

C'est assez facile, mais ce modèle se décompose rapidement si vous souhaitez effectuer cette opération pour un ensemble de nœuds DOM, par exemple, chaque titre <h1> d'un blog lorsque l'utilisateur fait défiler la page.

Pourquoi JavaScript n'est pas idéal

En général, les gestionnaires de défilement ne sont jamais une bonne idée. Les utilisateurs populaires ont tendance à effectuer trop de travail et se demandent pourquoi leur interface utilisateur est saccadée.

Notez également que de plus en plus de navigateurs implémentent le défilement accéléré par le matériel pour améliorer les performances. Le problème est que lorsque les gestionnaires de défilement JS sont en cours d'exécution, les navigateurs peuvent revenir à un mode (logiciel) plus lent. Désormais, l'exécution n'est plus exécutée sur le GPU. Au lieu de cela, nous sommes de retour sur le CPU. Le résultat ? L'utilisateur perçoit plus d'à-coups lorsqu'il fait défiler la page.

Il est donc très logique qu'une telle caractéristique soit déclarative en CSS.

Assistance

Malheureusement, il n'y a pas de spécification pour celui-ci. Il a été proposé sur le type "www" en juin et vient d'être intégré dans WebKit. Cela signifie qu'il n'y a pas de bonne documentation à laquelle faire référence. Notez toutefois que, selon ce bug, si left et right sont tous les deux spécifiés, left l'emporte. De même, si top et bottom sont utilisés en même temps, top gagne.

Chrome 23.0.1247.0+ (version actuelle de Canary) et WebKit sont actuellement compatibles tous les soirs.