vị trí: cố định không hoạt động trên iPad và iPhone


132

Tôi đã vật lộn với định vị cố định trong iPad trong một thời gian. Tôi biết iScroll và dường như không phải lúc nào nó cũng hoạt động (ngay cả trong bản demo của họ). Tôi cũng biết rằng Sencha có một bản sửa lỗi cho điều đó, nhưng tôi không thể Ctrl+ Fmã nguồn cho bản sửa lỗi đó.

Tôi hy vọng rằng ai đó có thể có giải pháp. Vấn đề là các yếu tố được định vị cố định không được cập nhật khi người dùng lướt xuống / lên trên Safari di động được hỗ trợ iOS.


2
Có vẻ như jQuery Mobile 1.1 đã giải quyết vấn đề này: jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0
Tower


Có thể trùng lặp một số câu hỏi SO. Xem gist.github.com/avesus/ trên để biết chi tiết.
Brian Haak

Câu trả lời:


66

Rất nhiều trình duyệt di động cố tình không hỗ trợ position:fixed;với lý do các yếu tố cố định có thể gây cản trở trên màn hình nhỏ.

Trang web Quirksmode.org có một bài đăng blog rất hay giải thích vấn đề: http://www.quirksmode.org/blog/archives/2010/12/the_fifth_poseit.html

Đồng thời xem trang này để biết biểu đồ tương thích cho biết trình duyệt di động nào hỗ trợ position:fixed;: http://www.quirksmode.org/m/css.html

(nhưng lưu ý rằng thế giới trình duyệt di động đang di chuyển rất nhanh, do đó, các bảng như thế này có thể không được cập nhật lâu!)

Cập nhật: iOS 5 và Android 4 đều được báo cáo là có vị trí: hỗ trợ cố định ngay bây giờ.

Tôi đã tự mình kiểm tra iOS 5 trong một cửa hàng Apple và có thể xác nhận rằng nó hoạt động với vị trí cố định. Có vấn đề với phóng to và xoay xung quanh một yếu tố cố định mặc dù.

Tôi thấy bảng tương thích này cập nhật hơn và hữu ích hơn bảng quirksmode: http://caniuse.com/#search=fixed

Nó có thông tin cập nhật trên Android, Opera (mini và di động) & iOS.


position:device-fixedsẽ là loại dư thừa. position:fixedchỉ nên làm việc với thông số kỹ thuật của W3C.
Talvi Watia

@TalviWatia - device-fixedgiải pháp không phải là một phần câu trả lời của tôi. Nó có thể có hoặc không có giá trị như một đề nghị, nhưng lý do cho liên kết là giải thích về vấn đề chứ không phải là giải pháp được đề xuất của ông. Trong mọi trường hợp, mọi thứ đã thay đổi rất nhiều kể từ khi câu trả lời này được đăng (như tôi đã nói), và rất nhiều thiết bị mới hơn hỗ trợ fixed. Tuy nhiên, bạn vẫn cần phải xử lý các thiết bị cũ hơn.
Spudley

54
Vì vậy, tôi tò mò, chính xác giải pháp của bạn cho vấn đề trong tay là gì? Các liên kết bạn cung cấp trong khi có thể hữu ích không giải quyết vấn đề trong tay. Không bị lu mờ, nhưng mọi người có xu hướng nâng cao các câu trả lời không thực sự là câu trả lời ở đây trên SO.
Talvi Watia

1
@TalviWatia: Tại thời điểm tôi viết câu trả lời, thực sự không có một giải pháp tốt cho câu hỏi. Liên kết tôi đưa ra là cuộc thảo luận tốt nhất mà tôi biết để giải thích lý do tại sao mọi thứ lại diễn ra như vậy, trong trường hợp không có giải pháp tốt như tôi có thể cung cấp. Mọi thứ đã thay đổi trong giai đoạn can thiệp, vì vậy cuộc thảo luận trong liên kết không còn phù hợp nữa và hiện tại đã có giải pháp, nhưng đó là cách nó diễn ra vào thời điểm đó.
Spudley

Thực tế vị trí: cố định hoạt động cho thang 1 nhưng khi người dùng phóng to ipad thì nó sẽ không hoạt động. vị trí: thiết bị cố định tồn tại ?? Là thuộc tính css hợp lệ cho safari ios?
ccsakuweb

37

Đã sửa lỗi định vị không hoạt động trên iOS giống như trên máy tính.

Hãy tưởng tượng bạn có một tờ giấy (trang web) dưới kính lúp (khung nhìn), nếu bạn di chuyển kính lúp và mắt, bạn sẽ thấy một phần khác của trang. Đây là cách iOS hoạt động.

Bây giờ có một tấm nhựa trong suốt với một từ trên đó, tấm nhựa này đứng yên bất kể điều gì (vị trí: các yếu tố cố định). Vì vậy, khi bạn di chuyển kính lúp, phần tử cố định dường như di chuyển.

Ngoài ra, thay vì di chuyển kính lúp, bạn di chuyển giấy (trang web), giữ cho tấm nhựa và kính lúp vẫn còn. Trong trường hợp này, từ trên tấm nhựa sẽ xuất hiện cố định và phần còn lại của nội dung sẽ xuất hiện để di chuyển (vì thực tế là vậy) Đây là một trình duyệt máy tính để bàn truyền thống.

Vì vậy, trong iOS, chế độ xem di chuyển, trong một trình duyệt truyền thống, trang web sẽ di chuyển. Trong cả hai trường hợp, các yếu tố cố định vẫn ở trong thực tế; mặc dù trên iOS các yếu tố cố định dường như di chuyển.


Cách để khắc phục điều này, là theo dõi một vài đoạn cuối trong bài viết này

(về cơ bản vô hiệu hóa cuộn hoàn toàn, có nội dung trong một div có thể cuộn riêng biệt (xem hộp màu xanh ở đầu bài viết được liên kết) và phần tử cố định được định vị tuyệt đối)


"vị trí: đã sửa" hiện hoạt động như bạn mong đợi trong iOS5.


Có một số điều kỳ lạ xảy ra với vị trí: đã sửa khi bạn phóng to trên iOS. Xem stackoverflow.com/questions/52085998/ từ
Peter Hollingsworth

23

vị trí: đã sửa không hoạt động trên android / iphone để cuộn dọc. Nhưng bạn cần đảm bảo các thẻ meta của bạn được thiết lập đầy đủ. ví dụ

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

Ngoài ra, nếu bạn dự định có cùng một trang hoạt động trên Android trước 4.0, bạn cũng cần đặt vị trí hàng đầu, hoặc một số tiền lãi nhỏ sẽ được thêm vào vì một số lý do.


Điều này thực sự làm việc cho tôi. Trước đó, vị trí: cố định trên một yếu tố đầu vào bị ẩn (xem điều hướng màn hình css thuần túy) khiến trình duyệt bị sập trên iphone ios 8.3 nhưng không phải trên máy tính bảng. Sau khi nó hoạt động tốt.
Stephen Smith

Không hoạt động trên iPad iOS 10.3, nằm ngang trong Đế vuông. Tác giả được cho biết phương pháp này là dành cho "điện thoại".
SushiGuy

2
Vô hiệu hóa người dùng để phóng to có user-scalable=0, minimum-scale=1.0, maximum-scale=1.0thể làm cho trang ít truy cập hơn đối với nhiều người dùng. Sẽ rất hữu ích khi thêm cảnh báo về câu trả lời của bạn
neiya

22

bây giờ táo hỗ trợ mà

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

Đây chính xác là những gì tôi đã có sau khi giải quyết vấn đề của mình background-size: coverfixedtrên iPad
andyb

Điều này hoạt động trên Mobile Safari trong iOS 7. Lưu ý: Nó sẽ không hoạt động đối với người dùng chưa nâng cấp lên phiên bản này.
Neil Monroe

Sau đó phải có một số biến khác trong công việc. Tôi đã thử nghiệm trên iOS 6 và nó không hoạt động, sau đó trên iOS 7 và nó đã hoạt động.
Neil Monroe

@NeilMonroe hmm có lẽ. Tôi chắc chắn rằng tôi đã thực hiện nó trên iOS 6 mà không cần thăm dò nhưng có lẽ tôi đã sử dụng một biến khác. đừng nhớ
Uur zpınar

điều này thực sự hữu ích, nhưng có vẻ như, overflownó phải được đặt thànhscroll

19

