posizione: riparato non funziona su iPad e iPhone


132

Ho avuto problemi con il posizionamento fisso su iPad per un po '. Conosco iScroll e non sempre sembra funzionare (anche nella loro demo). So anche che Sencha ha una correzione per questo, ma non ho potuto Ctrl+ Fil codice sorgente per quella correzione.

Spero che qualcuno possa avere la soluzione. Il problema è che gli elementi posizionati fissi non vengono aggiornati quando l'utente esegue la panoramica verso il basso / verso l'alto su un Safari mobile con iOS.


2
Sembra che jQuery Mobile 1.1 abbia risolto questo problema: jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0
Torre


Possibile duplicato di diverse domande SO. Vedere gist.github.com/avesus/… per i dettagli.
Brian Haak,

Risposte:


66

Molti browser per dispositivi mobili non supportano deliberatamente position:fixed;il fatto che elementi fissi potrebbero interferire su un piccolo schermo.

Il sito Quirksmode.org ha un ottimo post sul blog che spiega il problema: http://www.quirksmode.org/blog/archives/2010/12/the_fifth_posit.html

Vedi anche questa pagina per un grafico di compatibilità che mostra quali browser mobili supportano position:fixed;: http://www.quirksmode.org/m/css.html

(ma nota che il mondo dei browser mobili si sta muovendo molto rapidamente, quindi tabelle come questa potrebbero non rimanere aggiornate a lungo!)

Aggiornamento: iOS 5 e Android 4 hanno entrambi una posizione: supporto fisso ora.

Oggi ho testato iOS 5 in un Apple Store e posso confermare che funziona con la posizione fissa. Tuttavia, ci sono problemi con lo zoom e la panoramica attorno a un elemento fisso.

Ho trovato questa tabella di compatibilità molto più aggiornata e utile di quella quirksmode: http://caniuse.com/#search=fixed

Ha informazioni aggiornate su Android, Opera (mini e mobile) e iOS.


position:device-fixedsarebbe ridondante. position:fixeddovrebbe funzionare solo secondo le specifiche del W3C.
Talvi Watia,

@TalviWatia - la device-fixedsoluzione non faceva parte della mia risposta. Potrebbe essere o meno merito come suggerimento, ma la ragione del collegamento era la spiegazione del problema piuttosto che la sua soluzione suggerita. In ogni caso, le cose sono cambiate molto da quando questa risposta è stata pubblicata (come ho detto che avrebbe fatto) e molti nuovi dispositivi supportano fixed. Tuttavia, devi comunque gestire i dispositivi meno recenti.
Spudley,

54
Quindi sono curioso, qual è esattamente la tua soluzione al problema attuale? I collegamenti forniti, se possibile, utili non risolvono il problema a portata di mano. Non essere stanco, ma la gente tende a votare risposte che in realtà non sono risposte qui su SO.
Talvi Watia,

1
@TalviWatia: Al momento in cui ho scritto la risposta, non c'era davvero una buona soluzione alla domanda. Il link che ho dato è stata la migliore discussione di cui sono a conoscenza per spiegare perché le cose fossero come erano, cosa che in assenza di una soluzione era la migliore che potessi offrire. Le cose sono cambiate nel periodo intermedio, quindi la discussione nel link non è più pertinente, e ci sono soluzioni ora, ma è così che era in quel momento.
Spudley,

In realtà posizione: risolto funziona per la scala 1 ma quando l'utente ingrandisce l'ipad non funzionerà bene. posizione: dispositivo fisso esiste ?? L'attributo CSS valido per Safari iOS?
ccsakuweb,

37

Il posizionamento fisso non funziona su iOS come sui computer.

Immagina di avere un foglio di carta (la pagina web) sotto una lente d'ingrandimento (il viewport), se sposti la lente d'ingrandimento e l'occhio, vedi una parte diversa della pagina. Ecco come funziona iOS.

Ora c'è un foglio di plastica trasparente con una parola su di esso, questo foglio di plastica rimane fermo qualunque cosa (la posizione: elementi fissi). Quindi, quando si sposta la lente d'ingrandimento, l'elemento fisso sembra muoversi.

In alternativa, invece di spostare la lente d'ingrandimento, si sposta la carta (la pagina Web), mantenendo fermo il foglio di plastica e la lente d'ingrandimento. In questo caso la parola sul foglio di plastica sembrerà rimanere fissa, e il resto del contenuto sembrerà spostarsi (perché in realtà lo è) Questo è un browser desktop tradizionale.

