移动端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 存在陷阱 删除某一区域所有节点
May 10 Javascript
IE8下关于querySelectorAll()的问题
May 13 Javascript
js借助ActiveXObject实现创建文件
Sep 29 Javascript
javascript与cookie 的问题详解
Nov 11 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
Mar 05 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
Jun 03 Javascript
浅谈javascript中自定义模版
Jan 29 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
node中koa中间件机制详解
Aug 22 Javascript
vue-router history模式下的微信分享小结
Jul 05 Javascript
重学JS 系列:聊聊继承(推荐)
Apr 11 Javascript
JQuery发送ajax请求时中文乱码问题解决
Nov 14 jQuery
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和ACCESS写聊天室(十)
2006/10/09 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
详解node如何让一个端口同时支持https与http
2017/07/04 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
Python入门篇之正则表达式
2014/10/20 Python
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
Python 实现一个简单的web服务器
2021/01/03 Python
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
工商治理实习生的自我评价分享
2014/02/20 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
天坛导游词
2015/02/02 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
离婚案件原告代理词
2015/05/23 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
golang正则之命名分组方式
2021/04/25 Golang