移动端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 相关文章推荐
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
Apr 12 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
Jun 18 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
Jul 31 Javascript
纯JS实现动态时间显示代码
Feb 08 Javascript
js实现刷新iframe的方法汇总
Apr 27 Javascript
JavaScript中的Math.atan2()方法使用详解
Jun 15 Javascript
js时间戳转为日期格式的方法
Dec 28 Javascript
EditPlus中的正则表达式 实战(2)
Dec 15 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
Jul 24 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
Aug 29 Javascript
微信小程序实现tab左右切换效果
Nov 15 Javascript
p5.js码绘“跳动的小正方形”的实现代码
Oct 22 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
SMARTY学习手记
2007/01/04 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
php生成动态验证码gif图片
2015/10/19 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
python中sets模块的用法实例
2014/09/30 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
利用Python开发实现简单的记事本
2016/11/15 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
Python用input输入列表的实例代码
2020/02/07 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
python deque模块简单使用代码实例
2020/03/12 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
类的核心特性有哪些
2014/01/01 面试题
护理学中专毕业生求职信
2013/11/11 职场文书
军训生自我鉴定范文
2013/12/27 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
毕业生对母校寄语
2015/02/26 职场文书
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python