ios上的过渡和滚动后jquery元素闪烁

Posted

技术标签:

【中文标题】ios上的过渡和滚动后jquery元素闪烁【英文标题】:jquery element flicker after transition and scrolltop on ios 【发布时间】:2013-10-27 23:35:46 【问题描述】:

好吧,这将是艰难的......希望大师们提出解决方案!

这很难解释,但这里是..

我有两个元素:

<style>
#elem1 
position:absolute;
left:-1400px;
z-index:1000;
width:100%;

.anim 
  -webkit-transition: -webkit-transform 0.5s ease;
  -moz-transition: -moz-transform 0.5s ease;
  -ms-transition: transform 0.5s ease;
  -o-transition: -o-transform 0.5s ease;
  transition: transform 0.5s ease;

.overr 
  transform:translate(1400px,0);
  -ms-transform:translate(1400px,0); 
  -webkit-transform:translate(1400px,0);
  -webkit-backface-visibility: hidden;
  -webkit-perspective: 1000;
  
</style>
<script>
$('#btn a').click(function()
 currentPos = $(window).scrollTop();
 $('#elem1).toggleClass('overr');
 $('#elem1).attr('style', 'top:' + currentPos + 'px;');

 setTimeout(function() 
  $('#elem2').toggle(0);
  $('#elem1').attr('style', 'top:0');
  $(window).scrollTop( 0 );
  , 500)
);
</script>

<div id="elem1" class="anim">content here</div>
<div id="elem2">content 2 here></div>

我想在这里实现的是: 元素 2 根本没有样式,只是一个普通的元素。 单击按钮,获得#elem2 位置,将#elem1 像抽屉一样从左侧拉出,使其顶部位于屏幕的当前位置,然后隐藏#elem2,#elem1 到顶部并且屏幕向上滚动。

结果是,我在同一页面上,在底部的顶部加载完全不同的内容,我可以滚动而不会过度滚动(这在 iphone 上非常需要 - 移开顶部和底部栏 - 实际上这就是我需要这个的原因)。

问题:

问题是屏幕在最后一个 $(window).scrollTop( 0 ) 处闪烁 - 该死的屏幕闪烁。如果我在页面顶部启动脚本,它不会闪烁。

a) 我尝试更改脚本的顺序,但更改内容并没有给我所需的结果。 b) 将过渡效果更改为“线性”会更好,但您仍然可以看到它。

我知道这件事很难,但希望有人能帮我解决这个问题!

edit:看起来像 $('#elem2').toggle(0) 和 $(window).scrollTop(0) 同时触发,所以在它闪烁的瞬间看起来它也带来了#elem2 在顶部,这就是它闪烁的原因...:/ 到目前为止,我在这上面浪费了大约 4 个小时 :(

edit2:即使完全删除动画过渡,仍然会闪烁。我去睡觉了,不能再保持清醒了..希望我能得到一份早间礼物:/

【问题讨论】:

如果你有这个直播(不是 jsfiddle,所以我们可以在 ios 上尝试实际的网站),人们可以检查链接,你可能会得到你正在寻找的响应。如果这不可能,一个 jsfiddle 总比没有好。 我意识到这一点,但不幸的是,我还不能分享有关现场网站的任何信息。我暂时找到了一种解决方法(完全取代了上述操作),但我真的很想知道有关此的解决方案。我已将问题缩小到:***.com/questions/19469988/…。这是导致问题的原因,同时运行 2 个功能 此问题是否出现在实际的 iOS 设备上,或者您是否在桌面浏览器版本中进行测试?请提供有关出现此问题的平台和浏览器的信息。 它出现在我的 iphone 4s 上的 IOS7 上。 【参考方案1】:

您是否考虑过使用动画功能?可以实现这一点,以便在前一个动画完成之前不会发生后续样式更改。显然,您可以根据需要嵌套尽可能多的动画(出于说明目的,我只在下面嵌套了几个),这消除了多任务处理时出现的问题。

<style type="text/css">
    #elem1 
    position:absolute;
    left:-1400px;
    z-index:1000;
    width:100%;
    
</style>
<input id="btnA" type="button" value="Click Me" />
<div id="elem1">Element 1</div>
<div id="elem2">Element 2</div>
<script type="text/javascript">
    $('#btnA').click(function () 
        currentPos = $(window).scrollTop();
        $('#elem1').animate(
             left: 0 
            , 
                duration: 500
                , easing: "linear"
                , complete: function () 
                    $('#elem2').toggle(0);
                    $('#elem1').animate(
                         top: 0 
                        , 
                            duration: 0
                            , complete: function () 
                                $(window).scrollTop(0);
                            
                        
                    );
                
            );
    );
</script>

参考:http://api.jquery.com/animate/

【讨论】:

是的,我试过了;虽然它在桌面上运行良好,但在 iphone 上我得到相同的闪烁:/【参考方案2】:

不确定这是否会对您有所帮助,但我在 ios 滚动动画方面遇到了类似的问题。我通过使用 scrollTo 插件并设置轴来解决它,例如:

$.scrollTo(target, 400, offset:-60, axis:'y');

这是我发现的唯一可以阻止闪烁的东西。

【讨论】:

【参考方案3】:

我的解决方案没有直接关系,但它包括闪烁的固定元素和 scrollTop(),所以我确信 Google 会在这里找人。

我将动画放在步骤中,而不是直接为 scrollTop 属性设置动画。希望对您有所帮助。

var position_st = $(window).scrollTop();
var position_en = $(scroll_to_selection).offset().top;

$('#body-animator').stop().animate(
    textIndent: 100
, 
    duration: 750,
    step: function(num) 

        var val = (num / 100 * (position_en - position_st)) + position_st;

        $('html, body').scrollTop(val);

    ,
    complete: function() 

        $(this).css(
            textIndent: 0
        );

    
);

【讨论】:

【参考方案4】:

不幸的是,iOS 处理元素转换的方式有点奇怪。他们在卷轴的末尾“刷新”。我知道如何避免这种情况的唯一方法是使用一些静态元素,例如导航栏或浮动页脚。他们不使用任何 javascript 或 CSS 来改变他们的呈现方式。我知道这不是一个解决方案,但希望这可以帮助您更好地理解 iOS webkit :)

【讨论】:

【参考方案5】:

如果是白闪,这其实是css3的问题。我以前也遇到过这种情况,请尝试添加。

-webkit-transform-style: preserve-3d;

同时适用于 .anim 和 .overr 类。

【讨论】:

【参考方案6】:

我想滚动到具有 0 毫秒动画的页面顶部,但大多数时候滚动后会闪烁 - 在 ios 8.3 上。我回去添加一个 400 毫秒的动画并为此放弃了 ScrollTo:

$('html, body').animate(
    scrollTop: 0
, 400);

现在闪烁为 0 .. 并且动画很好地滚动到页面顶部。 1000 毫秒是生涩的。希望这对某人有所帮助。

【讨论】:

以上是关于ios上的过渡和滚动后jquery元素闪烁的主要内容,如果未能解决你的问题,请参考以下文章

Jquery Mobile & Phonegap 3 上的白色闪光和过渡问题

iOS5 + jquery-mobile 过渡闪烁

jquery手机iphone页面闪烁

Jquery mobile 1.2 和 PhoneGap 2.2.0 页面过渡闪烁

带有页面闪烁的jQuery移动元素

Android棒棒糖共享元素过渡闪烁/闪烁