最近写组件库的时后,发现这个滚动条是真的丑啊,决定重新撸一个滚动条:

首先咱们回顾一下移动端浏览器滚动条特性:

  • 滚动条在开始滚动时渐显,滚动结束后渐隐
  • 滚动条不占内容区宽度,悬浮固定
  • 滚动条高度(深灰)和滚动区可视高度(浅灰)比等于滚动区可视高度和滚动目标的高度
  • 当滚动目标的高度小于滚动区可视高度的时候,滚动条不显示,并且无法滚动
  • 只有在滚动滚动目标时,才能触发滚动
  • 当滚动条顶部触顶和底部触底的时候,不能继续滚动
  • 只有在滚动大于一个固定值时,才被视为滚动开始
  • 根据滚动的差值,计算是向上滚动还是向下滚动
  • 滚动条是动态生成的

好啦,接下来咱们开始一步一步实现,需要哪些知识点:

  • 渐隐渐显

```

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核心代码]的更多相关文章

  1. 移动端布局 + iscroll.js

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  2. H5页面基于iScroll.js插件实现下拉刷新,上拉加载更多

    前言 在我之前的项目中,页面总是干巴巴的,用户的体验不是特别完美,我也是一直觉得把设计师给到的psd做出来就好,很少考虑用户的感受.我喜欢看不同的App,操作每个步骤,观赏每个能和我互动的交互设计效果 ...

  3. jquery——移动端滚动条插件iScroll.js

    官网:http://cubiq.org/iscroll-5 demo: 滚动刷新:http://cubiq.org/dropbox/iscroll4/examples/pull-to-refresh/ ...

  4. 关于使用Iscroll.js异步加载数据后不能滑动到最底端的问题解决方案

    关于使用Iscroll.js异步加载数据后不能滑动到最底端,拉到最下边又弹回去的问题困扰了我老半天,相信很多朋友都遇到了.我刚好不小心解决了,和大家分享一下.由于各种忙,下边就直接上代码吧. (前提是 ...

  5. 阻止pc端浏览器缩放js代码

    阻止pc端浏览器缩放js代码 众所周知:移动端页面禁止用户缩放界面只需加上<meta name="viewport" content="user-scalable= ...

  6. zepto.js + iscroll.js上拉加载 下拉加载的 移动端 新闻列表页面

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  7. diy 滚动条 样式 ---- 核心代码

    参考自 : https://blog.csdn.net/qq_38881495/article/details/83689721 .chapter_data position relative wid ...

  8. Ajax (Asynchronous javascript xml) 搜索框核心代码(JQuery) Ajax判断用户名存在核心代码 附:原生js的Ajax代码 其中有json的一句话解释

    前端 <script type="text/javascript"> $(function(){ $("#tid").keyup(function( ...

  9. 移动端下拉刷新,iScroll.js用法(转载)

    本文转载自: iScroll.js 用法参考 (share)

随机推荐

  1. UE4添加模块

    添加模块在这篇文章里已经有详细的描述了: https://orfeasel.com/creating-custom-modules/ 但是这篇文章中少写了一个步骤: 最后要在 <工程名>E ...

  2. ubuntu开启ssh服务时,报:start:Unknown job : ssh

    这里是参考网站资料,并记录下. 如图所示: 解决方法: 输入以下命令即可 /usr/sbin/sshd mkdir /var/run/sshd /usr/sbin/sshd netstat -nlt ...

  3. python学习之路(13)

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, ...

  4. 将Bean转换为Json形式的一个工具类

    这边遇到一个问题:  1.做一个bean类,实现一个函数,能够把bean生成json字符串.按字段作为key,字段值作为value的方式生成,并且按key的ascii码的升序生成.     2.提示: ...

  5. spring eclipse xml自动提示

    window -> preferences -> XML -> XML Catalog -> 在User Specified Entries新增加一个catalog

  6. 关于虚拟机中Linux系统无法上网之后的解决方案

    我刚刚安装好虚拟机上的Linux的时候,宿主机网络正常,但虚拟机中虽然显示网络连接正常,但无法上网,因此我打开了网络设置 这是默认设置,但上不了网,而按照网上的查找结果,选择NAT是没错的,但仅限于w ...

  7. springboot+aop+自定义注解,打造通用的全局异常处理和参数校验切面(通用版)

    一.引入相应的maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  8. [常用的SQL语句总结]

    1. 创建数据库DataBase create  database  数据库名称; 2. 删除数据库DataBase drop database 数据库名称 drop database 数据库名称1, ...

  9. linux使用df查看硬盘使用率

    df 是来自于coreutils 软件包,系统安装时,就自带的:我们通过这个命令可以查看磁盘的使用情况以及文件系统被挂载的位置: df -lh [root@iZ28u0bdecbZ ~]# df -h ...

  10. C++中内联函数的用法

    程序带调用函数需要一定的时间\空间花销,这就要求在主程序进行过程中调用函数前几下执行指令的地址及其他相关信息,一边函数调用后能继续执行.函数调用后流程返回先前记下的地址处,并根据记录的相关信息回复,而 ...