konum: sabit iPad ve iPhone'da çalışmıyor


132

Bir süredir iPad'de sabit konumlandırma ile mücadele ediyorum. İScroll'u biliyorum ve her zaman işe yaramıyor gibi görünüyor (demolarında bile). Ayrıca Sencha'nın bunun için bir düzeltmesi olduğunu da biliyorum, ancak bu düzeltmenin kaynak kodunu Ctrl+ yapamadım F.

Birisinin çözüme sahip olmasını umuyorum. Sorun, sabit konumlandırılmış öğelerin, kullanıcı iOS destekli bir mobil Safari'de aşağı / yukarı kaydırdığında güncellenmemesidir.


2
Görünüşe göre jQuery Mobile 1.1 bu sorunu çözdü: jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0
Tower


Birkaç SO sorusunun olası kopyası. Ayrıntılar için gist.github.com/avesus/… bakın.
Brian Haak

Yanıtlar:


66

Birçok mobil tarayıcı kasıtlı olarak desteklemiyor position:fixed; , sabit öğelerin küçük bir ekranda engel olabileceği gerekçesiyle .

Quirksmode.org sitesinde sorunu açıklayan çok iyi bir blog yazısı var: http://www.quirksmode.org/blog/archives/2010/12/the_fifth_posit.html

Ayrıca, hangi mobil tarayıcıların desteklediğini gösteren bir uyumluluk tablosu için bu sayfaya bakın position:fixed;: http://www.quirksmode.org/m/css.html

(ancak mobil tarayıcı dünyasının çok hızlı hareket ettiğini, dolayısıyla bunun gibi tabloların uzun süre güncel kalmayabileceğini unutmayın!)

Güncelleme: iOS 5 ve Android 4'ün her ikisinin de konum: sabit desteğe sahip olduğu bildirildi.

Bugün iOS 5'i bir Apple mağazasında kendim test ettim ve sabit konumla çalıştığını doğrulayabilirim. Yine de sabit bir öğeyi yakınlaştırma ve kaydırma ile ilgili sorunlar var.

Bu uyumluluk tablosunu ilginç moddan çok daha güncel ve yararlı buldum: http://caniuse.com/#search=fixed

Android, Opera (mini ve mobil) ve iOS hakkında güncel bilgilere sahiptir.


position:device-fixedbiraz gereksiz olurdu. position:fixedsadece W3C spesifikasyonlarına uygun olmalıdır.
Talvi Watia

@TalviWatia - device-fixedçözüm cevabımın bir parçası değildi. Bir öneri olarak değeri olabilir veya olmayabilir, ancak bağlantının nedeni, önerdiği çözümden ziyade sorunun açıklamasıydı. Her durumda, bu cevabın gönderilmesinden bu yana işler çok gelişti (söylediğim gibi) ve birçok yeni cihaz destekliyor fixed. Yine de olmayan eski cihazlarla uğraşmanız gerekir.
Spudley

54
Bu yüzden merak ediyorum, elinizdeki soruna tam olarak çözümünüz nedir? Muhtemelen yararlı olsa da sağladığınız bağlantılar, elinizdeki sorunu çözmez. Bıkkın olmamak gerekir, ancak insanlar burada SO'da aslında yanıtları olmayan yanıtlara olumlu oy verme eğilimindedir.
Talvi Watia

1
@TalviWatia: Cevabı yazdığım sırada sorunun gerçekten iyi bir çözümü yoktu. Verdiğim bağlantı, her şeyin neden olduğu gibi olduğunu açıklamak için bildiğim en iyi tartışmaydı , ki bu bir çözüm olmadığında sunabileceğim kadar iyiydi. Araya giren dönemde işler değişti, bu nedenle bağlantıdaki tartışma artık geçerli değil ve şimdi çözümler var, ama o zamanlar böyleydi.
Spudley

Aslında konum: sabit ölçek 1 için çalışır, ancak kullanıcı ipad'i yakınlaştırdığında düzgün çalışmaz. konum: sabit cihaz var mı? Safari iOS için geçerli bir css özelliği var mı?
ccsakuweb