Quindi in iOS la finestra si sposta, in un browser tradizionale la pagina web si sposta. In entrambi i casi gli elementi fissi rimangono fermi nella realtà; anche se su iOS gli elementi fissi sembrano muoversi.


Il modo per aggirare questo è seguire gli ultimi paragrafi in questo articolo

(fondamentalmente disabilitare lo scorrimento del tutto, avere il contenuto in un div scorrevole separato (vedere la casella blu nella parte superiore dell'articolo collegato) e l'elemento fisso posizionato in modo assoluto)


"position: fixed" ora funziona come ci si aspetterebbe in iOS5.


Ci sono alcune cose strane che accadono con la posizione: risolto quando si ingrandisce IOS. Vedi stackoverflow.com/questions/52085998/…
Peter Hollingsworth il

23

posizione: risolto funziona su Android / iPhone per lo scorrimento verticale. Ma devi assicurarti che i tuoi meta tag siano completamente impostati. per esempio

<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">

Inoltre, se stai pianificando di far funzionare la stessa pagina su Android pre 4.0, devi anche impostare la prima posizione, o per qualche motivo verrà aggiunto un piccolo margine.


Questo ha funzionato davvero per me. Prima, posizione: riparato su un elemento di input nascosto (vedi pure css fuori dallo schermo di navigazione) causava il crash del browser su iPhone iOS 8.3 ma non su tablet. Dopo che funziona bene.
Stephen Smith,

Non ha funzionato su iPad iOS 10.3, orizzontale nel supporto quadrato. L'autore concesso afferma che questo approccio è per "telefoni".
SushiGuy

2
Disabilitare l'utente con lo zoom user-scalable=0, minimum-scale=1.0, maximum-scale=1.0può rendere la pagina meno accessibile a molti utenti. Sarebbe utile aggiungere un avviso al riguardo nella tua risposta
neiya

22

ora Apple lo supporta

overflow:hidden;
-webkit-overflow-scrolling:touch;

Questo è esattamente quello che cercavo di risolvere il mio background-size: covere fixedproblema sul iPad
andyb

Funziona su Mobile Safari in iOS 7. Nota: non funzionerà per gli utenti che non hanno ancora effettuato l'aggiornamento a questa versione.
Neil Monroe,

Quindi ci devono essere alcune altre variabili al lavoro. Ho testato su iOS 6 e non funzionava, quindi su iOS 7 e lo era.
Neil Monroe,

@NeilMonroe hmm forse. sono sicuro di averlo fatto su iOS 6 senza prob ma forse ho usato un'altra variabile. non ricordo
Uğur Özpınar,

questo è stato davvero utile, ma a quanto pare, overflowdeve essere impostato suscroll

19

Ho riscontrato questo problema su Safari (iOS 10.3.3): il browser non si ridisegnava fino a quando l'evento touchend non veniva attivato. Gli elementi fissi non apparivano o venivano tagliati.

Il trucco per me era l'aggiunta di transform: translate3d (0,0,0); al mio elemento di posizione fissa.

.fixed-position-on-mobile {
  position: fixed;
  transform: translate3d(0,0,0);
}

EDIT - Ora so perché la trasformazione risolve il problema: accelerazione hardware. L'aggiunta della trasformazione 3D innesca l'accelerazione GPU per una transizione graduale. Per ulteriori informazioni sull'accelerazione hardware, consulta questo articolo: http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css .


Questo effettivamente risolto il mio problema di scorrimento, rimbalzava sui dispositivi iOS durante l'utilizzo fixed, ha aggiunto transforme questo è stato risolto.
vonUbisch,

17

Footer fisso (qui con jQuery):

if (navigator.platform == 'iPad' || navigator.platform == 'iPhone' || navigator.platform == 'iPod' || navigator.platform == 'Linux armv6l') 
{
    window.ontouchstart = function () 
    {
        $("#fixedDiv").css("display", "none");
    }

    window.onscroll = function() 
    { 
        var iPadPosition = window.innerHeight + window.pageYOffset-45; // 45 is the height of the Footer
         $("#fixedDiv").css("position", "absolute");
         $("#fixedDiv").css("top", iPadPosition);
         $("#fixedDiv").css("display", "block");
    }
}

// in the CSS file should stand:
#fixedDiv {position: fixed; bottom: 0; height: 45px;  whatever else}

Spero che sia d'aiuto.


7

Evitare sulla stessa scatola usando transform: --- e position: fixed. L'elemento rimarrà in posizione: statico se c'è qualche trasformazione.


6

Ho finito per usare il nuovo jQuery Mobile v1.1: http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/

Ora abbiamo una solida riscrittura che fornisce barre degli strumenti fisse reali su molte piattaforme popolari e ricade in sicurezza sul posizionamento statico della barra degli strumenti in altri browser.

La parte più interessante di questo approccio è che, a differenza delle soluzioni basate su JS che impongono la fisica di scorrimento innaturale su tutte le piattaforme, il nostro scorrimento sembra nativo al 100% perché lo è . Ciò significa che lo scorrimento è perfetto ovunque e funziona con l'input dell'utente tramite tocco, rotellina del mouse e tastiera. Come bonus, la nostra soluzione basata su CSS è super leggera e non influisce sulla compatibilità o sull'accessibilità.


Anche abbastanza elegante (ma sicuramente una soluzione alternativa) è questo metodo per consentire oggetti fissi su iOS senza usare jQuery o JavaScript (usa solo CSS). È abbastanza universalmente applicabile. Se desideri che un position:fixedelemento "mobile" appaia davanti alla tua pagina a scorrimento, devi solo dargli un z-indexvalore più alto in modo che rimanga in primo piano.
Slink

questo sicuramente non risponde alla domanda.
Gustavo Siqueira,

1

usando jquery sono in grado di trovare questo. non scorre liscio, ma fa il trucco. puoi scorrere verso il basso e il div fisso si apre in alto.

IL CSS

<style type="text/css">
    .btn_cardDetailsPg {height:5px !important;margin-top:-20px;}
    html, body {overflow-x:hidden;overflow-y:auto;}
    #lockDiv {
  background-color: #fff;
  color: #000;
  float:left;
  -moz-box-shadow: 0px 4px 2px 2px #ccc;-webkit-box-shadow: 0px 4px 2px 2px #ccc;box-shadow:0px 4px 2px 2px #ccc;
  }
