• 模拟滚动条


    模拟滚动条

    【html结构】: 外框里面的class都是固定的,注意每个模块的css有些是有定位属性的
    <div class="" id="ID名">                            ---有position:relative; 和 overflow:hiddle; 属性
        <div class="scroll-content-wrap">内容区域</div>     ---有position:absolute; 属性
        <div class="scroll-ground-wrap">                    ---有position:absolute; 和 overflow:hiddle; 属性
            <span class="scroll-ground"></span>            ---有position:absolute; 属性    
        </div>
    </div>
    
    【js调用方法】:
    var grounds=new scrollGround();
    grounds.scrollBar({
        id:'ID名',    ---外框ID名
        oN:false    ---是否开启滚动小块的拖拉操作(默认为false,不开启)
    });
    
    【js实现代码】:
    function scrollGround(){
        this.opt={
            id:'',
            oN:false
        };
        this.oPraentWrap=null;
        this.contentWrap=null;
        this.groundWrap=null;
        this.ground=null;
    
        this.praentH=0;            //父级高度
        this.conterH=0;            //内容高度
        this.groundwH=0;            //滚动块外框高度
        this.num=0;                //滚动块的高度值
        this.maxConterNum=0;        //内容的top最大值
        this.maxGroundNum=0;        //小滚动块的top最大值
    };
    
    scrollGround.prototype.scrollBar=function(opt){
        var This=this;
        $.extend(this.opt,opt);
        this.init();                    //初始化
    };
    
    scrollGround.prototype.init=function(){
        var This=this;
        this.oPraentWrap=$('#'+this.opt.id);
        this.contentWrap=this.oPraentWrap.find('.scroll-content-wrap');
        this.groundWrap=this.oPraentWrap.find('.scroll-ground-wrap');
        this.ground=this.oPraentWrap.find('.scroll-ground');
    
        this.praentH=this.oPraentWrap.outerHeight();
        this.conterH=this.contentWrap.outerHeight();
        this.groundwH=this.groundWrap.outerHeight();
    
        this.gdthHiddle();        //判断内容区域的高度是否超出外框高度,如果超出就隐藏滚动区域
        this.numGdtH();        //计算滚动块的高度值 = ( 父级外框高度/内容外框高度 )*滚动外框的高度
        this.scrollWeel();        //鼠标移入内容区域滚动滚动条
        if(this.opt.oN){            //开关打开时执行用户鼠标操作滚动小块
            this.eventWeel();
        };
    };
    
    scrollGround.prototype.gdthHiddle=function(){
        if(this.conterH<=this.praentH){
            this.groundWrap.hide();
        };
    };
    
    scrollGround.prototype.numGdtH=function(){
        this.num=( this.praentH/this.conterH ) * this.groundwH;
        this.ground.height(this.num);
    };
    
    scrollGround.prototype.scrollWeel=function(){
        var This=this;
        if(this.conterH<=this.praentH) return;
        this.maxConterNum=this.conterH-this.praentH;
        this.maxGroundNum=this.groundwH-this.num;
    
        mousewheel(this.oPraentWrap.get(0),function(){
            //滚动小块的top值变化
            var numBot=This.ground.position().top-5;
            if(numBot<=0){ numBot=0 };
            This.ground.css('top',numBot);
    
            //内容区域的top值变化 内容区域能走的top值=(滚动小块走的top/滚动小块能走的最大top)*内容能走的最大top
            var contentTop=(numBot/This.maxGroundNum)*This.maxConterNum;    
            This.contentWrap.css('top',-contentTop);
        },function(){
            //滚动小块的top值变化
            var numBot=This.ground.position().top+5;
            if(numBot>=This.maxGroundNum){ numBot=This.maxGroundNum };
            This.ground.css('top',numBot);
    
            //内容区域的top值变化
            var contentTop=(numBot/This.maxGroundNum)*This.maxConterNum;
            This.contentWrap.css('top',-contentTop);
        });
    
        //封装鼠标滚轮事件 向上滚和向下滚
        function mousewheel(obj,upFn,downFn){
            obj.onmousewheel = mousewheelFn;
            if( obj.addEventListener ){
                obj.addEventListener("DOMMouseScroll",mousewheelFn,false);
            };
            function mousewheelFn(ev){
                ev = ev || event;
                var direction = true;
                //IE和谷歌下滚轮事件 判断上滚还是下滚
                if( ev.wheelDelta ){
                    direction = ev.wheelDelta > 0 ? true : false;
                };
                //火狐下滚轮事件 判断上滚还是下滚
                if( ev.detail ){
                    direction = ev.detail < 0 ? true : false;
                };
                //向上或向下 分别执行不同的函数
                if( direction ){
                    typeof upFn === "function" && upFn(ev);
                }else{
                    typeof downFn === "function" && downFn(ev)
                };
                //火狐下 清除浏览器默认样式 (使用addEventListener时return false是没用的)
                if( ev.preventDefault ){ ev.preventDefault() };
                //IE和谷歌下 清除浏览器默认样式
                ev.returnValue = false;
            };    
            //用法:upFn函数代表滚轮向上滚动  downFn函数代表滚轮向下滚动     
        };
    };     
    
    scrollGround.prototype.eventWeel=function(){
        var This=this;
        this.ground.mousedown(function(event) {
            var GT=event.pageY-This.ground.position().top;
            $(document).mousemove(function(event) {
                //控制滚动小块的top值
                var GTX=event.pageY-GT;
                if(GTX<=0){ GTX=0 };
                if(GTX>=This.maxGroundNum){ GTX=This.maxGroundNum };
                This.ground.css('top',GTX);
                //控制内容区域的top值 CTX = (内容区域能走的最大距离*小块走的top值)/小块能走的最大距离
                var CTX=(This.maxConterNum*GTX)/This.maxGroundNum;
                This.contentWrap.css('top',-CTX);
            });
            $(document).mouseup(function(event) {
                $(document).off();
            });
            return false;
        });
    };
  • 相关阅读:
    [转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
    [转]ASP.NET Core配置环境变量和启动设置
    [转]ASP.NET Core 指定环境发布(hosting environment)
    [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
    [转]How to Use xp_dirtree to List All Files in a Folder
    [转]How to nest transactions nicely
    [转]Using TRY...CATCH in Transact-SQL
    [转][C#] 对List<T>取交集、连集及差集
    [转]Pass a ViewBag instance to a HiddenFor field in Razor
    Apache Ignite简介以及Ignite和Coherence、Gemfire、Redis等的比较
  • 原文地址:https://www.cnblogs.com/wxyblog/p/14163330.html
Copyright © 2020-2023  润新知