如何使我的固定位置文章滑块在 iPad 上平滑

Posted

技术标签:

【中文标题】如何使我的固定位置文章滑块在 iPad 上平滑【英文标题】:How can I make my fixed position article slider smooth on the iPad 【发布时间】:2012-08-01 10:14:06 【问题描述】:

我的客户需要一个文章滚动条,它将外发文章留在当前滚动位置,并在顶部显示新文章。

我使用 CSS3 过渡实现了这一点,方法是将传出文章的上边距设置为等于当前 $(window).scrollTop() 值的负值,然后使用 $(window) 将页面滚动到顶部。滚动顶部(0)。幻灯片完成后,我将外发文章的上边距重置为零,为下一次过渡做好准备。我在http://www.siblify.com/stackslider/ 上传了一个简化示例,但这里是专门管理“下一个”点击滚动的代码。

#container 
height:auto;
width:800px;
position:relative;
overflow:hidden;
margin:0 auto;
padding:60px 0 20px;


.slidePanel 
position:absolute;
left:0;
top:0;
width:760px;
z-index:900;
background:grey;
-webkit-transition:left .5s ease-in-out;
-moz-transition:left .5s ease-in-out;
-o-transition:left .5s ease-in-out;
padding:60px 20px 20px;


.prevPanel 
left:-800px;


.currentPanel 
z-index:1000;
display:block;


.nextPanel 
left:800px;


div.sliding 
left:0;


div.slidingOffLeft 
left:-840px;


div.slidingOffRight 
left:840px;


<div id="controls">
        <a href="prev">Prev</a> <a href="next">Next</a>
    </div>

    <div id="container">
        <div class="prevPanel slidePanel">
            <!-- content here -->
        </div>

        <div class="currentPanel slidePanel">
            <!-- content here -->
        </div>

        <div class="nextPanel slidePanel">
            <!-- content here -->
        </div>
    </div>

$('a[href="next"]').click(function(i) 
        i.preventDefault();
        $('.prevPanel').remove();
        $('.currentPanel').css(
            "margin-top": "-" + $(window).scrollTop() + "px"
        );
        $(window).scrollTop(0);
        $('.currentPanel').addClass('slidingOffLeft').delay(500).removeClass('slidingOffLeft currentPanel').addClass('prevPanel');
        $('.nextPanel').addClass('sliding').delay(500).removeClass('sliding nextPanel').addClass('currentPanel');
        setTimeout(function() 
            $('#container').height($('.currentPanel').height());
            $('.prevPanel').css(
                'margin-top': '0px'
            );
        , 500)

        )

此方法在桌面浏览器上完美运行,但在 iPad 上添加负边距和 $(window).scrollTop(0) 不会立即发生,因此当窗口在文章之前滚动到顶部时,您会看到轻微的闪烁被拉回原位。

任何关于如何让这两个事件在 ios 上同时触发的建议或可以提高性能的替代方法将不胜感激。

注意:在我的示例中,“上一个”和“下一个”按钮在点击时会跳下页面。这是一个已知的 iOS 固定定位错误,在这个项目中对我来说不是问题,因为最终版本将是手势控制的。

【问题讨论】:

只滚动带有文本的面板怎么样..不是整个窗口。这样您将只能更改边距,下一个面板将自动在其默认位置(滚动到顶部) 感谢 simekadam 的想法,它对我有用。我仍然需要为桌面正常滚动页面,所以我针对 iPad 的屏幕尺寸,只是为它们滚动了面板。这引发的唯一问题是,通过使面板可滚动,它会禁用看起来不太好的弹性滚动。我可以使用 -webkit-overflow-scrolling:touch; 重新启用它。但随后页面转换变得非常缓慢和生涩。所以并不完美,但希望现在可以接受。 其实我现在正拿着 iPad 坐在这里,我会测试一下,然后可能会回复一些进一步的想法如何解决 ir 【参考方案1】:

哇..所以我查看了您的代码并感到很困惑..看起来很复杂:D 你有很多课程切换和...... 我将如何以某种方式解决这个问题..(警告我很累,所以我将使用某种伪代码:))

DIV 1 with overflow hidden and fixed bounds
 DIV 2 which will be as wide as sum of widths of all panels
  PANEL 1 fixed width height and so on..
  PANEL 2
  .....
  PANEL N
 2 VID :)
1 VID

然后你可以像这样将 CSS TRANSFORM 应用到DIV 2

CSS:
DIV 2
  -webkit-transntion:  left 500ms;
  // in case you will be faced with flickering while the transition going on try using this - should help
  -webkit-perspective: 1000;
  -webkit-backface-visibility: hidden;   

那么你的 JS 中就可以有这样的东西了

 onTouchForwardButton
     offset = DIV_2.left - currPanel.next().width()
     DIV_2.css(left, offset);

再次......当你不会滚动整个身体时,你可以避免使用 scrollTop 功能..或者你可以将它推迟到转换回调..你可以使用webkitTransitionEnd 事件来处理它。但是我认为在这种情况下只滚动每个面板元素更有意义。所以毕竟尝试这样做,即使使用 scrollTop 函数它可能会表现得更好..我认为在你的代码中可能会出现这些延迟和超时的问题..

再次为这个讨厌的伪代码感到抱歉,但我懒得写括号等等。也许明天我可以做得更好并重写我的答案..

祝你好运!

【讨论】:

非常感谢您抽出宝贵时间查看此内容。我将尝试实施您的建议并报告。 以防万一有人想知道 - 我最终为此使用了 3d 变换。它利用 ipad 硬件加速并创建了适当的平滑过渡。

以上是关于如何使我的固定位置文章滑块在 iPad 上平滑的主要内容,如果未能解决你的问题,请参考以下文章

具有固定位置的平滑滚动标题

固定位置:滚动

元素变换在出现'相对'和'固定'之间的转换不平滑

使用带有位置的背景滑块时,菜单上的悬停消失:固定和 z-index

在 iPad 上查看时,两个固定位置的 div 会产生边距

如何在ipad和iphone中固定背景图像不滚动位置固定[重复]