移动端jQuery修正Web页面滑动时div问题的两则实例


Posted in Javascript onMay 30, 2016

顶部固定时划屏出现闪动
头部是一个普通的div,高度是48,头部下面有个固定的banner,手下滑的时候,banner会固定在浏览器最顶部不动。出现的问题是,PC端是好的,手机浏览器向上滑动的时候出现闪动!影响用户体验。
解决方法一:
之前的做法:

if ($(window).scrollTop() < 48) {
    $(".nav ").css("top", 48 - parseInt($(window).scrollTop()));
   }else{
    $(".nav ").css("top", "0"); 
   }
  $(window).scroll(function () {
   $(".nav ").css("top", "0");
   var toplength = parseInt($(window).scrollTop());
   if ($(window).scrollTop() < 48) {
    $(".nav ").css("top", 48 - toplength);
   }
 });

这样做手机网站中会出现明显的闪动效果!
改进之后的做法:

if ($(window).scrollTop() < 48) {
   $(".nav ").stop().animate({"top":48 - parseInt($(window).scrollTop())},"fast");
  } else {
   $(".nav ").stop().animate({"top": "0"},"fast");
  }
$(window).scroll(function () {
   var toplength = parseInt($(window).scrollTop());
   if ($(window).scrollTop() < 48) {
    $(".nav ").stop().animate({"top": 48 - toplength},"fast");
   }else{
   $(".nav ").stop().animate({"top": "0"},"fast"); 
   }
});

这样做滑动的时候,有个向上的动画效果,不会出现闪动!
解决方法二:
思路:顶部固定的地方,一开始和上面不固定的地方是一体的,不写position:fixed,当要固定的div的offset比scrolltop小的时候,让其固定。(我之前之所以没有用这个方法,是因为整个页面在ios中要引用,当在ios中的时候,头部不出现。)
代码如下:

menuPosition: function() {
   var m = $(window).scrollTop(), 
   n = $("#idmenuinfo的父亲").offset().top,
   l = $("#menuinfo");
   if (m >= n) {
    if (!l.hasClass("menuinfo")) {
     l.addClass("menuinfo")
    }
   } else {
    l.removeClass("menuinfo")
   }
  }

menuinfo的样式如下:

.menuinfo {
 position: fixed!important;
 width: 100%;
 left: 0;
 top: 0;
}

表层div滑动、导致底层body滑动
body很长,可以滑动,body头部有一个模拟下拉的选择框。下拉选择有滚动轴,如下图。

移动端jQuery修正Web页面滑动时div问题的两则实例

我给body一个overflow:hidden和高度是没有用的。手机网站上背景还是可以滑动,然后我给body一个touchmove的preventdefault()阻止事件,body滑动阻止了,PC上面是可以了,但是手机上面滑动div还是会导致底部body的滑动,我给div 一个阻止冒泡的事件stopPropagation(),手机网站上面还是不可以。
关于preventdefault和stopPropagation,后面有时间会讲解其区别。
解决方案:
我经过反复测试,发现滚动轴滚到底部的时候,会触发body的滑动,那么我就在事件滚到底部的时候对表层的div做一个touchmove的阻止。到达滚动轴底部,向下滑动,阻止事件,向上滑动,开启事件。为此就要判断touchmove的方向了。

$("body").on("touchstart", function(e) {
 e.preventDefault();
 startX = e.originalEvent.changedTouches[0].pageX,
 startY = e.originalEvent.changedTouches[0].pageY;
});
$("body").on("touchmove", function(e) {
 e.preventDefault();
 moveEndX = e.originalEvent.changedTouches[0].pageX,
 moveEndY = e.originalEvent.changedTouches[0].pageY,
 X = moveEndX - startX,
 Y = moveEndY - startY;

 if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {
  alert("left 2 right");
 }
 else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {
  alert("right 2 left");
 }
 else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {
  alert("top 2 bottom");
 }
 else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {
  alert("bottom 2 top");
 }
 else{
  alert("just touch");
 }
});

上面的方法是判断touchmove的滑动方向。

  

$('#haorooms底层背景').bind("touchmove", function (e) {
   e.preventDefault();
  });
  $(".滚动的父亲").bind("touchstart", function (events) {
   startY = events.originalEvent.changedTouches[0].pageY;
  });
  $(".滚动的父亲 ul").bind("touchmove", function (e) {
   var ulheight = $(this).height();
   var scrollTop = $(this).scrollTop();
   var scrollheight = $(this)[0].scrollHeight;
   if (ulheight + scrollTop + 20 >= scrollheight) { //滚到底部20px左右
    $(".滚动的父亲").bind("touchmove", function (event) {
     moveEndY = event.originalEvent.changedTouches[0].pageY,
       theY = moveEndY - startY;
     if (theY > 0) { //用上面的abs()更加准确!
      $(".滚动的父亲").unbind("touchmove");
     }
     if (theY < 0) {
      event.preventDefault();
     }
    })
   }
   if (scrollTop < 20) {//滚到顶部20px左右
    $(".滚动的父亲").bind("touchmove", function (event) {
     moveEndY = event.originalEvent.changedTouches[0].pageY,
       theY = moveEndY - startY;
     if (theY > 0) {
      event.preventDefault();
     }
     if (theY < 0) {
      $(".滚动的父亲").unbind("touchmove");
     }
    })
   }
  });
Javascript 相关文章推荐
你的编程语言可以这样做吗?
Sep 07 Javascript
Javascript 事件流和事件绑定
Jul 16 Javascript
Jquery 的扩展方法总结
Oct 01 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 Javascript
Javascript中的arguments与重载介绍
Mar 15 Javascript
基于javascript实现样式清新图片轮播特效
Mar 30 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
浅谈AngularJS中ng-class的使用方法
Nov 11 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
JS插件clipboard.js实现一键复制粘贴功能
Dec 04 Javascript
通过图带你深入了解vue的响应式原理
Jun 21 Javascript
js代码编写无缝轮播图
Sep 13 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
May 30 #Javascript
使用jQuery判断浏览器滚动条位置的方法
May 30 #Javascript
JS检测移动端横竖屏的代码
May 30 #Javascript
BootStrap中Tab页签切换实例代码
May 30 #Javascript
js小数计算小数点后显示多位小数的实现方法
May 30 #Javascript
拥Bootstrap入怀——导航栏篇
May 30 #Javascript
基于Bootstrap实现tab标签切换效果
Apr 15 #Javascript
You might like
php实现建立多层级目录的方法
2014/07/19 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
python保存数据到本地文件的方法
2018/06/23 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
Python数据库小程序源代码
2019/09/15 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
通用C#笔试题附答案
2016/11/26 面试题
汽车专业毕业生推荐信
2013/11/12 职场文书
翻译专业应届生求职信
2013/11/23 职场文书
给海归自荐信的建议
2013/12/13 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
初中差生评语
2014/12/29 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL