移动端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 模式设计之工厂模式学习心得
Apr 27 Javascript
原生js实现shift/ctrl/alt按键的获取
Apr 08 Javascript
javascript中var的重要性分析
Feb 11 Javascript
图解Sublime Text3使用技巧
Dec 21 Javascript
JS中数组重排序方法
Nov 11 Javascript
Vue数据驱动模拟实现4
Jan 12 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
Jan 08 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
Jun 07 Javascript
Vue点击切换颜色的方法
Sep 13 Javascript
基于elementUI实现图片预览组件的示例代码
Mar 31 Javascript
laypage+SpringMVC实现后端分页
Jul 27 Javascript
Vue export import 导入导出的多种方式与区别介绍
Feb 12 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/04/17 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
[01:00:30]TFT vs VGJ.T Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
Python中itertools模块用法详解
2014/09/25 Python
python实现爬取千万淘宝商品的方法
2015/06/30 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
新手学python应该下哪个版本
2020/06/11 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
天游软件面试
2013/11/23 面试题
建筑文秘专业个人求职信范文
2013/12/28 职场文书
心得体会怎么写
2013/12/30 职场文书
加工操作管理制度
2014/01/19 职场文书
《乌塔》教学反思
2014/02/17 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
共产党员承诺书
2014/03/25 职场文书
出售房屋协议书范本
2014/10/06 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS