移动端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 相关文章推荐
基于jquery的表头固定的若干方法
Jan 27 Javascript
js 判断一个元素是否在页面中存在
Dec 27 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
jQuery实用技巧必备(中)
Nov 03 Javascript
简单的js计算器实现
Oct 26 Javascript
JS实现批量上传文件并显示进度功能
Jun 27 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
Jul 28 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
Dec 01 Javascript
浅谈vue-router 路由传参的方法
Dec 27 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 Javascript
js实现贪吃蛇小游戏(加墙)
Jul 31 Javascript
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
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 MYSQL中插入当前时间
2008/04/06 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
PHP中的命名空间详细介绍
2015/07/02 PHP
多个iframe自动调整大小的问题
2006/09/18 Javascript
一个js实现的所谓的滑动门
2007/05/23 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
bootstrap使用validate实现简单校验功能
2016/12/02 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
python 图片验证码代码
2008/12/07 Python
Python编程之属性和方法实例详解
2015/05/19 Python
浅谈Python中的闭包
2015/07/08 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
django框架模板语言使用方法详解
2019/07/18 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
餐饮主管岗位职责
2013/12/10 职场文书
支部鉴定材料
2014/06/02 职场文书
旷课检讨书范文
2015/01/27 职场文书
三八妇女节寄语
2015/02/27 职场文书
学籍证明模板
2015/06/18 职场文书
win10下go mod配置方式
2021/04/25 Golang
python基于tkinter制作下班倒计时工具
2021/04/28 Python