HTML部分

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <link rel="stylesheet" type="text/css" href="css/reset.css"/>
        <link rel="stylesheet" type="text/css" href="css/index.css"/>
    </head>
    <body>
        <!--自定义滚动条最外层容器-->
        <div class="slider-con">
            <!--tab容器-->
            <ul class="tab-con">
                <li class="tab-item active">春天的故事</li>
                <li class="tab-item">夏天的故事</li>
                <li class="tab-item">秋天的故事</li>
                <li class="tab-item">冬天的故事</li>
            </ul>
            <!--滚动条内容区-->
            <div class="slider-text-con">
                <div class="slider-text">
                    <!--春天的故事-->
                    <div class="spring-story story">
                        <h3 class="title">春天的故事</h3>
                        <p class="context">
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                        </p>
                    </div>
                    
                    <!--夏天的故事-->
                    <div class="summy-story story">
                        <h3 class="title">夏天的故事</h3>
                        <p class="context">
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                        </p>
                    </div>
                    
                    <!--秋天的故事-->
                    <div class="qiut-story story">
                        <h3 class="title">秋天的故事</h3>
                        <p class="context">
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                        </p>
                    </div>
                    
                    <!--冬天的故事-->
                    <div class="win-story story">
                        <h3 class="title">冬天的故事</h3>
                        <p class="context">
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                            地方海事局和地方了萨芬的拉萨
                            发货的老师发来的沙发里打开撒
                            分行贷款来撒会反馈到拉萨发了
                            多少开发大咖浪费好多啦大萨达
                            范德萨范德萨发生发生法萨芬的
                            范德萨范德萨发撒范德萨发生法
                            废物废物个人感情啊服务器发送
                        </p>
                    </div>
                </div>
                <!--滚动条槽-->
                <div class="slider-bar">
                    <!--滚动条滑块-->
                    <div class="slider"></div>
                </div>
            </div>
        </div>
        <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
        <script src="js/index.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
        
        
        </script>
    </body>
</html>

-------------------------------------------------------------------------------------------------end

JS逻辑部分

