JS-自定义滚动条的几个实例

首先要说的就是:怎么实现一个自定义的滚动条

主要步骤:

1. 定义两个div,一大一小,让小div在大div上滚动

2. 利用拖拽原理使小div可以滚动,这里拖拽的时候,只是改变小div的left值;

3. 限制小div的滚动范围

<div id="parent">
    <div id="child"></div>
</div>
<style>
        #parent{
            width: 400px;height: 30px;background: gray;
            position: relative;
        }
        #child{
            width: 30px;height: 30px;background: green;
            position: absolute;
        }
</style>

注意:别忘记定位position

<script>
    window.onload = function () {
        var oParent = document.getElementById('parent');
        var oChild = document.getElementById('child');
        var disX = 0;
        oChild.onmousedown = function (ev) {
            var ev = ev || window.event;
            disX = ev.clientX - oChild.offsetLeft;
            document.onmousemove = function (ev) {
                var ev = ev || window.event;
                // 限制小div拖动范围
                var L  = ev.clientX - disX;
                if(L<0){ //因为小div是相对大div定位的,所以当拖到大div的最左边的时候,小div的left就为0了
                    L = 0;
                }
                if(L>oParent.offsetWidth - oChild.offsetWidth){
                    // 大div的宽 减去 小div的宽 就是小div可以拖动的最大值
                    L = oParent.offsetWidth - oChild.offsetWidth;
                }
                oChild.style.left = L +'px';
            }
            document.onmouseup = function(){
                document.onmousemove = null;
                document.onmouseup = null;
            }
        }
    }
</script>

到这里一个自定义的滚动条就做好了,接下来用这个自定义的滚动条来控制做点东西,来用自定义的滚动条的滚动来改变div的大小

1. 定义一个div

<div id="box"></div>

2. 加点样式

 #box{width: 0;height: 0;background: yellow;}

3. 然后再js里定义一个滚动的比例

 var scale = 1/(oParent.offsetWidth - oChild.offsetWidth);

通过这个滚动的比例来改变div的大小。

完整js代码:

<script>
    window.onload = function () {
        var oParent = document.getElementById('parent');
        var oChild = document.getElementById('child');

        var disX = 0;
        oChild.onmousedown = function (ev) {
            var ev = ev || window.event;
            disX = ev.clientX - oChild.offsetLeft;
            document.onmousemove = function (ev) {
                var ev = ev || window.event;
                var oBox = document.getElementById('box');
                // 限制小div拖动范围
                var L  = ev.clientX - disX;

                if(L<0){
                    L = 0;
                }
                else if(L>oParent.offsetWidth - oChild.offsetWidth){
                    L = oParent.offsetWidth - oChild.offsetWidth;
                }
                // 定义一个滚动的比例,因为L的大小是由上面的判断语句决定的,所以scale需要定义在判断语句下面,定义在上面会出问题
                var scale = L/(oParent.offsetWidth - oChild.offsetWidth);
                oChild.style.left = L +'px';
                oBox.style.width = scale*300 +'px';
                oBox.style.height = scale*300 +'px';
            }
            document.onmouseup = function(){
                document.onmousemove = null;
                document.onmouseup = null;
            }
            return false;
        }
    }
</script>

注意:如果var scale = 1/(oParent.offsetWidth - oChild.offsetWidth) 下在判断语句下面会出问题

当scale写在判断语句的上面。会发现当滚动条滚到最后边的时候,继续移动鼠标scale一直在增加,导致div的宽高也会增加,所以注意,下面是正常效果

案例2: 通过自定义滚动条来改变div的透明度

将id为box的div样式做下简单修改

 #box{width: 300px;height: 300px;background: yellow;
            opacity: 0;
            filter:alpha(opacity:0);
}

接着将上面js代码中改变div宽高的代码替换成改变透明度就ok了

oBox.style.opacity = scale; // 改变div的透明度
oBox.style.filter = 'alpha(opacity:'+scale+')';

看下效果:

案例3 : 自定义滚动条控制文字内容滚动,先看效果

定义一个id为content的div,实际上是通过控制这个div的top值来实现文字滚动的,所以需要给这个div添加绝对定位

<div id="parent">
    <div id="child"></div>
</div>
<div id="box">
    <div id="content">
        众所周知JSHTMl元素的交互几乎都是通过“事件”来完成的,事件从触发到完成响应一般分为3个阶段:捕获阶段,目标阶段,和冒泡阶段。
        那么事件是在捕获阶段响应 还是在冒泡阶段响应那?? 我们是可以手动设置事件是在捕获阶段响应还是在冒泡阶段响应。
        那么事件是在捕获阶段响应 还是在冒泡阶段响应那?? 我们是可以手动设置事件是在捕获阶段响应还是在冒泡阶段响应。
        理解JS的事件流机制对充分理解JS的事件至关重要,那么什么是JS的事件流那??
        可以理解为当事件发生时,响应事件的顺序。这个顺序就按照一个流进行的。这就是事件流。这个流是从里向外流,还是从外向里流那??不同的浏览器事件流的流向不太一样。
        可以理解为当事件发生时,响应事件的顺序。这个顺序就按照一个流进行的。这就是事件流。这个流是从里向外流,还是从外向里流那??不同的浏览器事件流的流向不太一样。
        例如IE采用的是 “事件冒泡流”(从里向外流),自然响应事件的顺序也是从里向外的,事件冒泡流也是大部分浏览器采用的默认方式;而网景采用的是 “事件捕获流”(从外向里流)
        事件冒泡流也是大部分浏览器采用的默认方式;而网景采用的是 “事件捕获流”(从外向里流)
    </div>