37

Sabit konumlandırma, bilgisayarlarda olduğu gibi iOS'ta çalışmaz.

Bir büyüteç (görüntü alanı) altında bir kağıt yaprağınız (web sayfası) olduğunu hayal edin, büyüteci ve gözünüzü hareket ettirirseniz sayfanın farklı bir bölümünü görürsünüz. İOS böyle çalışır.

Şimdi üzerinde bir kelime bulunan şeffaf bir plastik levha var, bu plastik levha ne olursa olsun sabit kalıyor (konum: sabit elemanlar). Dolayısıyla, büyüteci hareket ettirdiğinizde sabit öğe görünür hareket .

Alternatif olarak, büyüteci hareket ettirmek yerine, kağıdı (web sayfasını) hareket ettirerek plastik tabakayı ve büyüteci sabit tutarsınız. Bu durumda, plastik levha üzerindeki kelime sabit kalıyor gibi görünecek ve içeriğin geri kalanı hareket ediyor gibi görünecektir (çünkü aslında öyle) Bu geleneksel bir masaüstü tarayıcısıdır.

Böylece iOS'ta görüntü alanı hareket eder, geleneksel bir tarayıcıda web sayfası hareket eder. Her iki durumda da sabit öğeler hala gerçekte kalır; iOS'ta sabit öğeler hareket ediyor gibi görünse de.


Bunu aşmanın yolu, bu makaledeki son birkaç paragrafı takip etmektir.

(temelde kaydırmayı tamamen devre dışı bırakın, içeriği ayrı bir kaydırılabilir bölmede bulundurun (bağlantılı makalenin üst kısmındaki mavi kutuya bakın) ve sabit öğe kesinlikle konumlandırılmış)


"position: fixed" artık iOS5'te beklediğiniz gibi çalışıyor.


Konumla ilgili bazı garip şeyler var: IOS'ta yakınlaştırdığınızda düzeltildi. Stackoverflow.com/questions/52085998/… sayfasına
Peter Hollingsworth

23

konum: sabit, dikey kaydırma için android / iphone üzerinde çalışır. Ancak meta etiketlerinizin tam olarak ayarlandığından emin olmanız gerekir. Örneğin

<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">

Ayrıca, aynı sayfanın 4.0 öncesi Android'de çalışmasını planlıyorsanız, en üst konumu da ayarlamanız gerekir, aksi takdirde bir nedenle küçük bir kenar boşluğu eklenir.


Bu aslında benim için çalıştı. Daha önce, konum: gizli bir giriş öğesinde sabitlendi (ekran dışı gezinmeye bakın) tarayıcının iphone ios 8.3'te çökmesine ancak tablette çökmesine neden oldu. İyi çalıştıktan sonra.
Stephen Smith

İPad iOS 10.3'te, Kare standda yatay olarak çalışmadı. Verilen yazar, bu yaklaşımın "telefonlar" için olduğunu söylüyor.
SushiGuy

2
Kullanıcının yakınlaştırmasını devre dışı bırakmak user-scalable=0, minimum-scale=1.0, maximum-scale=1.0, sayfayı birçok kullanıcı için daha az erişilebilir hale getirebilir. Cevabınıza bununla ilgili bir uyarı eklemeniz faydalı olacaktır
fayda var

22

şimdi elma bunu destekliyor

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

Bu tam olarak iPad'de background-size: coverve fixedsorunumu çözmek için
aradığım şeydi

Bu, iOS 7'de Mobil Safari'de çalışır. Not: Henüz bu sürüme yükseltmemiş kullanıcılar için çalışmayacaktır.
Neil Monroe

O zaman işte başka değişkenler de olmalı. IOS 6'da test ettim ve çalışmıyordu, sonra iOS 7'de ve oldu.
Neil Monroe

@NeilMonroe hmm belki. Eminim bunu iOS 6'da probsuz yaptım ama belki başka bir değişken kullandım. hatırlamıyorum
Uğur Özpınar

bu gerçekten yardımcı oldu, ancak overflowşu şekilde ayarlanmalıscroll

