Le posizioni fisse non funzionano quando si utilizza -webkit-transform


155

Sto usando -webkit-transform (e -moz-transform / -o-transform) per ruotare un div. Hanno anche aggiunto la posizione fissa in modo che il div scruti verso il basso con l'utente.

In Firefox funziona bene, ma nei browser basati su webkit è rotto. Dopo aver usato la trasformazione -webkit, la posizione fissa non funziona più! Come è possibile?


4
Una pagina demo spesso aiuta le persone a rispondere alle domande: jsbin.com ti consente di creare pagine temporanee per illustrare il problema se non desideri collegarti al tuo sito.
Rich Bradshaw,

jsfiddle.net è un altro buon esempio di un cestino di modifica temporaneo.
Kyle,

@Rich Bradshaw jsbin.com è molto carino. Fino ad ora non lo sapevo. La maggior parte dei miei progetti corro in locale, quindi la userò la prossima volta. TNX
iSenne

7
Non funziona affatto bene in Firefox.
vsync,

3
Ancora un problema nel 2017. Sembra che stiano ancora aderendo alla "È una caratteristica non un bug!" argomento ...
Max

Risposte:


87

Dopo alcune ricerche, sul sito Web Chromium è stato segnalato un bug su questo problema, finora i browser Webkit non sono in grado di eseguire il rendering di questi due effetti contemporaneamente.

Suggerirei di aggiungere solo alcuni CSS di Webkit nel tuo foglio di stile e rendere l'immagine div trasformata un'immagine e usarla come sfondo.

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

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

Quindi per ora dovrai farlo alla vecchia maniera, fino a quando i browser Webkit non raggiungeranno FF.

EDIT: dal 24/10/2012 il bug non è stato risolto.


Questo sembra non essere un bug, ma un aspetto della specifica a causa dei due effetti che richiedono sistemi di coordinate separati e ordini di sovrapposizione. Come spiegato in questa risposta .


34
Ancora più anni dopo, ancora non risolto. Abbastanza triste.
Amalgovinus,

9
Secondo questa risposta non è un bug ma parte delle specifiche.
Michael Rushton,

15
rilassati e guarda - Scommetto che vivrà fino al suo anniversario di 10 anni
lzl124631x

29
30 agosto 2017, diario di bordo. Abbiamo anche riscontrato la strana anomalia, descritta tanto tempo fa da altri capitani. Una soluzione deve ancora essere implementata.
Luoruize,

14
Questo è il bug di cui il padre di mio padre mi ha avvertito.
danjones_mcr

96

Le specifiche Transforms CSS spiegano questo comportamento. Gli elementi con trasformazioni fungono da blocco di contenimento per i discendenti di posizione fissa, quindi posizione: riparato sotto qualcosa con una trasformazione non ha più un comportamento fisso.

Funzionano quando applicati allo stesso elemento; l'elemento verrà posizionato come fisso e quindi trasformato.


9
Questa è l'unica risposta utile e corretta. Smetti di tradurre l'elemento genitore e traduci i figli in cui l'elemento fisso fa parte di esso. Ecco il mio violino: JSFIDDLE
Falk

2
e se volessi trasformare anche un elemento fisso?
Marc,

7

Per chiunque trovi che le proprie immagini di sfondo stanno scomparendo in Chrome a causa dello stesso problema con lo sfondo allegato: risolto; - questa era la mia soluzione:

// 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');

    });
}  

6

