移动端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 相关文章推荐
javascript编程起步(第六课)
Jan 10 Javascript
自写简单JS判断是否已经弹出页面
Oct 20 Javascript
jQuery中:radio选择器用法实例
Jan 03 Javascript
jquery实现表格本地排序的方法
Mar 11 Javascript
JS获取数组最大值、最小值及长度的方法
Nov 24 Javascript
jQuery获取select选中的option的value值实现方法
Aug 29 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
Aug 17 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
微信小程序自定义toast的实现代码
Nov 16 Javascript
BootStrap模态框闪退问题实例代码详解
Dec 10 Javascript
微信小程序简单的canvas裁剪图片功能详解
Jul 12 Javascript
Vue事件处理原理及过程详解
Mar 11 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
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
学习使用PHP数组
2006/10/09 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
PHP代码覆盖率统计详解
2020/07/22 PHP
常见JS验证脚本汇总
2015/12/01 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
2016/08/10 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
js中作用域的实例解析
2017/03/16 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
Angular PWA使用的Demo示例
2019/01/31 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
为python设置socket代理的方法
2015/01/14 Python
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
2018/12/12 Python
给你一面国旗 教你用python画中国国旗
2019/09/24 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
New Era英国官网:美国棒球帽品牌
2018/03/21 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
大学生入党思想汇报
2014/01/01 职场文书
简短证婚人证婚词
2014/01/09 职场文书
中学生自我鉴定
2014/02/04 职场文书
演讲稿格式范文
2014/05/19 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python