Tôi gặp vấn đề này trên Safari (iOS 10.3.3) - trình duyệt không được vẽ lại cho đến khi sự kiện touchend được kích hoạt. Các yếu tố cố định đã không xuất hiện hoặc bị cắt.

Thủ thuật cho tôi là thêm biến đổi: translate3d (0,0,0); đến yếu tố vị trí cố định của tôi.

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

EDIT - Bây giờ tôi biết tại sao biến đổi khắc phục vấn đề: tăng tốc phần cứng. Việc thêm chuyển đổi 3D sẽ kích hoạt khả năng tăng tốc GPU giúp quá trình chuyển đổi suôn sẻ. Để biết thêm về kiểm tra tăng tốc phần cứng bài viết này: http://blog.teamtreehouse.com/increas-your-sites-performance-with-hardware-accelerated-css .


Điều này thực sự đã khắc phục sự cố cuộn của tôi, nó bị nảy trên các thiết bị iOS khi sử dụng fixed, thêm transformvà điều này đã được sửa.
vonUbisch

17

Đã sửa lỗi Footer (ở đây với 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}

Hy vọng nó giúp.


7

Tránh trên cùng một hộp bằng cách sử dụng biến đổi: --- và vị trí: cố định. Phần tử sẽ giữ nguyên vị trí: tĩnh nếu có bất kỳ biến đổi nào.


6

Tôi đã kết thúc bằng cách sử dụng jQuery Mobile v1.1 mới: http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/

Bây giờ chúng tôi có một bản viết lại chắc chắn cung cấp các thanh công cụ cố định thực sự trên rất nhiều nền tảng phổ biến và an toàn quay trở lại định vị thanh công cụ tĩnh trong các trình duyệt khác.

Phần thú vị nhất về cách tiếp cận này là, không giống như các giải pháp dựa trên JS áp đặt vật lý cuộn không tự nhiên trên tất cả các nền tảng, việc cuộn của chúng tôi cảm thấy tự nhiên 100% vì nó . Điều này có nghĩa là việc cuộn cảm thấy phù hợp ở mọi nơi và hoạt động với đầu vào của người dùng cảm ứng, chuột và bàn phím. Như một phần thưởng, giải pháp dựa trên CSS của chúng tôi siêu nhẹ và không ảnh hưởng đến khả năng tương thích hoặc khả năng truy cập.


Cũng khá thanh lịch (nhưng chắc chắn là một cách giải quyết) là phương pháp này cho phép các đối tượng cố định trên iOS mà không cần sử dụng jQuery hoặc JavaScript (chỉ sử dụng CSS). Nó khá phổ biến áp dụng. Nếu bạn muốn một position:fixedphần tử "nổi" xuất hiện ở phía trước trang cuộn của mình, bạn chỉ cần cung cấp cho nó một z-indexgiá trị cao hơn để nó ở phía trước.
Slink

Điều này chắc chắn không trả lời câu hỏi.
Gustavo Siqueira

1

sử dụng jquery tôi có thể đưa ra điều này. Nó không cuộn trơn tru, nhưng nó thực hiện các mẹo. bạn có thể cuộn xuống và div cố định bật lên trên cùng.

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>

CÂU CHUYỆN

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

Cuối cùng, chúng tôi muốn xác định xem ipod touch ở chế độ ngang hay dọc để hiển thị tương ứng

<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

Mặc dù thuộc tính CSS {position:fixed;}dường như (chủ yếu) hoạt động trên các thiết bị iOS mới hơn, nhưng có thể khiến thiết bị không hoạt động và dự phòng {position:relative;}theo thời gian và không có lý do hoặc lý do. Thông thường, việc xóa bộ nhớ cache sẽ giúp ích, cho đến khi có điều gì đó xảy ra và việc giải quyết lại xảy ra.

Cụ thể, từ chính Apple Chuẩn bị nội dung web của bạn cho iPad :

