position : fixed가 iPad 및 iPhone에서 작동하지 않습니다


132

나는 잠시 동안 iPad에서 고정 위치로 고심하고 있습니다. 나는 iScroll을 알고 있으며 항상 데모 에서조차 작동하지는 않습니다. 또한 Sencha에 대한 수정 사항이 있지만 해당 수정의 소스 코드를 Ctrl+ 할 수 없습니다 F.

누군가가 해결책을 가질 수 있기를 바랍니다. 문제는 사용자가 iOS 기반 모바일 Safari에서 팬 / 업 / 업할 때 고정 위치 요소가 업데이트되지 않는다는 것입니다.


2
jQuery Mobile 1.1이이 문제를 해결 한 것 같습니다 : jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0
Tower


여러 가지 SO 질문이 중복 될 수 있습니다. 자세한 내용은 gist.github.com/avesus/… 를 참조하십시오.
Brian Haak

답변:


66

많은 모바일 브라우저 position:fixed;는 고정 요소가 작은 화면에서 방해가 될 수 있다는 이유로 고의적으로 지원하지 않습니다 .

Quirksmode.org 사이트에는 문제를 설명하는 매우 좋은 블로그 게시물이 있습니다. http://www.quirksmode.org/blog/archives/2010/12/the_fifth_posit.html

또한 지원되는 모바일 브라우저를 보여주는 호환성 차트는이 페이지를 참조하십시오 position:fixed;. http://www.quirksmode.org/m/css.html

(그러나 모바일 브라우저 세계는 매우 빠르게 움직이고 있으므로 이와 같은 테이블은 오랫동안 최신 상태로 유지되지 않을 수 있습니다!)

업데이트 : iOS 5와 Android 4는 모두 position : fixed 지원이 있다고보고되었습니다.

나는 오늘 Apple Store에서 iOS 5를 직접 테스트했으며 고정 위치에서 작동하는지 확인할 수 있습니다. 그래도 고정 요소를 확대하고 이동하는 데 문제가 있습니다.

이 호환성 표는 quirksmode보다 훨씬 최신이며 유용합니다. http://caniuse.com/#search=fixed

그것은 안드로이드, 오페라 (미니 및 모바일) 및 iOS에 대한 최신 정보가 있습니다.


position:device-fixed여분의 종류입니다. position:fixedW3C 사양으로 작동해야합니다.
Talvi Watia 2016 년

@TalviWatia- device-fixed해결책은 내 대답의 일부가 아닙니다. 그것은 제안으로 가치가있을 수도 있고 그렇지 않을 수도 있지만, 그 이유는 그의 제안 된 해결책보다는 문제에 대한 설명이었습니다. 어쨌든,이 답변이 게시 된 이후 많은 일이 진행되었으며 많은 최신 장치가 지원 fixed합니다. 그래도 그렇지 않은 구형 장치를 처리해야합니다.
Spudley

54
궁금합니다. 당면한 문제에 대한 귀하의 솔루션은 정확히 무엇입니까? 도움이되었지만 제공 한 링크는 현재 문제를 해결하지 못합니다. 지루하지는 않지만 사람들은 실제로 여기에 대답하지 않은 답변을 찬성하는 경향이 있습니다.
Talvi Watia

1
@TalviWatia : 대답을 쓸 당시에는 실제로 그 질문에 대한 좋은 해결책이 없었습니다. 내가 준 링크는 내가 왜 그런지 설명 할 수있는 최고의 토론 이었습니다. 해결책이 없으면 내가 제공 할 수있는만큼 좋았습니다. 개입 기간에 상황이 바뀌 었으므로 링크의 논의는 더 이상 관련이 없으며 현재 해결책이 있지만 그 당시의 방식입니다.
Spudley 2016 년

실제로 위치 : 고정은 스케일 1에서 작동하지만 사용자가 ipad를 확대 / 축소하면 정상적으로 작동하지 않습니다. 위치 : 장치 고정 존재 ?? 사파리 iOS에 유효한 CSS 속성입니까?
ccsakuweb

