在开发过程中程序员总会碰到产品经理提出的各种稀奇古怪的需求,尽管有些需求很奇葩,但不得不说有些须有还是能指引我们不断的学习与进步,最近在工作中就碰到这种问题。需求是要求在各主流浏览器上使用自定义的滚动条样式,并且达到完美兼容,此篇博客记录自己的分析过程。此篇博客的源码可访问slimscroll

为了能使用自定义的滚动条样式并且能在各主流浏览器上兼容,首先想到的就是css定制滚动条的样式。于是在网上搜索了下发现确实有这样的css样式存在:

ul::-webkit-scrollbar/*滚动条整体部分,其中的属性有width,height,background,border(就和一个块级元素一样)等。*/
ul::-webkit-scrollbar-button /*滚动条两端的按钮。可以用display:none让其不显示,也可以添加背景图片,颜色改变显示效果。*/
ul::-webkit-scrollbar-track /* 外层轨道。可以用display:none让其不显示,也可以添加背景图片,颜色改变显示效果。*/
ul::-webkit-scrollbar-track-piece /*内层轨道,滚动条中间部分(除去)。*/
ul::-webkit-scrollbar-thumb  /*滚动条里面可以拖动的那部分*/
ul::-webkit-scrollbar-corner  /* 边角*/
ul::-webkit-resizer /*定义右下角拖动块的样式*/

这里只是初略的介绍下,具体的使用方法可参考这篇博客自定义浏览器滚动条的样式,打造属于你的滚动条风格
这种方法确实可以定制滚动条样式,但是仅仅是在webkit内核浏览器有效,不能达到完美兼容。上面的博客中推荐一种jquery插件来解决这个问题,但是介绍的并不全面,也不好使用。于是我在网上搜索了下发现类似的jquery插件有很多,为了更贴近项目需要我选择了jquery.slimscroll.js. 可是在实际使用的过程中发现该插件不支持滚动的内容翻页,一旦翻页追加新内容,因为内容高度的变化导致存在滚动内容跳跃的情况。

重现问题

看实际效果请猛击这里demo1
从该插件的github上下载源码,并引入到页面中,为了看到效果请打开调试面板,我设置了在内容滚动时输出其scrollTop值,根据输出的结果我们可以很明显的看到在追加新内容后,内容会有跳跃的情况

scrollTop 49
scrollTop 51
scrollTop 105   //内容向上跳跃了
scrollTop 108

打开源码分析原因

源码中的以下这段是在拖动滚动条时要触发的函数

// make it draggable and no longer dependent on the jqueryUI
if (o.railDraggable){ //默认设置为truebar.bind("mousedown", function(e) {var $doc = $(document);isDragg = true;t = parseFloat(bar.css('top'));pageY = e.pageY;$doc.bind("mousemove.slimscroll", function(e){currTop = t + e.pageY - pageY;bar.css('top', currTop);scrollContent(0, bar.position().top, false);// scroll content});$doc.bind("mouseup.slimscroll", function(e) {isDragg = false;hideBar();$doc.unbind('.slimscroll');});return false;}).bind("selectstart.slimscroll", function(e){e.stopPropagation();e.preventDefault();return false;});
}

翻页追加新内容的时候,我们需要重新初始化该插件,初始化的过程中会重新计算滚动条的top值,下拉翻页时由于鼠标一直是按下的状态,在追加新内容后t值和pageY值记录的一直是按下状态时刻(未追加新内容时刻)的。所以当追加完新内容后,再触发mousemove事件时,currTop又会被计算得到翻页之前的值(滚动条的top值也是之前的值了),而此时的内容高度已经变化了,所以内容会跳跃。(不知道有没有解释清楚啊)

针对问题的解决之道

通过上面的分析我们知道由于在翻页追加新内容后未获取到最新的滚动条的top值和最新的e.pageY值,针对这个问题我在源码中添加了以下一些代码:

// scroll content by the given offset
scrollContent(offset, false, true);// 以下是我添加的内容
//追加新内容后强制解绑之前的鼠标事件,不使用翻页之前记录的值
$(document).unbind('mousemove.slimscroll');
//解绑后为了能继续下拉滚动条,需重新绑定鼠标事件
//记录最新的滚动条的top值和鼠标位置
var pageY, t = parseFloat(bar.css('top'));
$(document).bind("mousemove.slimscroll", function(e) {//这里判断鼠标状态是为了区分滚动事件和拖动事件//当鼠标左键是按下状态时,if (e.buttons == 1) {pageY = pageY || e.pageYcurrTop = t + e.pageY - pageY;bar.css('top', currTop);scrollContent(0, currTop, false); // scroll content}return;
})

以上代码解决翻页追加新内容后,拖动滚动条存在的跳跃问题

function _onWheel(e) {//... var e = e || window.event;// 以下是我添加的内容//取消拖动$(document).unbind('mousemove.slimscroll');//...
}

以上这段代码是为了解决翻页滚动后的点击事件被覆盖问题