19

Safari'de bu sorunu yaşadım (iOS 10.3.3) - tarayıcı, touchend etkinliği tetiklenene kadar yeniden çizilmiyordu. Sabit öğeler görünmedi veya kesildi.

Benim için püf noktası, transform: translate3d (0,0,0); sabit konum elemanıma.

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

DÜZENLE - Artık dönüşümün neden sorunu çözdüğünü biliyorum: donanım hızlandırma. 3B dönüşümü eklemek, yumuşak bir geçiş için GPU hızlandırmayı tetikler. Donanım hızlandırma hakkında daha fazla bilgi için bu makaleyi inceleyin: http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css .


Bu aslında kaydırma sorunumu çözdü, kullanırken iOS cihazlarında zıplıyordu fixed, eklendi transformve bu düzeltildi.
vonUbisch

17

Sabit Altbilgi (jQuery ile burada):

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}

Umarım yardımcı olur.


7

Transform: --- ve position: fixed kullanarak aynı kutuda kaçının. Öğe yerinde kalacaktır: herhangi bir dönüşüm varsa statik.


6

Yeni jQuery Mobile v1.1'i kullandım: http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/

Artık pek çok popüler platformda gerçek sabit araç çubukları sağlayan ve diğer tarayıcılardaki statik araç çubuğu konumlandırmasına güvenli bir şekilde geri dönen sağlam bir yeniden yazma işlemimiz var.

Bu yaklaşım hakkında havalı parçası çünkü o, bütün platformlarda doğal olmayan kaydırma fizik empoze JS tabanlı çözümler aksine, bizim kaydırma% 100 yerli hissediyor olduğunu olduğunu . Bu, kaydırmanın her yerde doğru hissettirdiği ve dokunma, fare tekerleği ve klavye kullanıcı girdisiyle çalıştığı anlamına gelir. Bonus olarak, CSS tabanlı çözümümüz süper hafiftir ve uyumluluğu veya erişilebilirliği etkilemez.


Ayrıca oldukça zarif (ancak kesinlikle bir çözüm), iOS'ta jQuery veya JavaScript kullanmadan sabit nesnelere izin vermek için bu yöntemdir (yalnızca CSS kullanır). Oldukça evrensel olarak uygulanabilir. position:fixedKaydırma sayfanızın önünde "kayan" bir öğenin görünmesini istiyorsanız, sadece z-indexönde kalması için ona daha yüksek bir değer vermeniz gerekir .
Slink

bu kesinlikle soruyu cevaplamaz.
Gustavo Siqueira

1

jquery kullanarak bunu bulabilirim. düzgün kaydırmaz, ancak hile yapar. aşağı kaydırabilirsiniz ve sabit div üstte açılır.

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>

HTML

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

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>

Son olarak, ipod touch'ın yatay mı yoksa dikey modda mı görüntüleneceğini belirlemek istiyoruz.

<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

CSS özelliği {position:fixed;}(çoğunlukla) daha yeni iOS cihazlarda çalışıyor gibi görünse de, cihazın tuhaflık ve geri dönüşünün olması mümkündür.{position:relative;} ara sıra ve sebep veya sebep olmaksızın . Genellikle önbelleği temizlemek, bir şey olana ve tuhaflık tekrar olana kadar yardımcı olacaktır.

Özellikle, Apple'ın kendi Web İçeriğinizi iPad için Hazırlaması :

İPad'de Safari ve iPhone'da Safari'de yeniden boyutlandırılabilir pencereler yoktur. İPhone ve iPad'deki Safari'de, pencere boyutu ekran boyutuna (eksi Safari kullanıcı arayüzü kontrolleri) ayarlanmıştır ve kullanıcı tarafından değiştirilemez. Bir web sayfasında hareket etmek için, kullanıcı yakınlaştırmak veya uzaklaştırmak için iki kez dokunarak veya kıstırırken ya da sayfayı kaydırmak için dokunup sürükleyerek görüntü alanının yakınlaştırma düzeyini ve konumunu değiştirir. Bir kullanıcı, görüntü portunun yakınlaştırma seviyesini ve konumunu değiştirdikçe, bunu sabit boyutlu bir görüntülenebilir içerik alanı (yani pencere) içinde yapmaktadır. Bu, konumları görüntü alanına "sabit" olan web sayfası öğelerinin, ekran dışında görüntülenebilir içerik alanının dışına çıkabileceği anlamına gelir.