//(function(win,doc,$){
    $(function(){
        
        //定义滑块类
        function slider( options ){
            this._init( options )
        };
        $.extend(slider.prototype, {
            _init:function( options ){
                //设置初始配置参数
                this.options = {
                    //滚动的方向 y  x 
                    origin:"y",
                    //滚动条
                    sliderBarEle:'',
                    //滚动内容区
                    sliderContEle:'',
                    //滚动滑块
                    sliderEle:'',
                    //鼠标滑轮滚动一格定义的距离
                    wheelStep:20,
                    
                };
                //如果有传参就合并
                this.options = options?$.extend(true,this.options,options):this.options
        
                
                //定义各事件
                this._bindEvent();
                
            },
            /*
             * 获取个节点
             */
            _fgetElement:function(){
                //tab item
                this.$tabItem = $(".tab-item");
                
                //滚动内容区
                this.$sliderText = $(".slider-text");
                
                //每篇故事
                this.$story = $(".story");
                
                //滚动条
                this.$sliderBar = $(".slider-bar");
                
                //滑块
                this.$slider = $(".slider");
                this.$doc = $(document);
            },
            /*
             * 绑定各事件
             */
            _bindEvent:function(){
                //获取元素
                this._fgetElement();
                //获取初始化数据
                this._fgetData();
                //鼠标事件--
                this._fmouseEvent();
                
                //点击切换tab
                this._fchangeTab();
                //鼠标滚轮事件
                this._fmouseWheelEvent();
            },
            /*
             * 获取各元素高度等数据
             */
            _fgetData:function(){
                //获取内容区可见高度
                this.textCanSeeHight = this.$sliderText.height();
                //获取内容完整高度
                this.textAllHeight = this.$sliderText[0].scrollHeight;
                //获取滚动条高度
                this.sliderBarHight = this.$sliderBar.height();
                //获取滑块高度
                this.sliderHeight = this.$slider.height();
                //滑块可移动距离
                this.sliderCanMoveHeight = this.sliderBarHight - this.sliderHeight;
                
                //内容可移动距离
                this.textCanMoveHeight = Math.max(this.textAllHeight,this.textCanSeeHight) - this.textCanSeeHight;//防止出现负数情况
                
                //获取比率
                this.rate =this.textCanMoveHeight/this.sliderCanMoveHeight;//内容可移动的距离除以滑块可移动的距离
                
                this.textPlaceArr = this._fgetTextPlace();
            },
            /*
             * 定义鼠标事件
             */
            _fmouseEvent:function(){
//                var _this = this;
//                var isDown = true;
//                //绑定鼠标点下事件
//                this.$doc.on("mousedown",function(e){
//                    e.preventDefault();
//                    var startY = e.pageY;
//                    if( isDown ){
//                        $(this).on("mousemove",function(e){
//                            var endY = e.pageY;
//                            var ranges = endY - startY;
//                            
//                            var canUseRange = _this._filter( ranges );
//                            
//                            
//                            _this.$slider[0].style.top = canUseRange + "px";
//                            
//                            _this._fscrollTo( canUseRange/_this.rate );    
//                            var ids =  _this._fselectTab( canUseRange/_this.rate );
//                            _this.$tabItem.eq(ids).addClass("active").siblings().removeClass("active");                                
//                                
//                    });
//                    }else{
//                        $(this).off("mousemove")
//                    }
//                    
//                    $(this).on("mouseout",function(e){
//                        isDown = false;                        
//                    })
//                })

var slider = this.$slider,
                    _this = this,
                    sliderDom = slider[0];//注意  只有dom节点元素才能用if来判断是否存在  jq对象不行
                    if( sliderDom ){
                        //定义初始化位置数据
                        var doc = this.$doc,
                            startY,//光标相对于文档的初始Y值
                            contentScrollTop;//获取内容容器相对于边界超出的初始距离                                                       
                            
                            function mouseMove(e){//定义滑块移动时逻辑处理
                                e.preventDefault();
                                var ranges = e.pageY - startY;
                                if( contentInitScrollTop == null ){//容错处理
                                    return;
                                }
                                _this.$slider[0].style.top = _this._filter( ranges ) + "px";
                                _this._fscrollTo( contentInitScrollTop + ranges*_this.rate )//初始距离加上移动后的距离
                            };
                            
                            //滑块按下鼠标事件
                            slider.on("mousedown",function( e ){
                                e.preventDefault();
                                startY = e.pageY;//记录鼠标初始位置
                                contentInitScrollTop = _this.$sliderText[0].scrollTop;//记录内容初始溢出距离
                                //添加鼠标移动事件、将其挂载在doc上 以便当鼠标移出滑块后还能继续拖动
                                doc.on("mousemove.sliderMove",mouseMove).on("mouseup",function(){
                                    $(this).off(".sliderMove")
                                })
                            })
                    }
            },
            /*
             * 鼠标滚轮事件
             */
            
            _fmouseWheelEvent:function(){
                var _this = this;
                _this.$sliderText.on("mousewheel DoMMouseScroll",function(e){
                    e.preventDefault();
                    var oEv = e.originalEvent,
                    //获取鼠标滚轮的滚动次数     火狐浏览器是detail  正数表示向上 且值为3的倍数    其他浏览器为wheelDelta  负数为向上   且为120的倍数
                    whellRange = oEv.wheelDelta ? - oEv.wheelDelta/120 :(oEv.detail || 0)/3,
                    //内容滚动的距离
                    conTextRange =  _this.$sliderText[0].scrollTop +_this.options.wheelStep*whellRange;
                    //同步滑块的距离
                    _this.$slider[0].style.top = _this._filter( conTextRange/_this.rate ) + "px";
                    _this._fscrollTo(conTextRange)//累计叠加
                })
            },
            /*
             * tab切换逻辑
             */
            _fchangeTab:function(){
                var _this = this;
                this.$tabItem.on("click",function(){
                    //记录点击的item下标
                    _this.selectId = $(this).index();
                    //给选中的tab添加选中样式
                    $(this).addClass("active").siblings().removeClass("active");
                    _this._fscrollTo( _this.textPlaceArr[_this.selectId] ) 
                })
            },
            /*
             * _fselectTab  拖动后高亮对应的tab item
             */
            _fselectTab:function( range ){            
                for( var i = this.textPlaceArr.length-1;i >=0; i-- ){
                    if ( range>=this.textPlaceArr[i] ){
                
                        return i;
                    }
                }
                
            },
            /*
             * 获取文章节点的top值 并保存在数组中
             */
            _fgetTextPlace:function(){
                var arr = [];
                for( var i = 0;i < this.$story.length; i++ ){
                    arr.push(this.$story.eq(i).position().top)
                }
                return arr
            },
            /*
             * 改变文章容器的scrollTop值  
             */
            _fscrollTo:function( param ){
                this.$sliderText.scrollTop( param )//设置内容容器溢出上边界距离
            },
            /*
             * 限制滑块滑动的距离在合法范围内  
             */
            _filter:function( range ){
                
                if( range<0  ){
                    range = 0;
                }else if( range>this.sliderCanMoveHeight ){
                    range = this.sliderCanMoveHeight
                }
                return range;
            }
        });
        new slider({
            
                    //滚动内容区
            sliderContEle:'haha'
        
        });
    })