Qualcosa (un po 'confuso) che ha funzionato per me è position:stickyinvece:

.fixed {
     position: sticky;
}

5
updates.html5rocks.com/2012/08/… ah sì .. ma non ben supportato ma sembra
coiso

1
appiccicoso è diverso. Il problema principale è che con fixed vogliamo ignorare la posizione del contenitore (molto utile. Per animazioni di opacità, ad es.) Non riesco a credere che questo bug sia ancora presente anni dopo. Orribile.
FlorianB,

6

Agosto 2016 e posizione fissa e animazione / trasformazione sono ancora un problema. L'unica soluzione che ha funzionato per me è stata quella di creare un'animazione per l'elemento figlio che richiede più tempo.


Si prega di rispondere a nuove domande. Queste domande hanno bisogno di te più che della persona che ha posto la domanda nel 2010. Ormai devono aver risolto il problema, non credi? Anche questa domanda ha già una risposta accettata.
Umair Farooq,

5
No! È ancora un problema ... la persona che ha posto la domanda potrebbe aver trovato un'altra soluzione, ma ho trovato questa discussione per un motivo.
defligra,

Come vuoi. Ho lasciato quel commento mentre esaminavo le prime domande delle persone. E dal momento che ti sei iscritto proprio oggi ed è stata la tua prima risposta e anche una risposta in ritardo, ecco perché ho lasciato quel commento. Non ho votato a fondo. Questa è una buona possibilità per te.
Umair Farooq,

1
@UmairFarooq forse porre un'altra domanda sarebbe inutile perché potrebbe essere contrassegnato come duplicato. Sono venuto qui solo con una ricerca su Google e ho trovato utile questa domanda, anche la risposta defligra .
koMah,

3

In realtà ho trovato un altro modo per correggere questo "bug":

Ho un elemento contenitore che contiene la pagina con animazioni css3. Quando la pagina ha completato l'animazione, la proprietà css3 ha valore: transform: translate (0,0) ;. Quindi, ho appena rimosso questa riga e tutto ha funzionato come dovrebbe - position: fixed è visualizzato correttamente. Quando viene applicata la classe css per tradurre la pagina, viene aggiunta la proprietà translate e anche l'animazione css3 funziona.

Esempio:

.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);    
 }

Demo: http://jsfiddle.net/ZWcD9/


1
Per me, è stato il fatto di avere questi stili sul wrapper contenente l'elemento fisso che impediva a quello fisso di essere appiccicoso: -webkit-prospettiva: 1000; -webkit-transform-style: preserv-3d; Li tolse e tutto funzionava bene. Erano comunque discutibili ottimizzazioni!
Amalgovinus

Rimuovere la trasformazione, in ogni caso, è probabilmente la soluzione alternativa migliore finora. Qualcosa di simile a una dissolvenza, una volta completato, dovrebbe essere rimovibile senza influire sull'aspetto dell'elemento. In realtà, non sono sicuro di cosa farebbe un trasformX (0) in giro per il rendering delle prestazioni, se non del tutto; potrebbe essere ignorato o compromettere le prestazioni o migliorarlo forzando un qualche tipo di accelerazione 3D. Chissà. In ogni caso, una volta completata un'animazione o anche appena prima che un elemento fisso venga aggiunto ad essa, è possibile semplicemente rimuovere le classi CSS per la trasformazione.
Triynko,

1

sul mio progetto phonegap il webkit transform -webkit-transform: translateZ (0); ha funzionato come un fascino. Funzionava già in Chrome e Safari, ma non nel browser per dispositivi mobili. inoltre può esserci un altro problema: i DIV WRAPPER non sono completati in alcuni casi. applichiamo la classe chiara in caso di DIV mobili.

<div class="Clear"></div> .Clear, .Clearfix{clear:both;}

1

Probabilmente a causa di un bug in Chrome poiché non riesco a replicare in Safari o Firefox, ma funziona in Chrome 40.0.2214.111 http://jsbin.com/hacame/1/edit?html,css,output

È una struttura molto particolare, quindi non è affatto una correzione CSS unilinea universalmente applicabile, ma forse qualcuno può armeggiare con essa per farlo funzionare in Safari e Firefox.


1

Ho riscontrato questo problema durante il tentativo di implementare la reattanza-colore con viste reattive-scorrevoli (rsw). Il problema per me era che rsw si applica translate(-100%, 0)a un pannello a schede che interrompe il div predefinito di posizione fissa aggiunto su tutto lo schermo che quando si fa clic chiude il modello di selezione colore.

Per me la soluzione era applicare la trasformazione opposta all'elemento fisso (in questo caso translate(100%, 0)ciò ha risolto il mio problema. Non sono sicuro che ciò sia utile in altri casi, ma ho pensato di condividere comunque.

Ecco un esempio che mostra ciò che ho descritto sopra:

https://codepen.io/relativemc/pen/VwweEez


0

L'aggiunta -webkit-transformdell'elemento fisso ha risolto il problema per me.

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

20
Non ha funzionato per me. Sei in grado di crearne una demo funzionando?
alex

4
Ciò ha risolto un problema per me in Chrome, FWIW. Grazie Ron.
Chris,

3
Grazie, questo mi ha risolto un problema. Salvato la mia vita!
styke,