Safari trên iPad và Safari trên iPhone không có cửa sổ có thể thay đổi kích thước. Trong Safari trên iPhone và iPad, kích thước cửa sổ được đặt thành kích thước của màn hình (trừ điều khiển giao diện người dùng Safari) và người dùng không thể thay đổi. Để di chuyển xung quanh một trang web, người dùng thay đổi mức thu phóng và vị trí của chế độ xem khi họ chạm hai lần hoặc chụm để phóng to hoặc thu nhỏ hoặc bằng cách chạm và kéo để xoay trang. Khi người dùng thay đổi mức thu phóng và vị trí của chế độ xem, họ sẽ làm như vậy trong một khu vực nội dung có thể xem được với kích thước cố định (nghĩa là cửa sổ). Điều này có nghĩa là các thành phần trang web có vị trí "cố định" với chế độ xem có thể kết thúc bên ngoài khu vực nội dung có thể xem, ngoài màn hình.

Thật là mỉa mai, các thiết bị Android dường như không có vấn đề này. Ngoài ra, nó hoàn toàn có thể sử dụng {position:absolute;}khi tham chiếu đến thẻ body và không có bất kỳ vấn đề nào.

Tôi đã tìm ra nguyên nhân sâu xa của việc giải quyết vấn đề này; rằng đó là sự kiện cuộn không chơi đẹp khi được sử dụng cùng với thẻ HTML hoặc BODY. Đôi khi nó không muốn kích hoạt sự kiện, hoặc bạn sẽ phải đợi cho đến khi sự kiện cuộn cuộn kết thúc để nhận sự kiện. Cụ thể, chế độ xem được vẽ lại vào cuối sự kiện này và các yếu tố cố định có thể được định vị lại ở một nơi khác trong chế độ xem.

Vì vậy, đây là những gì tôi làm: ( tránh sử dụng chế độ xem và gắn bó với 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>

Về bản chất, điều này sẽ làm cho BODY có kích thước của khung nhìn và không thể cuộn được. DIV có thể cuộn được lồng bên trong sẽ cuộn như BODY thông thường (trừ hiệu ứng xoay, do đó, cuộn không dừng trên touchend.) DIV cố định vẫn cố định mà không bị nhiễu.

Là một lưu ý phụ, z-indexgiá trị cao trên DIV cố định rất quan trọng để giữ DIV có thể cuộn xuất hiện ở phía sau nó. Tôi thường thêm vào thay đổi kích thước cửa sổ và cuộn các sự kiện cũng để tương thích với trình duyệt chéo và tương thích độ phân giải màn hình.

Nếu vẫn thất bại, đoạn mã trên cũng sẽ hoạt động với cả DIV cố định và có thể cuộn được đặt thành {position:absolute;}.


1

Cách đơn giản để khắc phục sự cố này chỉ cần nhập thuộc tính biến đổi cho phần tử của bạn. và nó sẽ được sửa chữa. Mã hóa hạnh phúc :-)

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

Ngoài ra bạn có thể thử theo cách của mình vì điều này cũng hoạt động tốt.

.classname{
      position: -webkit-sticky;
    }

0

Điều này có thể không áp dụng được cho tất cả các kịch bản, nhưng tôi thấy rằng position: sticky(cùng một thứ position: fixed) chỉ hoạt động trên iPhone cũ khi hộp chứa cuộn không phải là thân máy, mà bên trong một thứ khác.

Ví dụ giả html:

body                         <- scrollbar
   relative div
       sticky div

Thẻ div dính sẽ dính trên trình duyệt máy tính để bàn, nhưng với một số thiết bị nhất định, đã được thử nghiệm với: Chromium: dev tools: thiết bị mở rộng: iPhone 6/7/8 và với Android 4 Firefox, nó sẽ không.

Những gì sẽ làm việc, tuy nhiên, là

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

0

Trong trường hợp của tôi, đó là do yếu tố cố định đã được hiển thị bằng cách sử dụng một hình ảnh động. Như đã nêu trong liên kết này :

trong Safari 9.1, có một vị trí: phần tử cố định bên trong một phần tử hoạt hình, có thể khiến vị trí: phần tử cố định không xuất hiện.


-2

đây là giải pháp của tôi cho việc này ...

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>

Giải thích là vị trí cố định cho div sẽ giữ div trên nền mọi lúc, sau đó chúng tôi kéo dài div để đi trên tất cả các góc của trình duyệt (với điều kiện lề cơ thể = 0) bằng cách sử dụng (trái, phải, trên, dưới ) đồng thời.

Vui lòng đảm bảo rằng bạn không sử dụng chiều rộng và chiều cao vì điều này sẽ ghi đè lên các tùy chọn trên cùng, trái, phải, dưới cùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.