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

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

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

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

  • 渐隐渐显

```

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. JavaWeb_使用dom4j解析、生成XML文件

    dom4j 官网 xml解析DOM文档对象模型(树形结构) DOM方式解析:把xml文档加载到内存形成树形结构,可以进行增删改的操作 Learn   使用dom4j解析文件"NewFile. ...

  2. R_Studio(学生成绩)使用cbind()函数对多个学期成绩进行集成

    “Gary1.csv”.“Gary2.csv”.“Gary3.csv”中保存了一个班级学生三个学期的成绩 对三个学期中的成绩数据进行集成并重新计算综合成绩和排名,并按排名顺序排布(学号9位数11130 ...

  3. JIRA7.13版本创建项目:字段和界面(三)

    这是我从网上找的资料和最新版的相差不大,可以借鉴原文链接:http://ju.outofmemory.cn/entry/367224 项目的版本号取决于修复版本,不是影响版本 字段 我们已经知道如何在 ...

  4. 隐藏表单域、URL重写、cookie、session

    隐藏表单域: 隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的.当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上. 代码格式:<input t ...

  5. JavaBean,EJB,POJO,Spring Bean 的演进历程

    JavaBean Sun公司对类提出的规范:1,类是public的2,有一个无参构造方法3,属性修饰要用private,通过get set操作4,实现Serializable接口5,对事件使用Swin ...

  6. spring-boot:run启动时,如何带设置环境参数dev,test.

    这边在linux 启动springboot的jar包时候,多次报错 最终使用 java -jar -Dspring.profiles.active=test demo-0.0.1-SNAPSHOT.j ...

  7. Hibernate与MyBaits的区别?

    (1)Hibernate是全自动,而myBatis是半自动,Hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成SQL.而myBat ...

  8. 网络1911、1912 C语言第1次作业批改总结

    一.评分规则 重点检查大家代码规范,变量名.大括号换行.缩进等发现不规范倒扣3分. 助教会进PTA查看大家代码的提交列表,发现不规范或抄袭,均扣分 每次作业完成后,至少邀请3个同学点评. 原作业地址: ...

  9. IntentService和HandlerThread

    上一篇说了说android 系统的UI更新机制.核心点围绕在Looper的使用上.主线程运行起来后,初始化并运行一个静态Looper,H类(handler子类)处理各种事件. 16ms的UI upda ...

  10. [NLP] 语义网络与知识图谱入门(二)

    语义网络与知识图谱入门(二) OWL 本体声明 owl用owl:Ontology来声明一个本体.rdf:about属性为本体提供一个名称或引用.根据标准,当rdf:about属性的值为"&q ...