</div>
 <style>
        #parent{
            width: 400px;height: 30px;background: gray;
            position: relative;
        }
        #child{
            width: 30px;height: 30px;background: green;
            position: absolute;
        }
        #box{width: 200px;height: 300px;
             border: 1px solid #c00;
            position: relative;left: 50px;top: 20px;
            overflow: hidden;
        }
        #content{
            position: absolute;
        }
</style>
<script>
    window.onload = function () {
        var oParent = document.getElementById('parent');
        var oChild = document.getElementById('child');
        var oBox = document.getElementById('box');
        var oContent = document.getElementById('content');
        var disX = 0;
        oChild.onmousedown = function (ev) {
            var ev = ev || window.event;
            disX = ev.clientX - oChild.offsetLeft;
            document.onmousemove = function (ev) {
                var ev = ev || window.event;
                var oBox = document.getElementById('box');
                var L  = ev.clientX - disX;  // 限制小div拖动范围

                if(L<0){
                    L = 0;
                }
                else if(L>oParent.offsetWidth - oChild.offsetWidth){
                    L = oParent.offsetWidth - oChild.offsetWidth;
                }
                var scale = L/(oParent.offsetWidth - oChild.offsetWidth);// 定义一个滚动的比例
                oChild.style.left = L +'px';
                //通过scale比例,滚动的时候改变content的top值
                oContent.style.top = -scale * (oContent.offsetHeight-oBox.offsetHeight) + 'px';

            }
            document.onmouseup = function(){
                document.onmousemove = null;
                document.onmouseup = null;
            }
            return false;
        }
    }
</script>
时间: 2024-10-11 18:20:40

JS-自定义滚动条的几个实例的相关文章

js 自定义滚动条

<!DOCTYPE HTML> <html lang="zh-cn"> <head> <meta charset="utf-8" /> <meta http-equiv="Content-Language" content="zh-cn" /> <title>自定义滚动条</title> <meta name="keywords

Vue.js自定义指令的用法与实例

市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vue推崇数据驱动视图的理念,但并非所有情况都适合数据驱动.自定义指令就是一种有效的补充和扩展,不仅可用于定义任何的DOM操作,并且是可复用的. 比如谷歌图片的加载做得非常优雅,在图片未完成加载前,用随机的背景色占位,图片加载完成后才直接渲染出来.用自定义指令可以非常方便的实现这个功能. 效果: 自定义

LM-diyScroll.js PC自定义滚动条组件

LM-diyScroll.js PC自定义滚动条组件,零依赖! github地址:http://dtdxrk.github.io/LM-diyScroll/ CDN http://dtdxrk.github.io/LM-diyScroll/LM-diyScroll-min.js Demo 实例演示 USE 生成一个有滚动条的实例 var box = new LM_diyScroll({ id:'box', viewHeight:300 }); 显示滚动条 box.barShow(); 隐藏滚动条

H5自定义滚动插件——DeftScroll.js,可自定义滚动条

在一些项目中,用户总是要求自定义一下滚动条,以前一般用iscroll解决,但是发现iscroll有很多不方便的地方,而且也比较大,索性自己琢磨一个类似的插件吧!目的有两个:要足够小,易于上手使用:功能一定要足够实用,能满足广大H5开发者的基本需求. 介绍一下这个插件的主要功能: 1.隐藏或显示滚动条,自定义滚动条样式. 2.滚动dom的刷新:refresh: 3.滚动内容的懒加载: 4.子元素绑定tap事件: 5.支持scrolling.scrollEnd等插件内事件绑定: 6.scrollTo

js取滚动条的尺寸实例代码

分享一个js取滚动条的尺寸的函数代码,很简单,很实用. 创建一个嵌套节点,让外层节点产生滚动条,然后用offsetWidth - clientWidth即可获得滚动条宽度. 注意,为了避免页面抖动,可以设置外层元素position:absolute和visibility:hidden 完整代码: function getScrollWith(){ var wrap = setAttributes(document.createElement('div'),{ style : { width :

利用CSS3新特性实现完全兼容的自定义滚动条。

背景:最近项目里面因为统一页面风格,用到了自定义滚动条,在完成之前的那个滚动条的时候,与网上各个滚动条插件实现的方法类似,相当于造了轮子,通过css3的 网上看到的滚动条插件多数是通过监听内容的滚动事件,由于原生js的滚动事件存在一些bug,所以实际上用jQuery的mousewheel.js插件的比较多,自己做的滚动条也是引用了该插件. 首先说一说自定义滚动条实现的普遍步骤和方法: 背景: A需要滚动. 1.给A添加一个父级S包裹,并将B进行绝对或相对定位(这点根据S的定位,目的是为了保持原有

自定义滚动条

<!DOCTYPE HTML><html><head><title>自定义滚动条</title><meta charset="UTF-8"><link rel="stylesheet" href="reset.css" type="text/css" /><script type="text/javascript" s

js实现的运动框架代码实例

js实现的运动框架代码实例:元素的运动效果在大量的场景中都有应用,最典型的一个就是网站的客服系统,一般都会随着滚动条运动,本章节就介绍一下js的一个运动框架实例,希望能够给需要的朋友带来借鉴作用.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwh

原型设计模式prototype-构造js自定义对象

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 原型模式: prototype 原型属性 对象的原型拥有的属性,该对象的实例对象也会同时拥有 */ function Test(){ } T