İronik olan, Android cihazlarda bu sorun görünmüyor. Ayrıca {position:absolute;}body etiketine atıfta bulunulduğunda ve herhangi bir sorun yaşamadığında kullanmak tamamen mümkündür .

Bu tuhaflığın temel nedenini buldum; HTML veya BODY etiketi ile birlikte kullanıldığında iyi oynamayan kaydırma olayıdır. Bazen olayı tetiklemeyi sevmez veya olayı almak için scroll swing olayı bitene kadar beklemeniz gerekir. Özellikle, görüntü alanı bu olayın sonunda yeniden çizilir ve sabit öğeler görüntü alanında başka bir yere yeniden konumlandırılabilir.

İşte yaptığım şey şu: ( görüntü alanını kullanmaktan kaçının ve DOM'a bağlı kalın! )

<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>

Temelde bu, BODY'nin görüntü alanı boyutunda olmasına ve kaydırılamaz olmasına neden olacaktır. İçeride yuvalanmış kaydırılabilir DIV, BODY'nin normalde yapacağı gibi kaydırılır (eksi salınım efekti, böylece kaydırma, dokunmatik uçta durur.) Sabit DIV, parazit olmadan sabit kalır.

Bir yan not z-indexolarak, sabit DIV'de yüksek bir değer, kaydırılabilir DIV'nin arkasında görünmesini sağlamak için önemlidir. Normalde, çapraz tarayıcı ve alternatif ekran çözünürlüğü uyumluluğu için pencere yeniden boyutlandırma ve kaydırma olayları eklerim.

Her şey başarısız olursa, yukarıdaki kod hem sabit hem de kaydırılabilir DIV'ler olarak ayarlandığında da çalışacaktır {position:absolute;}.


1

Bu sorunu çözmenin basit yolu, öğeniz için dönüştürme özelliğini yazmaktır. ve düzeltilecek. Mutlu Kodlama :-)

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

Ayrıca onun yolunu da deneyebilirsiniz, bu da iyi çalışıyor.

.classname{
      position: -webkit-sticky;
    }

0

Bu, tüm senaryolar için geçerli olmayabilir, ancak position: stickyaynı şeyin (aynı şeyin position: fixed) yalnızca eski iPhone'larda, kayan kapsayıcı gövde değil , başka bir şeyin içinde olduğu zaman çalıştığını gördüm .

Örnek sözde html:

body                         <- scrollbar
   relative div
       sticky div

Yapışkan div, masaüstü tarayıcılarda yapışkan olacaktır, ancak şunlarla test edilen bazı cihazlarda: Chromium: dev araçları: aygıt emultasyonu: iPhone 6/7/8 ve Android 4 Firefox'ta sabit olmayacaktır.

Ancak ne işe yarayacak

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

0

Benim durumumda, bunun nedeni sabit öğenin bir animasyon kullanılarak gösterilmesiydi. Bu bağlantıda belirtildiği gibi :

Safari 9.1'de, animasyonlu bir öğenin içinde bir konum: sabit öğe olması, konum: sabit öğenin görünmemesine neden olabilir.


0

Iphone X'te de aynı sorun vardı. Düzeltmek için sadece konteynere yükseklik ekledim

height: 200px;
position: fixed;

-2

işte buna çözümüm ...

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>

Açıklama, div için sabitlenen konumun div'i her zaman arka planda tutacağı, ardından div'i tarayıcının tüm köşelerine (gövde marjı = 0 olması koşuluyla) (left, right, top, bottom) kullanarak uzatacağımızdır. ) eşzamanlı.

Lütfen genişlik ve yüksekliği kullanmadığınızdan emin olun, çünkü bu üst, sol, sağ, alt seçenekleri geçersiz kılar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.