#lockDiv.stick {
  position: fixed;
  top: 0;
  z-index: 10000;
  margin-left:0px;
  }
</style>

L'HTML

<div id="lockSticky"></div>
<div id="lockDiv">fooo</div>

IL JQUERY

<script type="text/javascript">
    function sticky_relocate() {
        var window_top = $(window).scrollTop();
        var div_top = $('#lockSticky').offset().top;
        if (window_top > div_top)
            $('#lockDiv').addClass('stick')
        else
            $('#lockDiv').removeClass('stick');
    }
    $(function() {
        $(window).scroll(sticky_relocate);
        sticky_relocate();
    });
</script>

Infine, vogliamo determinare se l'iPod touch in modalità orizzontale o verticale deve essere visualizzato di conseguenza

<script type="text/javascript">
    if (navigator.userAgent.match(/like Mac OS X/i)) {
        window.onscroll = function() {

        if (window.innerWidth > window.innerHeight) {
            //alert("landscape [ ]");
            document.getElementById('lockDiv').style.top =
            (window.pageYOffset + window.innerHeight - 268) + 'px';
        }

        if (window.innerHeight > window.innerWidth) {
            //alert("portrait ||");
            document.getElementById('lockDiv').style.top =
            (window.pageYOffset + window.innerHeight - 418) + 'px';
        }
        };
    }
</script>

1

Anche se l'attributo CSS {position:fixed;}sembra (principalmente) funzionare su dispositivi iOS più recenti, è possibile avere il dispositivo stravagante e fallback {position:relative;}in occasione e senza causa o motivo. Solitamente svuotare la cache aiuterà, fino a quando non succede qualcosa e la stranezza si ripete.

In particolare, dalla stessa Apple Preparazione dei contenuti Web per iPad :

