利用CSS3新特性实现完全兼容的自定义滚动条。
背景:最近项目里面因为统一页面风格,用到了自定义滚动条,在完成之前的那个滚动条的时候,与网上各个滚动条插件实现的方法类似,相当于造了轮子,通过css3的
网上看到的滚动条插件多数是通过监听内容的滚动事件,由于原生js的滚动事件存在一些bug,所以实际上用jQuery的mousewheel.js插件的比较多,自己做的滚动条也是引用了该插件。
首先说一说自定义滚动条实现的普遍步骤和方法:
背景: A需要滚动。
1.给A添加一个父级S包裹,并将B进行绝对或相对定位(这点根据S的定位,目的是为了保持原有布局)。
2.在S中生成A的兄弟节点B,B作为滚动条的容器,然后在B中生成滚动条bar,bar的高度通过容器S高度和A实际高度得出。
3.监听S的滚动事件,并在滚动事件中对A、bar进行top设置(横向滚动原理相同),这一点实现了自定义滚动条随内容滚动而位移。
4.监听滚动条bar的拖动事件,原理是监听bar的父级B的mouseDown和mouseUp事件,在鼠标按下的时候计算鼠标位移的距离,然后对应的修改A的top和bar的top。
以上就是普遍自定义滚动条的实现原理,在第3、4步中,需要设计算法保证正常的运行。
自己在写滚动条的时候,写到第4步就有了新的想法:省去第4步,滚动还是用浏览器自带的滚动条,样式自定义。这样做的好处有以下几点:
1.拥抱原生,减少代码,也减少了计算过程中容易导致的bug。
2.浏览器的滚动条功能已经完善,而自定义滚动条目的只是修改样式。
3.不必考虑兼容性。
上图为大致结构:A是内容部分,B是原生滚动条,C是自定义滚动条,C遮挡住B。
使用上面的步骤1、2、3我们可以实现滚动A时C随动的视觉效果,但是如何让C和B具有相同的功能,也就是如何让C控制A呢?还是看图
这是实现的效果图,这个想法能够实现得益于CSS3的新样式: pointer-events
pointer-events:auto | none | visiblepainted | visiblefill | visiblestroke | visible | painted | fill | stroke | all
默认值为auto,但是除了 auto 和 none,其它值只能用于svg上。
通过对C设置pointer-events:none样式后,C就可以不响应各种事件,并且不会阻止冒泡,相当于在用户眼睛蒙了一层C,用户实际操纵的是B,也就是使用的原生的滚动条。
我已经把滚动条封装在jQuery对象中,在使用的时候只需要引用该方法 $.lon_creatscroll(a,b,c) 并且指定内容部分和父级容器和滚动条颜色。
下面就是上图两个容器滚动条的实现代码。
源码中有更详细的实现步骤和注释,需要的可以访问 我的GitHub
利用CSS3新特性实现完全兼容的自定义滚动条。的更多相关文章
- css css3新特性
css css3新特性 一.css3是什么? 我不喜欢把已有的概念从一个地方抄到另一个地方,还是喜欢如下方式. 参考百度百科: http://baike.baidu.com/link?url=z2V ...
- HTML5和CSS3新特性
1.HTML5新标签和属性 1.1 兼容性前缀与语义化 兼容低版本的写法.比较新的浏览器,可以直接写.兼容性前缀,是每个浏览器私有的. 内核 兼容性前缀 浏览器 Gecko -moz- Firefox ...
- CSS3新特性(阴影、动画、渐变、变形、伪元素等)
CSS3与页面布局学习总结(六)--CSS3新特性(阴影.动画.渐变.变形.伪元素等) 目录 一.阴影 1.1.文字阴影 1.2.盒子阴影 二.背景 2.1.背景图像尺寸 2.2.背景图像显示的原 ...
- H5 和 CSS3 新特性
博客地址:https://ainyi.com/52 H5 新特性 语义化标签:header.footer.section.nav.aside.article 增强型表单:input 的多个 type ...
- css3新特性总结
一.什么是css3 css用于控制网页的样式和布局,css3是css的升级版本,受浏览器限制,跨浏览器开发有点复杂.css3完全向后兼容 二.css3新特性 1.边框 css3的边框有如下属性: (1 ...
- 01-移动端开发教程-CSS3新特性
1. 移动端开发课程概述 移动互联网的兴起,让移动端的开发迅速蹿红.对于前端开发者来说,移动端的开发已经占据了他们大部分工作时间.接下来老马带大家一起学习移动端开发的相关前端开发技术. 这边课程内容包 ...
- [转]深入了解 CSS3 新特性
简介 CSS 即层叠样式表(Cascading Stylesheet).Web 开发中采用 CSS 技术,可以有效地控制页面的布局.字体.颜色.背景和其它效果.只需要一些简单的修改,就可以改变网页的外 ...
- 新特性AAtitti css3 新特性attilax总结titti css
Atitti css3 新特性attilax总结 图片发光效果2 透明渐变效果2 文字描边2 背景拉伸2 CSS3 选择器(Selector)4 @Font-face 特性7 Word-wrap &a ...
- Atitti css3 新特性attilax总结
Atitti css3 新特性attilax总结 图片发光效果2 透明渐变效果2 文字描边2 背景拉伸2 CSS3 选择器(Selector)4 @Font-face 特性7 Word-wrap &a ...
随机推荐
- web 直播&即时聊天------阿里云、融云
随着直播越来越火,所在公司也打算制作自己的直播,所以去了解了这方面,使用后发现还是有些问题需要记录的. 经过分析,制作直播应该是分为两块来做,即直播与实时评论.这里先去制作实时评论,等直播ok后,也会 ...
- 高性能mysql(二)——mysql的存储引擎
在文件系统中,mysql将每个数据库保存为数据目录下的一个子目录.创建表时,mysql会在子目录下创建一个和表同名的.frm文件保存表的定义.例如创建一个名为mytable的表,mysql会在myta ...
- linux centos7.0安装subversion
安装环境以及软件版本如下: subversion使用1.8.17版本,CentOS7.0(64位) 安装svn共需要使用如下软件,apr-1.5.2.tar.gz.apr-util-1.5.4.tar ...
- NodeJs的包漏洞扫描与漏洞测试攻击
一个典型的Node应用可能会有几百个,甚至上千个包依赖(大部分的依赖是间接的,即下载一个包,这个包会依赖其他的好多包),所以最终的结果是,应用程序就会像是这个样子的:
- web聊天室总结
前言: 最近在写一个聊天室的项目,前端写了挺多的JS(function),导致有点懵比,出了BUG,也迟迟找不到.所以昨天把写过的代码总结了一下,写成博客. 项目背景 参考博客: http://www ...
- Extending sparklyr to Compute Cost for K-means on YARN Cluster with Spark ML Library
Machine and statistical learning wizards are becoming more eager to perform analysis with Spark MLli ...
- 详解C# Tuple VS ValueTuple(元组类 VS 值元组)
C# 7.0已经出来一段时间了,大家都知道新特性里面有个对元组的优化,并且网上也有大量的介绍,这里利用详尽的例子详解Tuple VS ValueTuple(元组类VS值元组),10分钟让你更了解Val ...
- 用NIO实现http协议
先来看一下本篇博文的目录: 一:简介Nio 二:Nio的好处 三:关于http协议 四:代码实现 五:总结 一:简介Nio 我们都知道io流,那么NIO是什么呢?本篇博文将会带你一探NIO,NIO的全 ...
- Scrapy的debug方式
Scrapy不方便调试,但是为了深入学习框架内部的一些原理,有时候仅仅依靠日志是不够的.下面提供一种scrapy的debug方式 demo直接用来自官方例子来演示:https://github.com ...
- socket获取百度页面
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...