37

고정 위치는 컴퓨터에서와 같이 iOS에서 작동하지 않습니다.

돋보기 (뷰포트) 아래에 한 장의 종이 (웹 페이지)가 있다고 가정하고 돋보기와 눈을 움직이면 페이지의 다른 부분이 보입니다. 이것이 iOS의 작동 방식입니다.

이제 단어가 적힌 투명한 플라스틱 시트가 있습니다.이 플라스틱 시트는 무엇이든 (위치 : 고정 요소) 고정되어 있습니다. 따라서 돋보기 를 움직이면 고정 요소 움직이는 것처럼 보입니다 .

또는 돋보기를 이동하는 대신 플라스틱 시트와 돋보기를 그대로 유지하면서 종이 (웹 페이지)를 이동합니다. 이 경우 플라스틱 시트에있는 단어는 고정 된 상태로 유지되고 나머지 내용은 이동하는 것처럼 보입니다 (실제로 있기 때문). 이것은 일반적인 데스크탑 브라우저입니다.

따라서 iOS에서는 뷰포트가 이동하고 기존 브라우저에서는 웹 페이지가 이동합니다. 두 경우 모두 고정 요소는 여전히 실제 상태입니다. iOS에서는 고정 요소가 움직이는 것처럼 보입니다.


이 문제를 해결하는 방법은 이 기사 의 마지막 몇 단락을 따르는 것입니다.

(기본적으로 스크롤을 모두 비활성화하고 내용을 별도의 스크롤 가능한 div에 저장하고 (링크 된 기사 상단의 파란색 상자 참조) 고정 요소는 절대적으로 배치하십시오)


"position : fixed"는 이제 iOS5에서 예상 한대로 작동합니다.


IOS를 확대 할 때 position : fixed에서 발생하는 이상한 일이 있습니다. 참조 stackoverflow.com/questions/52085998/...
피터 홀 링스 워스

23

position : fixed는 세로 스크롤을 위해 android / iphone에서 작동합니다. 그러나 메타 태그가 완전히 설정되어 있는지 확인해야합니다. 예 :

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

또한 Android 4.0 이전 버전에서 동일한 페이지를 사용할 계획이라면 최상위 위치도 설정해야합니다. 그렇지 않으면 어떤 이유로 작은 여백이 추가됩니다.


이것은 실제로 나를 위해 일했습니다. 이전에는 숨겨진 입력 요소에 position : fixed (순수한 css off 화면 탐색 참조)로 인해 브라우저가 iphone ios 8.3에서 충돌했지만 태블릿에서는 충돌하지 않았습니다. 잘 작동하면.
Stephen Smith

스퀘어 스탠드에서 가로로 iPad iOS 10.3에서 작동하지 않았습니다. 허가 된 저자는이 접근 방식이 "전화"를위한 것이라고 말합니다.
SushiGuy

2
사용자가 확대 / 축소를 사용 중지하면 user-scalable=0, minimum-scale=1.0, maximum-scale=1.0많은 사용자가 페이지에 액세스 할 수 없게됩니다. 답변에 경고를 추가하는 것이
좋습니다.

22

이제 애플 지원

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

이것은 내가 내 해결하기 위해 후 무엇인지 정확히 background-size: coverfixed아이 패드에 문제를
andyb

iOS 7의 Mobile Safari에서 작동합니다. 참고 :이 버전으로 아직 업그레이드하지 않은 사용자에게는 작동하지 않습니다.
Neil Monroe

그런 다음 직장에서 다른 변수가 있어야합니다. iOS 6에서 테스트했지만 작동하지 않았으며 iOS 7에서 작동했습니다.
Neil Monroe

@NeilMonroe 흠. 나는 prob없이 iOS 6에서 그것을 해왔지만 다른 변수를 사용했을 것입니다. 그나마 기억
우 그르 Özpınar에게

이것은 정말 도움이되었지만, 다음 overflow과 같이 설정되어야합니다.scroll