这里为什么用e.buttons而不用e.button?
MouseEvent.buttons 可指示任意鼠标事件中鼠标的按键情况
MouseEvent.button 只能够表明在事件中通过按下或者放开一个按键,或者是多个按键同时按下时,哪一个按键被按下。因此,它对判断mouseenter, mouseleave, mouseover, mouseout or mousemove这些事件并不可靠。

修改源码之后的效果请猛击这里demo2

这里修改的代码仅仅是我一人之见,如果您有更好的方法,欢迎在评论中提出

参考文献:

MouseEvent.button
MouseEvent.buttons

转载于:https://www.cnblogs.com/jesse131/p/9079285.html

针对模拟滚动条插件(jQuery.slimscroll.js)的修改相关推荐

  1. mysql w3scoll_jQuery滚动条插件 – jquery.slimscroll.js

    jquery.slimscroll.js插件是一个支持把内容放在一个盒子里面,固定一个高度,超出的则使用滚动. jquery.slimscroll.js不仅可以定义高度.宽度,还可以定义位置.滚动条大 ...

  2. 一个很好的滚动条插件jquery.slimscroll.js

    该插件的下载地址: https://codeload.github.com/rochal/jQuery-slimScroll/zip/v1.3.0 安装Set up 首先需要引入jquery 在次需要 ...

  3. jquery个性滚动条插件jquery.mCustomScrollbar.js的使用

    jquery.mCustomScrollbar.js是一款非常漂亮的滚动条样式插件,同过它你可以自由的定制自己喜欢的滚动条. 而且兼容IE6 和IE7等的浏览器 <!DOCTYPE html&g ...

  4. 滚动条插件---jquery.nicescroll.js

    nicescroll 滚动条插件是一个非常强大的基于 jQuery 的滚动条插件,不需要增加额外的css,几乎全浏览器兼容.ie6+,实现只需要一段代码,侵入性非常小,样式可完全自定义,支持触摸事件, ...

  5. jquery.slimscroll.js 插件库的应用

    调用 <script src="js/jquery.slimscroll.js"></script> 滚动条样式设置 $(".text" ...

  6. ajax 批量上传图片插件,jQuery多文件上传插件jquery.imageuploader.js

    插件描述:jQuery多文件上传插件jquery.imageuploader.js,可以同时上传多个文件并支持拖拽上传 jquery.imageuploader.js 一款jquery多文件上传插件. ...

  7. jQuery插件 -- Cookie插件jquery.cookie.js(转)

    2019独角兽企业重金招聘Python工程师标准>>> jQuery插件 -- Cookie插件jquery.cookie.js(转) Cookie是网站设计者放置在客户端的小文本文 ...

  8. jQuery分页插件(jquery.page.js)的使用

    效果描述: 不用分页即可显示的jQuery插件 jQuery分页插件--jQuery.page.js用法很简单,效果很棒 1.前端 首先html的head中引入相关css与js <link re ...

  9. 判断浏览器 插件 jquery.ua.js

    判断浏览器 插件 jquery.ua.js /*!* jquery.ua.js* @link https://github.com/cloudcome/jquery.ua* @author ydr.m ...

最新文章

  1. Python + Selenium 自动发布文章(二):简书
  2. Android 的 ramdisk.img、system.img、userdata.img 作用说明,以及UBoot 系统启动过程
  3. 《操作系统》CPU如何区分正在运行的是内核程序or应用程序?
  4. ListT please check srcIndex
  5. python可变对象与不可变对象_python 可变对象与不可变对象
  6. Flutter 之 StatefulWidget和StatelessWidget
  7. php如何写代码禁用广告,不再显示广告案例(php操作cookie)
  8. 只有程序员能看懂的十个笑话 2014-08-05 16:07 54人阅读 评论(0) 收藏...
  9. 线性代数学习笔记——第三十三讲——向量混合积的几何意义
  10. vue实现文件下载功能
  11. Insecure CAPTCHA(不安全的验证码)
  12. Vue基础知识总结 11:前端路由vue-router
  13. 数据库安装、数据导入及格式转换20200514
  14. ptb同一屏呈现两张图片matlab,PTB诊断心电数据库中的原始ECG信号的特征提取
  15. boot bios傻傻分不清
  16. excel自动计算体育成绩
  17. Houdini学习笔记——【案例二】消散文字制作
  18. 逆战班-----javascript实现放大镜效果
  19. GMF 所依赖的插件
  20. C语言-全局变量与局部变量

热门文章

  1. 重操JS旧业第五弹:函数
  2. sysbench相关
  3. 安装和运行Maven
  4. Android ——SoundPool播放音频
  5. Windows Vista for Developers——第二部分:深入分析任务对话框
  6. (4.28)for xml path 在合并拆分上的作用演示
  7. 分支-13. 计算天数
  8. Oracle ROLLUP和CUBE 用法
  9. GridView自动序号
  10. JavaScript doT模板引擎