170 votes

La position fixe ne fonctionne pas lorsque l'on utilise -webkit-transform

J'utilise -webkit-transform (et -moz-transform / -o-transform) pour faire pivoter une div. J'ai également ajouté une position fixe pour que le div défile vers le bas avec l'utilisateur.

Dans Firefox, cela fonctionne bien, mais dans les navigateurs basés sur webkit, c'est cassé. Après avoir utilisé -webkit-transform, la position fixe ne fonctionne plus ! Comment est-ce possible ?

4 votes

Une page de démonstration aide souvent les gens à répondre aux questions - jsbin.com vous permet de créer des pages temporaires pour illustrer le problème si vous ne voulez pas créer de lien vers votre site.

0 votes

Jsfiddle.net est un autre bon exemple de poubelle d'édition temporaire.

0 votes

@Rich Bradshaw jsbin.com est très bien. Je ne le connaissais pas jusqu'à présent. La plupart de mes projets sont exécutés localement, je l'utiliserai donc la prochaine fois. Tnx

95voto

Kyle Sevenoaks Points 29929

Après quelques recherches, il y a eu une rapport de bogue sur le Chrome à ce sujet, les navigateurs Webkit ne peuvent pas rendre ces deux effets en même temps.

Je suggérerais d'ajouter du CSS Webkit uniquement dans votre feuille de style et de faire de la div transformée une image et de l'utiliser comme arrière-plan.

@media screen and (-webkit-min-device-pixel-ratio:0) {
  /* Webkit-specific CSS here (Chrome and Safari) */

  #transformed_div {
    /* styles here, background image etc */
  }
}

Pour l'instant, vous devrez donc procéder à l'ancienne, jusqu'à ce que les navigateurs Webkit rattrapent FF.

EDIT : En date du 24/10/2012, le bug n'a pas été résolu.


Il semble qu'il ne s'agisse pas d'un bogue, mais d'un aspect de la spécification dû au fait que les deux effets nécessitent des systèmes de coordonnées et des ordres d'empilement distincts. Comme expliqué dans cette réponse .

0 votes

@Kyle Sevenoaks Merci pour votre réponse. Cela nous aide beaucoup :).

0 votes

Juste pour que vous le sachiez. J'ai décidé de supprimer le bouton dans les navigateurs basés sur webkit :). Le client ne l'utilise pas de toute façon. Jusqu'à ce que les navigateurs basés sur webkit rattrapent ff, je ne le supporte pas. Ce n'est pas la meilleure solution, mais pour l'instant la plus rapide...

0 votes

C'est logique, si les clients ne l'utilisent même pas, à quoi bon l'intégrer ? J'espère que Webkit rattrapera son retard, et que les autres navigateurs rattraperont les transitions de Webkit !

9voto

yckart Points 7517

Une méthode (un peu bricolée) qui a fonctionné pour moi est la suivante position:sticky au lieu de cela :

.fixed {
     position: sticky;
}

5 votes

updates.html5rocks.com/2012/08/ Ah oui mais il semble que le système ne soit pas encore bien soutenu.

1 votes

Le collant est différent. Le problème principal est qu'avec fixed nous voulons ignorer la position du conteneur (très utile pour les animations d'opacité par exemple). Horrible.

7voto

Jayden Lawson Points 419

Pour tous ceux qui constatent que leurs images d'arrière-plan disparaissent dans Chrome à cause du même problème avec background-attachment : fixed ; - voici la solution que j'ai trouvée :

// run js if Chrome is being used
if(navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
    // set background-attachment back to the default of 'scroll'
    $('.imagebg').css('background-attachment', 'scroll');

    // move the background-position according to the div's y position
    $(window).scroll(function(){

        scrollTop = $(window).scrollTop();
        photoTop = $('.imagebg').offset().top;
        distance = (photoTop - scrollTop);
        $('.imagebg').css('background-position', 'center ' + (distance*-1) + 'px');

    });
}

3voto

Ivica Points 151

En fait, j'ai trouvé un autre moyen de corriger ce "bug" :

J'ai un élément conteneur qui contient une page avec des animations css3. Lorsque la page a terminé l'animation, la propriété css3 a pour valeur : transform : translate(0,0) ;. J'ai donc supprimé cette ligne, et tout a fonctionné comme prévu - position : fixed s'affiche correctement. Lorsque la classe css est appliquée pour traduire la page, la propriété translate est ajoutée et l'animation css3 fonctionne également.

Exemple :

.page {
     top: 50px;
     position: absolute;
     transition: ease 0.6s all;
     /* -webkit-transform: translate(0, 0); */
     /* transform: translate(0,0); */
 }
 .page.hide {
     -webkit-transform: translate(100%, 0);
     transform: translate(-100%, 0);    
 }

Démonstration : http://jsfiddle.net/ZWcD9/

1 votes

Pour moi, c'est le fait d'avoir ces styles sur le wrapper contenant l'élément fixe qui empêchait l'élément fixe d'être collant : -webkit-perspective : 1000 ; -webkit-transform-style : preserve-3d ; Je les ai enlevés et tout fonctionne bien. Il s'agissait de toute façon d'optimisations discutables !

0 votes

La suppression de la transformation, par quelque moyen que ce soit, est probablement la meilleure solution à ce jour. Quelque chose comme un fondu, une fois terminé, devrait pouvoir être supprimé sans affecter l'apparence de l'élément. En fait, je ne suis pas sûr que le fait d'avoir une transformX(0) qui traîne dans les parages ait un effet sur les performances de rendu, si tant est qu'il y en ait un ; cela pourrait être ignoré, ou pourrait nuire aux performances, ou pourrait les améliorer en forçant une sorte d'accélération 3D. Qui sait ? Quoi qu'il en soit, une fois qu'une animation est terminée, ou même juste avant qu'un élément fixe ne lui soit ajouté, on peut simplement supprimer les classes CSS pour la transformation.

0voto

Ron Points 3535

Ajouter le -webkit-transform à l'élément fixe a résolu le problème pour moi.

.fixed_element {
   -webkit-transform: translateZ(0);
   position: fixed;
   ....
}

22 votes

Cela n'a pas fonctionné pour moi. Êtes-vous en mesure de créer une démonstration de son fonctionnement ?

0 votes

J'ai posté cette solution car toutes les autres n'ont pas fonctionné pour moi. Mais dans mon cas, c'était spécifique à Safari, même Chrome n'avait pas besoin de ce correctif. Peut-être essayez d'expérimenter un peu avec l'option transform ... ?

4 votes

Cela a résolu un problème pour moi dans Chrome, FWIW. Merci Ron.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X