webapp中元素样式改变后页面渲染的延时问题

出现问题的情形大致如下:
有一个列表页面,中间有一个标题栏,当我向上拉动一定距离时,该标题栏固定悬浮在顶部,向下拉动一定距离时,放回到原来位置。
列表又引用了isscroll的上拉加载,下拉刷新插件。同时,页面是引用的vue框架渲染的。
页面dome结构如下:

<style>
.fix_nav.fixed{
    position:fixed;
    top:0,
}
</style>

    <div id="app" class="contianer">
                <div class="banner" style="height: 200px;">...</div>
                <div id="fix_nav" v-bind:class="{'fixed':check_hide}">标题</div>
                <ul class="list">
                    <li>...</li>
                    ...
                </ul>
            </div>

这里我又 遇到了一个坑:

在引入isscroll插件后,监听页面滑动距离,给fix_nav元素切换fixed样式类:

onScrollMove: function() {
                if(this.y <= -vm.banner_height) {
                //滚动到banner盒子高度时,悬浮
                    Vue.nextTick(function(){
                        vm.check_hide = true;
                    })
                } else {
                //还原
                    Vue.nextTick(function(){
                        vm.check_hide = false;
                    })
                }
            },

逻辑上没有任何问题,但是在chrome上调试时,发现fix_nav并没有悬浮(样式fixed是成功添加上的,但是在审查元素时,发现元素仍然跟随contianer盒子滚动到屏幕以外去了),而我的估计是vue在更新check_hide属性后,并未触发页面渲染,而后我用vue的Vue.set方法,想去触发页面渲染,任然无效。

最后我转换了实现方式,就是再复制fix_nav节点,悬浮在顶部并默认隐藏:dome结构如下:

<div id="app" class="contianer">
                <div id="fix_nav fixed" v-bind:class="{'hide':!check_hide}">标题</div>
                <div class="banner" style="height: 200px;">...</div>
                <div id="fix_nav" v-bind:class="{'hide':check_hide}">标题</div>
                <ul class="list">
                    <li>...</li>
                    ...
                </ul>
            </div>

这个思路是直接切换fix_nav fixed和fix_nav两个元素的显示隐藏即可;

虽然达到效果了,但是仍然有不足:
当快速上下滑动页面时,会很明显的看到fix_nav fixed和fix_nav两个元素之间切换的延时效果(比如快速向上拉动,当滑动距离达到临界值时,fix_nav fixed这个元素会等页面继续滑动一定距离后才会很突兀的显示出来,相反,快速下拉时,fix_nav元素也会出现延时显示的问题);

内容有点繁杂,也不便上图,望各位理解:

问一下大神们,如何解决这个状况?

阅读 1.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题