iOS Safari问题 - 当将绝对位置更改为固定

时间:2016-05-26 10:14:45

标签: ios scroll safari positioning

我想在页面上使用一个元素作为以下内容的标题,但是当用户滚动到内容时,这个title-element应该固定在标题上。类似于iOS音乐应用程序中的ABC字幕。

见这里:https://jsfiddle.net/1e7ync4w/

HTML

<div>
  <div class="top">
  Test
  </div>
  <div class="content">
    <div class="scroller">

    </div>

    Test
  </div>
</div>

CSS

.top {
  background-color: yellow;

  height: 300px;
}

.content {
  position: relative;

  height: 600px;

  background-color: green;
}

.scroller {
  position: absolute;

  width: 100%;
  height: 10px;

  top: 0;
  left: 0;

  background-color: blue;
}

.scroller.fixed {
  position: fixed;
}

JS

$(document).ready(function() {
    $(window).on('scroll touchmove', function() {
      $('.scroller').removeClass('fixed');


    var scrollTop = $(window).scrollTop();
    var scrollerOffsetTop = $('.scroller').offset().top;

    if(scrollerOffsetTop <= scrollTop) {
                $('.scroller').addClass('fixed');
    }
});
  });

问题在于iOS游戏似乎有一个错误,即在滚动时将元素更改为固定(通过JavaScript)。一旦用户滚动到内容中,标题元素就会变得不可见,但在从显示屏释放手指后会显示(滚动结束)。

我只是在iOS 9.3.2 safari上测试了这个,但我觉得这个问题比较老了。

1 个答案:

答案 0 :(得分:0)

我找到了解决这个问题的方法。这有点hacky但是我发现这个iOS bug的唯一解决方法。

需要“激活”浏览器的GPU以更新相应元素。这可以通过在定位跳转到固定时通过JS设置transform: translate样式来实现。

示例的代码如下所示:

$(document).ready(function () {
    $(window).on('scroll touchmove', function () {
        $('.scroller').removeClass('fixed');


        var scrollTop = $(window).scrollTop();
        var scrollerOffsetTop = $('.scroller').offset().top;

        if (scrollerOffsetTop <= scrollTop) {
            $('.scroller').addClass('fixed').css({
                'transform': 'translate3d(0px,0px,0px)',
                '-moz-transform': 'translate3d(0px,0px,0px)',
                '-ms-transform': 'translate3d(0px,0px,0px)',
                '-o-transform': 'translate3d(0px,0px,0px)',
                '-webkit-transform': 'translate3d(0px,0px,0px)'
            });
        }
    });
});