Safari su iPad e Safari su iPhone non hanno finestre ridimensionabili. In Safari su iPhone e iPad, la dimensione della finestra è impostata sulla dimensione dello schermo (meno i controlli dell'interfaccia utente di Safari) e non può essere modificata dall'utente. Per spostarsi all'interno di una pagina Web, l'utente modifica il livello di zoom e la posizione della finestra mentre tocca due volte o pizzica per ingrandire o ridurre, oppure toccando e trascinando per eseguire una panoramica della pagina. Quando un utente modifica il livello di zoom e la posizione della finestra, lo fa all'interno di un'area di contenuto visualizzabile di dimensioni fisse (ovvero la finestra). Ciò significa che gli elementi di una pagina Web che hanno la loro posizione "fissa" sul viewport possono finire fuori dall'area di contenuto visualizzabile, fuori dallo schermo.

Ciò che è ironico, i dispositivi Android non sembrano avere questo problema. Inoltre è del tutto possibile utilizzare {position:absolute;}quando si fa riferimento al tag body e non si verificano problemi.

Ho trovato la causa principale di questa stranezza; che l'evento scroll non funziona bene se usato insieme al tag HTML o BODY. A volte non gli piace lanciare l'evento, oppure dovrai aspettare fino a quando l'evento di swing scroll non è terminato per ricevere l'evento. In particolare, il viewport viene ridisegnato alla fine di questo evento e gli elementi fissi possono essere riposizionati in qualche altro punto del viewport.

Quindi questo è quello che faccio: ( evita di usare il viewport e mantieni il DOM! )

<html>
  <style>
    .fixed{
      position:fixed;
      /*you can set your other static attributes here too*/
      /*like height and width, margin, etc.*/
      }
    .scrollableDiv{
      position:relative;
      overflow-y:scroll;
      /*all children will scroll within this like the body normally would.*/
      } 
    .viewportSizedBody{
      position:relative;
      overflow:hidden;
      /*this will prevent the body page itself from scrolling.*/
      } 
  </style>
  <body class="viewportSizedBody">
    <div id="myFixedContainer" class="fixed">
       This part is fixed.
    </div>
    <div id="myScrollableBody" class="scrollableDiv">
       This part is scrollable.
    </div>
  </body>
  <script type="text/javascript" src="{your path to jquery}/jquery-1.7.2.min.js"></script>
  <script>
    var theViewportHeight=$(window).height();
    $('.viewportSizedBody').css('height',theViewportHeight);
    $('#myScrollableBody').css('height',theViewportHeight);
  </script>
</html>

In sostanza, ciò farà sì che il CORPO abbia le dimensioni della finestra e non sia scorrevole. Il DIV scorrevole annidato all'interno scorrerà come farebbe normalmente il CORPO (meno l'effetto di oscillazione, quindi lo scorrimento si interrompe al tocco). Il DIV fisso rimane fisso senza interferenze.

Come nota a margine, un z-indexvalore elevato sul DIV fisso è importante per mantenere il DIV scorrevole che appare dietro di esso. Di solito aggiungo il ridimensionamento della finestra e scorro gli eventi anche per la compatibilità tra browser e risoluzione dello schermo alternativa.

Se tutto il resto fallisce, il codice sopra funzionerà anche con i DIV fissi e scorrevoli impostati su {position:absolute;}.


1

Il modo semplice per risolvere questo problema digita solo la proprietà transform per il tuo elemento. e sarà risolto. Happy Coding :-)

.classname{
  position: fixed;
  transform: translate3d(0,0,0);
}

Inoltre puoi provare a modo suo e anche questo funziona bene.

.classname{
      position: -webkit-sticky;
    }

0

Questo potrebbe non essere applicabile a tutti gli scenari, ma ho scoperto che la position: sticky(stessa cosa con position: fixed) funziona solo sui vecchi iPhone quando il contenitore scorrevole non è il corpo, ma dentro qualcos'altro.

Esempio di pseudo html:

body                         <- scrollbar
   relative div
       sticky div

Il div appiccicoso sarà appiccicoso sui browser desktop, ma con alcuni dispositivi, testato con: Chromium: strumenti di sviluppo: emultazione del dispositivo: iPhone 6/7/8 e con Android 4 Firefox, non lo farà.

Ciò che funzionerà, tuttavia, è

body
    div overflow=auto       <- scrollbar
        relative div
            sticky div

0

Nel mio caso, è stato perché l'elemento fisso veniva mostrato usando un'animazione. Come indicato in questo link :

in Safari 9.1, con una posizione: elemento fisso all'interno di un elemento animato, la posizione: elemento fisso non viene visualizzata.


-2

ecco la mia soluzione a questo ...

CSS

#bgimg_top {
    background: url(images/bg.jpg) no-repeat 50% 0%; 
    position: fixed; 
    top:0; 
    left: 0; 
    right:0 ; 
    bottom:0;
}

HTML

<body>
<div id="bgimg_top"></div>
....
</body>

La spiegazione è che la posizione fissa per il div manterrà il div sullo sfondo in ogni momento, quindi allunghiamo il div per andare su tutti gli angoli del browser (a condizione che il margine del corpo = 0) usando il (sinistra, destra, in alto, in basso ) contemporaneamente.

Assicurati di non utilizzare la larghezza e l'altezza in quanto ciò sovrascriverà le opzioni in alto, a sinistra, a destra, in basso.

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.