使用jQuery判断浏览器滚动条位置的方法


Posted in Javascript onMay 30, 2016

项目背景

webtouch(webapp)页面,防苹果手机safari浏览器,网上滑动,底部导航消失,滑动到底部又出现。向下滑动,底部导航出现。

遇到问题

1、我一开始用swipeup和swipedown来做,发现因为有滚动条,不会触发。因此只能判断滚动条是上滚下滚等。关于手机手势,后面的文章会介绍,欢迎关注!

2、通过上滚下滚来让底部导航显示或者因此,安卓上面的浏览器都可以,但是苹果safari会一闪一闪,原因是苹果safari自动有个弹跳效果,导致事件重复执行,解决办法是给上滚下滚一个距离,滚动到一定距离后返回是上滚还是下滚。

单纯判断滚动条方向

function scroll( fn ) {
  var beforeScrollTop = document.body.scrollTop,
    fn = fn || function() {};
  window.addEventListener("scroll", function() {
    var afterScrollTop = document.body.scrollTop,
      delta = afterScrollTop - beforeScrollTop;
    if( delta === 0 ) return false;
    fn( delta > 0 ? "down" : "up" );
    beforeScrollTop = afterScrollTop;
  }, false);
}

调用方法:

scroll(function(direction) { console.log(direction) });

以上方法手机苹果浏览器事件会跳动,解决方法及代码改进

scrollDirect: function (fn) {
  var beforeScrollTop = document.body.scrollTop;
  fn = fn || function () {
  };
  window.addEventListener("scroll", function (event) {
    event = event || window.event;

    var afterScrollTop = document.body.scrollTop;
    delta = afterScrollTop - beforeScrollTop;
    beforeScrollTop = afterScrollTop;

    var scrollTop = $(this).scrollTop();
    var scrollHeight = $(document).height();
    var windowHeight = $(this).height();
    if (scrollTop + windowHeight > scrollHeight - 10) { //滚动到底部执行事件
      fn('up');
      return;
    }
    if (afterScrollTop < 10 || afterScrollTop > $(document.body).height - 10) {
      fn('up');
    } else {
      if (Math.abs(delta) < 10) {
        return false;
      }
      fn(delta > 0 ? "down" : "up");
    }
  }, false);
}

调用方法:

var upflag=1;
  var downflag= 1;
  //scroll滑动,上滑和下滑只执行一次!
scrollDirect(function (direction) {
    if (direction == "down") {
      if (downflag) {
        $(".footer_wrap").slideUp(200);
        downflag = 0;
        upflag = 1;
      }
    }
    if (direction == "up") {
      if (upflag) {
        $(".footer_wrap").slideDown(200);
        downflag = 1;
        upflag = 0;
      }
    }
 });

滚动条滚动到底部和头部判断

其实我上面的函数中已经有判断,下面再列一下!看如下函数!

BottomJumpPage: function () {
      var scrollTop = $(this).scrollTop();
      var scrollHeight = $(document).height();
      var windowHeight = $(this).height();
      if (scrollTop + windowHeight == scrollHeight) { //滚动到底部执行事件
          console.dir("我到底部了");

      }
      if (scrollTop == 0) { //滚动到头部部执行事件
      console.dir("我到头部了");

      }
 }

调用方法:

$(window).scroll(BottomJumpPage);

判断div是否滚动到底部

上面的方法是判断滚动轴是否滚动到底部,但是有时候,我们在做滚动加载的时候,有时候也要做某个div是否滚动到底部然后加载。那么如何判断DIV的滚动轴滚动到底部呢?

这个也需要了解几个高度:

1、div的高度 $("#某div").height();
2、滚动轴的高度 $(#某div)[0].scrollHeight
3、滚动轴到div顶部的高度 $(某div)[0].scrollTop;
书写代码如下:

$(document).ready(function (){
    var nScrollHight = 0; //滚动距离总长(注意不是滚动条的长度)
    var nScrollTop = 0;  //滚动到的当前位置
    var nDivHight = $("#div1").height();
    $("#div1").scroll(function(){
     nScrollHight = $(this)[0].scrollHeight;
     nScrollTop = $(this)[0].scrollTop;
     if(nScrollTop + nDivHight >= nScrollHight)
      alert("滚动条到底部了");
     });
});

PS:jQuery滚动条位置控制:

将div的滚动条滚动到其子元素所在的位置,方便自动定位。

var container = $('div'), 

scrollTo = $('#row_8');


container.scrollTop( 

scrollTo.offset().top - container.offset().top + container.scrollTop() 

);


// Or you can animate the scrolling: 

container.animate({ 

scrollTop: scrollTo.offset().top - container.offset().top + container.scrollTop() 

});?

 

Javascript 相关文章推荐
dojo 之基础篇(二)之从服务器读取数据
Mar 24 Javascript
Jquery解析Json格式数据过程代码
Oct 17 Javascript
JS实现从表格中动态删除指定行的方法
Mar 31 Javascript
JavaScript实现的字符串replaceAll函数代码分享
Apr 02 Javascript
JavaScript获得表单target属性的方法
Apr 02 Javascript
使用JavaScript实现旋转的彩圈特效
Jun 23 Javascript
Vue单文件组件基础模板小结
Aug 10 Javascript
Vue Router去掉url中默认的锚点#
Aug 01 Javascript
vue中实现上传文件给后台实例详解
Aug 22 Javascript
JavaScript使用localStorage存储数据
Sep 25 Javascript
jQuery实现计算器功能
Oct 19 jQuery
JavaScript实现瀑布流布局的3种方式
Dec 27 Javascript
JS检测移动端横竖屏的代码
May 30 #Javascript
BootStrap中Tab页签切换实例代码
May 30 #Javascript
js小数计算小数点后显示多位小数的实现方法
May 30 #Javascript
拥Bootstrap入怀——导航栏篇
May 30 #Javascript
基于Bootstrap实现tab标签切换效果
Apr 15 #Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
May 30 #Javascript
Bootstrap编写导航栏和登陆框
May 30 #Javascript
You might like
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
深入extjs与php参数交互的详解
2013/06/25 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
理解Javascript闭包
2013/11/01 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
简单实现jQuery弹窗效果
2017/10/30 jQuery
javascript实现文件拖拽事件
2018/03/29 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
在Django框架中设置语言偏好的教程
2015/07/27 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
python 类详解及简单实例
2017/03/24 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
Python 学习教程之networkx
2019/04/15 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
Python如何截图保存的三种方法(小结)
2020/09/01 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
请说出你所知道的线程同步的方法
2013/04/19 面试题
酒店总经理欢迎词
2014/01/15 职场文书
企业挂职心得体会
2014/09/10 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
环卫工人慰问信
2015/02/15 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js