原生JS实现滚动条使用说明_滚动指南教程

求滚动条的高度可视内容区的高度 / 内容区的实际高度 = 滚动条的高度 / 滑道的高度求内容区top的值内容区距离顶部的距离 / (内容区的实际高度 – 可视内容区域的高度 ) = 滚动条距离顶部的距离 / ( 滑道的高度 – 滚动条的高度)使用onmousewheel做好兼容处理document.onmousewheel = function (e){//

原生JS实现滚动条使用说明

求滚动条的高度

可视内容区的高度 / 内容区的实际高度 = 滚动条的高度 / 滑道的高度

原生JS实现滚动条使用说明_滚动指南教程

求内容区top的值

内容区距离顶部的距离 / (内容区的实际高度 – 可视内容区域的高度 ) = 滚动条距离顶部的距离 / ( 滑道的高度 – 滚动条的高度)

使用onmousewheel做好兼容处理

document.onmousewheel = function (e){
    //    e.wheelDelta < 0 //(-120)  向下
    //    e.wheelDelta > 0 //(120)  向上
    }
//兼容  Firefox 
document.addEventListener('DOMMouseScroll',function (e) {
        // e.detail > 0  //(3)  滑轮向下滚动
        // e.detail < 0  //(-3)  滑轮向上滚动
    },false)

滚动条的运动方向跟内容区的运动方向相反

举个例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>滚动条</title>
    <style>
    *{
        padding: 0;
        margin: 0;
    }
    html,body{
        width: 100%;
        height: 100%;
    }
    .wrapper{
        position: absolute;
        left: 50%;
        top:50%;
        transform: translate(-50%,-50%);
        width: 800px;
        height: 700px;
        border: 1px solid #000;
    }
    .view_box{
        position: absolute;
        left: 100px;
        top:50%;
        transform: translateY(-50%);
        width:600px;
        height: 500px;
        background-color: rgba(25, 25, 25,.7);
        overflow: hidden;
    }
    .content{
        position: absolute;
        top: 0;
        width: 100%;
        background-color: #abcdef;
        transition: all 0.016s linear;

    }
    .content div{
        height: 100px;
        background-color: #f40;
    }
    .bar_box{
        position: absolute;
        right: 90px;
        top:50%;
        transform: translateY(-50%);
        height: 500px;
        width: 4px;
        border-radius: 2px;
        background-color: rgba(25, 25, 25,.7);
        overflow: hidden;
    }
    .bar{
        position: absolute;
        top:0;
        height: 20px;
        width: 100%;
        border-radius:2px; 
        background-color: rgb(197, 179, 179);
        transition: all 0.016s linear;
    }
    </style>
</head>
<body>
    <div class="wrapper">
        <div class="view_box">
            <div class="content">
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
               <div>这是内容</div>
            </div>
        </div>
        <div class="bar_box">
            <div class="bar"></div>
        </div>
    </div>

    <script>
        
        var wrapper = document.getElementsByClassName('wrapper')[0];
        //获取展示内容区的区域
        var view_box = document.getElementsByClassName('view_box')[0];
        //获取展示内容区的区域的大小
        var view_box_height = view_box.offsetHeight;
        //获取内容区
        var content = document.getElementsByClassName('content')[0];
        //获取内容区的实际高度
        var content_height = content.offsetHeight;
        //获取滑道
        var bar_box = document.getElementsByClassName('bar_box')[0];
        //获取滑道的高度
        var bar_box_height = bar_box.offsetHeight;
        //获取滚动条
        var bar = document.getElementsByClassName('bar')[0];
        
        //求 滚动条的高度

        //当展示的内容区的大小刚好展示内容区域时,滚动条的高度就是滑道的高度
        if(view_box_height / content_height < 1) {
            bar.style.height = (view_box_height / content_height) * bar_box_height + 'px';
        } else {
            bar.style.height = bar_box_height + 'px';
        }

        //绑定事件(做兼容处理)
        wrapper.onmousewheel = function (e){
        //    e.wheelDelta < 0 //(-120)  向下
        //    e.wheelDelta > 0 //(120)  向上
        scrollRoll(e);
        }
        //兼容  Firefox 
        wrapper.addEventListener('DOMMouseScroll',function (e) {
            // e.detail > 0  //(3)  滑轮向下滚动
            // e.detail < 0  //(-3)  滑轮向上滚动
            scrollRoll(e);
        },false)


        function scrollRoll (e) {
            e = e || window.event;
            if (e.detail > 0) {
                down();
            } else if (e.detail < 0) {
                up();
            }

            if (e.wheelDelta > 0) {
                up();
            } else if (e.wheelDelta < 0) {
                down();
            }
        }
        //滑轮向下滚动
        function down () {
            var speed = 8;
            if (bar.offsetTop >= bar_box_height - bar.offsetHeight) {
                bar.style.top = bar_box_height - bar.offsetHeight + 'px';
                //注意:内容区应该向上移动
                content.style.top = - (content_height - view_box_height) + 'px';
            } else {
                bar.style.top = bar.offsetTop + speed + 'px';
                content.style.top = - bar.offsetTop / (bar_box_height - bar.offsetHeight) * (content_height - view_box_height) + 'px';
            }
        }
        //滑轮向上滚动
        function up () {
            var speed = 8;
            if (bar.offsetTop <= 0) {
                bar.style.top = 0 + 'px';
                content.style.top = 0 + 'px';
            } else {
                bar.style.top = bar.offsetTop - speed + 'px';
                content.style.top = - bar.offsetTop / (bar_box_height - bar.offsetHeight) * (content_height - view_box_height) + 'px';
            }
        }
   </script>
</body>
</html>
海计划公众号
(0)
上一篇 2020/03/26 23:32
下一篇 2020/03/26 23:32

您可能感兴趣的内容

  • 陌生人社交约会都有什么新鲜App小白基础_约会零基础入门

    社交软件上的小姐姐们,点击下载陌陌 – 约会届的扛把子提到陌生人社交,就不得不提大名鼎鼎的陌陌了。2011年8月上线至今,已有超过2亿用户。陌陌从LBS功能切入,开创陌生人社交的全新模式。然后陌陌发布了陌生人动态和群组功能,誓把陌生人社交进行到底。陌陌在发展历程中也经历了很多曲折,做过很多尝试。从早期的表情商城和会员服务,到接下来的游戏,也尝试过留言板,聊天

    2020/03/24
  • B站自动填弹幕(附带createEvent消息机制)使用攻略_弹幕小白指南

    昨晚看的比赛真的要气死我。RNG 居然又输了。。。为了LPL。。。我写了一个为LPL加油的脚本。希望大家能和我一起为LPL加油!脚本代码如下:var event = document.createEvent(‘Event’);
    event.initEvent(‘input’, true, true);
    function fun123(){$(‘.chat-i

    2020/03/24
  • FromData入门基础ajax提交数据_数据菜鸟教程

    一般想要不刷新页面提交数据时,可以使用ajax提交。如果数据量不大可以自己写json数据用ajax提交到后台服务,但是数据量多且需要动态添加数据时,自己写json格式数据就有点麻烦了,这时候就需要FormData来替我们完成数据的装载了。Html上传视频文件(vue) <input type="file" class="upload uploadfile"

    2020/03/29
  • CSS选择器基础教程伪元素选择器之处理父元素高度及外边距溢出_选择器基础入门

    1. 子元素浮动导致父元素高度不够问题描述:最小高度为100px的父元素,嵌套一个300px高度的子元素,当子元素浮动时,父元素高度并不随之升高。问题视图:期望视图:待解决代码:

    1.

    2020/03/31
  • 常用Vim命令及实用Vim按键映射配置详解小白教程_命令基础知识教程

    Vim按键映射可用于设置Vim命令或命令串的别名,完成个性化Vim按键设置。Vim命令虽然很多,但是常用的Vim命令却被使用者所熟知。通过 Vim 按键映射,可减少按键次数、提供Vim的工作效率。本文介绍15种常用的Vim按键映射配置,并详细分析了对应的Vim命令及功能。更多个性化Vim配置,推荐阅读《 无插件Vim配置及Vim命令介绍 》。1. 打开/关闭

    2020/03/20
  • Dust.js使用教程_一个JavaScript模板引擎

    Dust.js使用教程 官方网址:http://www.dustjs.com/ GitHub:https://github.com/linkedin/dustjs 简介描述:一个J…

    2020/03/06
  • JS判断字符串小括号是否成对合法小白知识_字符串入门知识

    一、思路要判断()是否成对;运用栈的“后进先出“ 的特点,定义一个空数组,作为栈;for循环遍历字符串,当遇到“(”的时候就把“(”添加到空数组最顶端,push方法,记录发现一个左括号;当遇到“)”就把数组中最顶端的元素弹出来,pop方法,抵消一个左括号。注意如果此时数组是空的,但是遇到“)”说明没有“(”缺少成对的“)”,则返回false;不是括号的字符就

    2020/03/31
  • API文档管理工具折射出的技术视野小白指南_api入门基础知识

    什么是技术视野网上看到不少关于如何提升技术视野的讨论,但却没有人给出定义,到底什么是技术视野?所谓技术视野,就是看问题时所能切换的不同角(维)度。下面就以API管理工具(以下简称“管理工具”)为例,来探讨背后隐藏的技术视野。API管理工具零视角曾经在一个小型创业公司用到过最简单的管理工具,就是一个开源的文档管理工具,界面功能类似wiki(维基百科)。这样的工

    2020/03/24
  • ES6 中变量的解构赋值基础知识教程_解构零基础入门

    1. 数组的解构赋值解构: ES6 中允许按照一定的模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构(Destructuring).1. 基本用法本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予相应的值。完全解构let [a, b, c] = [1, 2, 3];
    console.log(a); // 输出1
    let

    2020/03/20
  • 几个数据持久化框架Hibernate、JPA、Mybatis、JOOQ和JDBC Template的比较小白攻略_数据入门知识

    因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template。Hibernate和Mybatis是使用最多的两个主流框架,而JOOQ、Ebean等小众框架则知道的人不多,但也有很多独特的优点;而JPA则是一组Java持久层Api的规范,Spr

    2020/03/31
  • API和SDK的区别入门知识_sdk教程视频

    API1. 定义API(Application Programming Interface, 应用程序编程接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。2. 观点:一个API应对应某个特定的方法,提供实现某个特定的功能,同时在请求

    2020/03/21
  • TensorSpace.js小白攻略_神经网络 3D 可视化框架

    TensorSpace.js小白攻略 官方网址:https://tensorspace.org GitHub:https://github.com/tensorspace-team…

    2020/03/06
  • Snabbt.js小白攻略_一个简约的 JavaScript 动画库

    Snabbt.js小白攻略 官方网址:http://daniel-lundin.github.io/snabbt.js/ GitHub:https://github.com/dan…

    2020/03/06
  • Nodejs核心模块简介使用指南_模块基础入门

    学习nodejs必须要掌握其核心,就像学JavaScript必须掌握函数、对象、数据类型、BOM、DOM等。nodejs核心也不少,这里介绍几个核心:Events模块、fs模块、stream的使用、http模块。Events事件驱动、非阻塞异步IO是nodejs的特点,所以Events是非常重要的模块。并且node中绝大多数模块都继承了Events。事件是发

    2020/03/29
  • 基于max-height实现不定高度元素的折叠/合并,展开/收缩的动画效果使用说明_宽高入门基础知识

    基于实现元素的展开收缩,通常的想法是通过控制display的元素属性和none之间的切换,虽然说功能可以实现,但是这种展开是没有任何动画的效果,只是单纯的显示与隐藏。例外一种方法就是通过JQuery的slideUp()、slideDown()方法,这是jQuery带有的功能属性,大家都应该很清楚,在有些情况下JavaScript框架都是没有动画模块的,比如移

    2020/04/05
  • draw.io菜鸟攻略_web 端的流程图绘制工具

    draw.io菜鸟攻略 官方网址:https://www.draw.io/ GitHub:https://github.com/jgraph/drawio 简介描述:web 端的流…

    2020/03/10