重写移动端滚动条[iScroll.js核心代码]
最近写组件库的时后,发现这个滚动条是真的丑啊,决定重新撸一个滚动条:
首先咱们回顾一下移动端浏览器滚动条特性:
- 滚动条在开始滚动时渐显,滚动结束后渐隐
- 滚动条不占内容区宽度,悬浮固定
- 滚动条高度(深灰)和滚动区可视高度(浅灰)比等于滚动区可视高度和滚动目标的高度
- 当滚动目标的高度小于滚动区可视高度的时候,滚动条不显示,并且无法滚动
- 只有在滚动滚动目标时,才能触发滚动
- 当滚动条顶部触顶和底部触底的时候,不能继续滚动
- 只有在滚动大于一个固定值时,才被视为滚动开始
- 根据滚动的差值,计算是向上滚动还是向下滚动
- 滚动条是动态生成的
好啦,接下来咱们开始一步一步实现,需要哪些知识点:
- 渐隐渐显
```
opacity: 1; transition: opacity 500ms ease-in-out;
opacity: 0; transition: opacity 500ms ease-in-out;
复制代码
<ul><li>悬浮固定</li>
</ul>
position 定位
滚动条宽度width为3px;
复制代码
<ul><li>声明变量</li>
</ul>
var conHeight = contentBox.offsetHeight; //滚动目标的整体高度
var _width = mainBox.clientWidth; //滚动可视区的宽度
var _height = mainBox.clientHeight; //滚动可视区的高度
var _scrollWidth = element.offsetWidth; //滚动条的宽度
var _left = _width - _scrollWidth; //定位滚动条应该距离左边宽度
复制代码
<blockquote>
<p>看到这里是不是有种一目了然的感觉,所以滚动条的宽度就是:<br /><code>var _scrollHeight = parseInt(_height * (_height / conHeight))</code></p>
</blockquote>
<ul><li>当滚动目标的高度小于滚动区可视高度的时候,滚动条不显示,反之则显示,不过透明度为0,哈哈,是不是很贱...</li>
</ul><blockquote>
<p>切记不显示和透明度为0还是不一样的</p>
</blockquote>
if (_scrollHeight >= mainBox.clientHeight) {
element.parentNode.style.display = "none";
} else {
element.parentNode.style.opacity = "0"; //有滚动条的话先将透明度设置为0
}
复制代码
<ul><li>只有在滚动滚动目标时,才能触发滚动</li>
</ul>
//如果滚动的不是目标元素,此处只有触摸的是a时才能滚动,否则直接return;
if (event.changedTouches[0].target.tagName !== 'A') return false;
复制代码
<ul><li>当滚动条顶部触顶和底部触底的时候,不能继续滚动</li>
</ul>
if (elT === '0rem' && this.direction == '1') console.log('到顶了不要再向上滑了');
if (elT === parseInt(elParentH) - parseInt(elH) + 'rem' && this.direction == '0') console.log('到底了不要再往下滑了');
复制代码
<ul><li>只有在滚动大于一个固定值时,才被视为滚动开始</li>
</ul><blockquote>
<p>这里我们暂且设置这个最小移动高度为 minRange = 10;</p>
</blockquote>
<ul><li>
<p>根据滚动的差值,计算是向上滚动还是向下滚动,怎么判断滚动差值呢,好,clientY来了</p>
</li>
<li>
<p>滚动条是动态生成的,这个好办,直接粘代码:</p>
</li>
</ul>
var _scrollBox = doc.createElement('div');
var _scroll = doc.createElement('div');
_scrollBox.appendChild(_scroll);
_scroll.className = className;
mainBox.appendChild(_scrollBox);
复制代码
<p>好了,接下来就是最关键的时候了,怎么去把这些逻辑联动起来呢,这时候HTML5触摸事件就粉墨登场了:touchstart touchmove touchend三剑客 具体怎么使用,大家就自行百度了,下面附上我的项目代码:供各位大神阅览: <a href="https://link.juejin.im?target=https%3A%2F%2Fgithub.com%2FQTFYING%2FExample%2Fblob%2Fmaster%2Fhtml%2Fpopover-scroll.html" rel="nofollow">Github地址</a></p>
<p>有不懂或者有疑问,欢迎大家留言。</p>
重写移动端滚动条[iScroll.js核心代码]的更多相关文章
- 移动端布局 + iscroll.js
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- H5页面基于iScroll.js插件实现下拉刷新,上拉加载更多
前言 在我之前的项目中,页面总是干巴巴的,用户的体验不是特别完美,我也是一直觉得把设计师给到的psd做出来就好,很少考虑用户的感受.我喜欢看不同的App,操作每个步骤,观赏每个能和我互动的交互设计效果 ...
- jquery——移动端滚动条插件iScroll.js
官网:http://cubiq.org/iscroll-5 demo: 滚动刷新:http://cubiq.org/dropbox/iscroll4/examples/pull-to-refresh/ ...
- 关于使用Iscroll.js异步加载数据后不能滑动到最底端的问题解决方案
关于使用Iscroll.js异步加载数据后不能滑动到最底端,拉到最下边又弹回去的问题困扰了我老半天,相信很多朋友都遇到了.我刚好不小心解决了,和大家分享一下.由于各种忙,下边就直接上代码吧. (前提是 ...
- 阻止pc端浏览器缩放js代码
阻止pc端浏览器缩放js代码 众所周知:移动端页面禁止用户缩放界面只需加上<meta name="viewport" content="user-scalable= ...
- zepto.js + iscroll.js上拉加载 下拉加载的 移动端 新闻列表页面
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- diy 滚动条 样式 ---- 核心代码
参考自 : https://blog.csdn.net/qq_38881495/article/details/83689721 .chapter_data position relative wid ...
- Ajax (Asynchronous javascript xml) 搜索框核心代码(JQuery) Ajax判断用户名存在核心代码 附:原生js的Ajax代码 其中有json的一句话解释
前端 <script type="text/javascript"> $(function(){ $("#tid").keyup(function( ...
- 移动端下拉刷新,iScroll.js用法(转载)
本文转载自: iScroll.js 用法参考 (share)
随机推荐
- ABI与ARM,X86的概念
Android系统目前支持以下七种不同的CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2 ...
- 第八周课程总结 & 实验报告(六)
第八周课程总结 一.包装类 介绍 装箱与拆箱 应用 二.异常 基本概念 基本格式 异常类的继承结构 throws关键字 throw关键字 Exception类和RuntimeException类 自定 ...
- 十四周学习总结&简易记事本
学习总结: 一.JDBC: 1.JDBC提供里一套与平台无关的标准数据库操作接口和类,只要支持java的数据库厂商,所提供的数据库都可以以使用JDBC操作. 2.JDBC的主要操作类及接口: 3.JD ...
- VS部分安全函数用法
在 VS(Visual Studio)下编译C语言程序,有时候VS会报错,提示用到的一些函数可能不安全,并且建议替换为带有_s后缀的安全函数. 安全函数是什么 scanf().gets().fgets ...
- ES6 变量的结构赋值用途(实用技巧)
1.交换变量的值 let x=1; let y=2; [x,y]=[y,x];//x=2,y=1 2.从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或者对象里返回,有了解构 ...
- python开发环境的搭建,以及pycharm的安装
先到python 官网下载python. 下载好了之后,直接运行exe文件,进行安装(在安装程序运行后的第一个form上,点击next的时候,在next的左侧有一排文字和一个复选框,那个是添加环境变量 ...
- JAVA-Runnable、Callable、FutureTask
通常,创建线程的执行单元有两种,一种是直接继承 Thread,另外一种就是实现 Runnable 接口. 但这两种都有一个问题就是无法有返回值,且子线程在执行过程中无法抛出异常.想线程有返回值,可以使 ...
- java 深入HashMap
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- 1.4 Navicat Mybatis 占坑
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...
- 微信小程序中的不同场景,不同的判断,请求的时机
本来5月1之前就想写一下一篇关于小程序不同场景下发送ajax请求的问题,但是放假的前一天,出了个大bug,就是因为我修改不同的场景下执行不同的逻辑造成的 1.首先,在小程序里,微信做了很多的缓存,我们 ...