19

Safari (iOS 10.3.3) 에서이 문제가 발생했습니다. 터치 엔드 이벤트가 시작될 때까지 브라우저가 다시 그려지지 않았습니다. 고정 요소가 나타나지 않거나 잘 렸습니다.

나를위한 비결은 transform을 추가하는 것입니다 : translate3d (0,0,0); 고정 위치 요소에.

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

편집 -이제 변형이 문제를 해결하는 이유를 알고 있습니다. 하드웨어 가속. 3D 변환을 추가하면 GPU 가속이 트리거되어 부드럽게 전환됩니다. 하드웨어 가속 체크 아웃에 대한 자세한 내용은 http://blog.teamtreehouse.com/increase-your-sites-performance-with-hardware-accelerated-css를 참조하십시오 .


이것은 실제로 스크롤 문제를 해결했습니다.을 사용할 때 iOS 기기에서 수신 거부되고 fixed추가 되었으며이 transform가 수정되었습니다.
vonUbisch '

17

고정 바닥 글 (여기서는 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}

도움이 되길 바랍니다.


7

transform : --- 및 position : fixed를 사용하여 동일한 상자에서 사용하지 마십시오. 변환이 있으면 요소는 position : static 위치에있게됩니다.


6

나는 새로운 jQuery Mobile v1.1을 사용했다 : http://jquerymobile.com/blog/2012/04/13/announcing-jquery-mobile-1-1-0/

이제는 널리 사용되는 많은 플랫폼에서 고정 된 도구 모음을 제공하고 다른 브라우저의 정적 도구 모음 위치로 안전하게 넘어가는 견고한 재 작성이 가능합니다.

이 접근 방식의 가장 멋진 부분은 모든 플랫폼에서 부 자연스러운 스크롤 물리를 강요하는 JS 기반 솔루션과 달리 스크롤이 100 % 네이티브라는 느낌 입니다 . 이것은 스크롤이 어느 곳에서나 느끼고 터치, 마우스 휠 및 키보드 사용자 입력과 함께 작동 함을 의미합니다. 또한 CSS 기반 솔루션은 초경량이며 호환성 또는 액세스 가능성에 영향을 미치지 않습니다.


또한 jQuery 또는 JavaScript를 사용하지 않고 iOS에서 고정 객체를 허용하는 이 방법 은 매우 우아하지만 (해결 책임) CSS 만 사용합니다. 그것은 보편적으로 적용 가능합니다. position:fixed스크롤 페이지 앞에 "플로팅" 요소를 표시하려면 앞에 표시 z-index되도록 더 높은 값을 지정해야합니다.
Slink

이것은 확실히 질문에 대답하지 않습니다.
구스타보시 케이 라

1

jquery를 사용하여 이것을 생각해 낼 수 있습니다. 부드럽게 스크롤되지는 않지만 트릭을 수행합니다. 아래로 스크롤하면 고정 div가 맨 위에 나타납니다.

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>

쿼리

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

마지막으로 가로 또는 세로 모드에서 iPod을 터치하여 표시 할 것인지 결정합니다.

<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 속성 {position:fixed;}이 최신 iOS 기기에서 작동하는 것처럼 보이지만 기기에 문제가 생길 수 있습니다.{position:relative;} 를 가끔 이유나 이유없이 수 있습니다. 일반적으로 캐시를 지우면 문제가 발생하고 문제가 다시 발생할 때까지 도움이됩니다.

특히, Apple 자체 에서 iPad 용 웹 컨텐츠 준비하기 :

