使用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 相关文章推荐
javascript数组组合成字符串的脚本
Jan 06 Javascript
jquery validate 自定义验证方法介绍 日期验证
Feb 27 Javascript
你可能不知道的JavaScript的new Function()方法
Apr 17 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
May 12 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
May 10 Javascript
全面解析bootstrap格子布局
May 22 Javascript
JavaScript设计模式之单体模式全面解析
Sep 09 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
Vue.js框架路由使用方法实例详解
Aug 25 Javascript
对 Vue-Router 进行单元测试的方法
Nov 05 Javascript
js 计算月/周的第一天和最后一天代码
Feb 01 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 urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
MySQL 日期时间函数常用总结
2012/06/12 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
学校门卫岗位职责
2014/03/16 职场文书
应届生自荐信
2014/06/30 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL
Python中文纠错的简单实现
2021/07/07 Python
MYSQL如何查看进程和kill进程
2022/03/13 MySQL