1
@Neil Monroe, Android 2.3 è una storia completamente nuova. Non supporta affatto il posizionamento fisso :)
Wiseman,

8
Ecco un violino in cui l'utilizzo translateZ(0) NON FUNZIONA . È vero che a volte funziona, ho visto occasioni in cui ha funzionato. Ma non riesco ancora a restringerlo.
Zequez,

0

Ecco cosa funziona per me su tutti i browser e dispositivi mobili testati (Chrome, IE, Firefox, Safari, iPad, iPhone 5 e 6, Android).

img.ui-li-thumb {
    position: absolute;
    left: 1px;
    top: 50%;

    -ms-transform: translateY(-50%);
    -webkit-transform: translateY(-50%);
    -moz-transform: translateY(-50%);
    -o-transform: translateY(-50%);
    transform: translateY(-50%);
}

2
Perché i downvotes? Sarebbe bello se fornissi un commento sul perché hai votato in giù la mia risposta?
Murf,

0

la posizione fissa di un elemento viene interrotta se si applica la trasformazione a qualsiasi antenato.

<div style='position:fixed;-.*-transform:scale(2)'>...</div> //ok

<div style='-.*-transform:scale(2)'>
      <div style='position:fixed'>...</div> // broken
</div>

0

Se puoi usare javascript come opzione, questa può essere una soluzione alternativa per posizionare un elemento fisso di posizione relativo alla finestra quando si trova all'interno di un elemento trasformato:

  let fixedEl // some node that you is position 
              // fixed inside of an element that has a transform

  const rect = fixedEl.getBoundingClientRect()
  const distanceFromWindowTop = rect.top
  const distanceFromWindwoLeft = rect.left
  let top = fixedEl.offsetTop
  let left = fixedEl.offsetLeft

  if(distanceFromWindowTop !== relativeTop) {
    top = -distanceFromWindowTop
    fixedEl.style.top = `${top}px`
  }

  if(distanceFromWindowLeft !== relativeLeft) {
    left = -distanceFromWindowLeft
    fixedEl.style.left = `${left}px`
  }

Concesso dovrai anche regolare le tue altezze e larghezza perché fixedElcalcolerà la sua base sulla base del suo contenitore. Dipende dal caso d'uso, ma ciò ti consentirà di impostare in modo prevedibile la posizione fissa, indipendentemente dal contenitore.


0

Aggiungi una classe dinamica mentre l'elemento si trasforma. $('#elementId').addClass('transformed'). Quindi continua a dichiarare in css,

.translatX(@x) { 
     -webkit-transform: translateX(@X); 
             transform: translateX(@x);
      //All other subsidaries as -moz-transform, -o-transform and -ms-transform 
}

poi

#elementId { 
      -webkit-transform: none; 
              transform: none;
}

poi

.transformed {
    #elementId { 
        .translateX(@neededValue);
    }
}

Ora posizione: risolto quando fornito con valori di proprietà top e z-index su un elemento figlio funziona bene e rimane fisso fino a quando l'elemento genitore si trasforma. Quando la trasformazione viene ripristinata, l'elemento figlio viene nuovamente visualizzato come risolto. Ciò dovrebbe alleviare la situazione se in realtà stai usando una barra laterale di navigazione che si apre e si chiude con un clic, e hai un set di schede che dovrebbe rimanere appiccicoso mentre scorri la pagina.


0

nel mio caso ho scoperto che non possiamo usare transform: translateX () prima di transform: translateY (). se vogliamo usare entrambi dovremmo usare transform: translate (,).


-1

Per favore, non votate, perché questa non è una risposta esatta, ma potrebbe aiutare qualcuno perché è un modo veloce per disattivare la trasformazione. Se davvero non hai bisogno della trasformazione sul genitore e vuoi che la tua posizione fissa funzioni di nuovo:

#element_with_transform {
  -webkit-transform: none;
  transform: none;
}

1
Questo è, davvero, nel titolo della domanda
Eugene Pankov,

@EugenePankov Non vedo "nessuno" nel titolo. È stato ciò che ha risolto il mio problema e in generale nessuno suggerisce di spegnerlo. Sebbene questa non sia la risposta esatta a quella domanda, potrebbe aiutare qualcuno che non vuole usare la trasformazione e la trasformazione proviene da un'altra libreria. Quindi non voglio voti positivi, ma per favore non votare in basso. Modificherò la mia domanda per dire che non voglio il voto Up.
Makkasi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.