iPad의 Safari 및 iPhone의 Safari에는 크기 조정 가능한 창이 없습니다. iPhone 및 iPad의 Safari에서 윈도우 크기는 화면 크기 (Safari 사용자 인터페이스 컨트롤 제외)로 설정되며 사용자가 변경할 수 없습니다. 웹 페이지를 이동하려면 사용자가 확대 또는 축소하기 위해 두 번 탭하거나 핀치하거나 확대 / 축소하기 위해 터치 및 드래그하여 뷰포트의 확대 / 축소 수준과 위치를 변경합니다. 사용자가 뷰포트의 확대 / 축소 레벨과 위치를 변경하면 고정 크기 (즉, 창)의 볼 수있는 컨텐츠 영역 내에서 그렇게합니다. 즉, 위치가 뷰포트에 "고정 된"웹 페이지 요소는 화면 밖에서 볼 수있는 컨텐츠 영역 외부로 끝날 수 있습니다.

아이러니 한 것은 안드로이드 기기에는이 문제가없는 것 같습니다. 또한 완전히 사용할 수 있습니다{position:absolute;} body 태그와 관련하여 문제가없는 경우 사용할 수 있습니다.

이 문제의 근본 원인을 찾았습니다. HTML 또는 BODY 태그와 함께 사용하면 스크롤 이벤트가 제대로 재생되지 않습니다. 때로는 이벤트를 시작하는 것을 좋아하지 않거나 스크롤 스윙 이벤트가 완료 될 때까지 기다려야합니다. 특히,이 이벤트가 끝나면 뷰포트가 다시 그려지고 고정 요소를 뷰포트의 다른 위치에 재배치 할 수 있습니다.

그래서 이것은 내가하는 일입니다 : ( 뷰포트를 사용 하지 말고 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>

본질적으로 이것은 BODY가 뷰포트의 크기이며 스크롤 할 수 없게 만듭니다. 스크롤 가능한 DIV 내부의 BODY는 BODY가 정상적으로하는 것처럼 스크롤합니다 (스윙 효과를 빼면 스크롤이 터치 엔드에서 멈춤). 고정 된 DIV는 간섭없이 고정 된 상태를 유지합니다.

참고로, z-index스크롤 가능한 DIV가 뒤에있는 것처럼 보이게하려면 고정 DIV에서 높은 값이 중요합니다. 나는 일반적으로 크로스 브라우저 및 대체 화면 해상도 호환성을 위해 창 크기 조정 및 스크롤 이벤트를 추가합니다.

다른 모든 방법이 실패하면 위의 코드는 고정 및 스크롤 가능 DIV 모두로 설정되어 작동 {position:absolute;}합니다.


1

이 문제를 해결하는 간단한 방법은 요소의 속성을 변환하는 것입니다. 고정됩니다. 행복한 코딩 :-)

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

또한 그의 방법을 시도해 볼 수도 있습니다.

.classname{
      position: -webkit-sticky;
    }

0

이것은 모든 시나리오에 적용 할 수 는 없지만 스크롤 컨테이너가 본문 이 아닌 다른 무언가 안에있는 경우 position: sticky(와 동일한 것 position: fixed)이 오래된 iPhone에서만 작동 한다는 것을 알았 습니다.

의사 HTML 예 :

body                         <- scrollbar
   relative div
       sticky div

sticky div는 데스크톱 브라우저에서 고정되지만 특정 장치에서는 다음과 같이 테스트되었습니다. Chromium : dev 도구 : 장치 모방 : iPhone 6/7/8 및 Android 4 Firefox에서는 그렇지 않습니다.

그러나 작동하는 것은

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

0

필자의 경우 고정 요소가 애니메이션을 사용하여 표시 되었기 때문입니다. 이 링크에 명시된 바와 같이 :

Safari 9.1에서 애니메이션 요소 내에 position : fixed-element가 있으면 position : fixed-element가 나타나지 않을 수 있습니다.


-2

여기에 내 해결책이 있습니다 ...

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>

설명은 div에 고정 된 위치가 div를 항상 배경에 유지 한 다음 (왼쪽, 오른쪽, 위쪽, 아래쪽을 사용하여 브라우저의 모든 모서리 (본문 여백 = 0 제공)로 이동하도록 div를 늘립니다) ) 동시에.

너비와 높이를 사용하지 마십시오. 위, 왼쪽, 오른쪽, 아래 옵션보다 우선합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.