//(window,document,jQuery))

自定义滚动条组件封装相关推荐

  1. vuejs滚动条_Vue.js桌面端自定义滚动条组件之美化滚动条VScroll

    前言 前段时间有给大家分享一个vue桌面端弹框组件,今天再分享最近开发的一个vue pc端自定义滚动条组件. vscroll 一款基于vue2.x开发的网页端轻量级超小巧自定义美化滚动条组件.支持是否 ...

  2. svelte-scrollbar: 基于svelte.js自定义滚动条组件|svelte3虚拟滚动条

    基于svelte3.x构建轻量级自定义pc端虚拟滚动条组件SvelteScrollbar.支持原生滚动条.自动隐藏.垂直+水平滚动.自定义尺寸/颜色及间隔等功能. 在lib目录下新建Scrollbar ...

  3. 微信小程序自定义标签组件component封装、组件生命周期,组件通信

    微信小程序自定义标签组件component封装.组件生命周期,组件通信 本文来说下小程序的自定义标签组件封装. 相比于vue,react的非路由组件,微信小程序的component组件要麻烦些,而且生 ...

  4. vue 滚动条_轻量级 React.js 虚拟美化滚动条组件RScroll

    前几天有给大家分享一个Vue自定义滚动条组件VScroll.今天再分享一个最新开发的React PC端模拟滚动条组件RScroll. vue+pc桌面端模拟滚动条组件VScroll rscroll 一 ...

  5. js 隐藏滚动条_轻量级 React.js 虚拟美化滚动条组件RScroll

    前几天有给大家分享一个Vue自定义滚动条组件VScroll.今天再分享一个最新开发的React PC端模拟滚动条组件RScroll. vue+pc桌面端模拟滚动条组件VScroll rscroll 一 ...

  6. 滚动条组件 http://www.w3cfuns.com/notes/15098/96195b77bdbcb601590f67f971770bb8.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. H5移动端开发基础(三)自定义滚动条、实战-音悦台

    自定义滚动条.实战-音悦台 自定义滚动条 js封装 transform.js tween.js scrollBar.js 音悦台 适配 样式 html js 自定义滚动条 *{margin: 0;pa ...

  8. html任务3 模拟滚动条,vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件...

    /** * @Desc Vue3.0虚拟滚动条组件V3Scroll * @Time andy by 2021-01 * @About Q:282310962 wx:xy190310*/ props: ...

  9. php 小程序自定义图,微信小程序之如何使用自定义组件封装原生 image 组件

    零.问题的由来 一般在前端展示图片时都会碰到这两个常见的需求: 图片未加载完成时先展示占位图,等到图片加载完毕后再展示实际的图片. 假如图片链接有问题(比如 404),依然展示占位图.甚至你还可以增加 ...

最新文章

  1. 未来网络发展的趋势——IPv6详细讲解与基本配置
  2. fp5139应用电路图_四款l6599d经典应用电路图详解
  3. Android 在 NDK 层使用 OpenSSL 进行 RSA 加密
  4. python - hash类型操作
  5. http error
  6. (转)gLFlush()和gLFinish()
  7. gdb调试多进程和多线程命令
  8. 对于不是特别擅长Photoshop的人来说,熟悉和运用Photoshop工具提供的各类便捷的快捷键,是有帮助的。...
  9. mysql weblogic_weblogic连mysql的问题
  10. Windows新建一个新的磁盘空间:
  11. linux下安装xz命令
  12. JavaScript Module Pattern
  13. PDF417数据容量
  14. 思科模拟器路由表怎么看_实战思科 Cisco 模拟器 Packet tracer 使用教程详解.pdf
  15. Java短信平台实战第一天
  16. iMX6ULL上手体验
  17. 虚拟机xfs文件系统因根分区爆满损坏修复
  18. Nlp预处理方法(BPE Byte pair encoding、Normalization、Lemmatisation、Stemming…)
  19. Oracle中打印99乘法表的13种方法
  20. Geode中使用PDX序列化最佳实践

热门文章

  1. erlide下载-eclipse中安装erlang插件
  2. 【观察】星环科技:布局行业大模型赛道,加速国产化替代进程
  3. tableau无法启动程序_Tableau Public已启动
  4. qt 隐藏控制台_c – 在Qt中显示控制台
  5. platform 总线驱动练习
  6. GNU Linker
  7. 大前端 - 函数式编程范式
  8. Photoshop中钢笔工具
  9. 2018服务器 芯片组,再见了14nm 2018主板/CPU行业回顾展望
  10. linux系统引导的过程包括哪几步,Linux引导过程九个步骤.doc