zoukankan      html  css  js  c++  java
  • 自定义滚动条插件

    HTML结构:

    <div class="styledSelect aaa">
        <div class="contentBox">
             .....这里是内容
        </div>
    </div>

    CSS:

    <style>
        /*最外层容器的样式*/ .styledSelect
    { width: 410px; height: 295px; margin: 0 auto; overflow: hidden; }      /*包裹内容的容器样式*/ .contentBox { width: 400px; line-height: 20px; font-family: '宋体'; font-size: 12px; } .contentBox p { text-indent: 24px; margin: 0; padding: 0; }      /*这个是滑块的样式*/ .barClass { right: 2px; width: 2px; background: #000; }      /*这个是滑块靶的样式*/  .barSpanClass { width: 6px; background: #000; right: -2px; } </style>

    js调用方式:

    <script>
        //绑定滚动事件
        $('.aaa').StyleScroll();
        $('.bbb').StyleScroll();
        $('.ccc').StyleScroll();
    </script>

    js插件:

    (function (window, $) {
        $.fn.StyleScroll = function () {
            var $self = $(this),
                contentbox = $self.children().first();
            $self.append('<div class="barline"></div>');
            var barline = $self.find('.barline');
            $self.find(barline).append('<span class="barSpan"></span>');
            var barSpan = $self.find('.barSpan');
            if ($self.css('position') !== 'relative') {
                $self.css('position', 'relative')
            }
            if (contentbox.css('position') !== 'absolute') {
                contentbox.css('position', 'absolute');
            }
            $('.barline').addClass('barClass');
            $('.barSpan').addClass('barSpanClass');
    
            var wrapHeight = $self.height();
            var contentheight = contentbox.outerHeight();
            var barSpanheight = parseInt(wrapHeight / contentheight * wrapHeight, 10);
            barline.css({'position': 'absolute', 'top': 0, 'height': wrapHeight + 'px'});
            barSpan.css({'position': 'absolute', 'top': 0, 'height': barSpanheight + 'px', 'cursor': 'pointer'});
            var scrollHeight = wrapHeight - barSpanheight;
            var nextval = 0;
            var barSpanTop;
    
            /*模拟的滚动事件*/
            $self.on('mousewheel DOMMouseScroll', contentbox, function (event) {
                var e = event || window.event;
                var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail;
                if (delta < 0 && nextval <= (contentheight - wrapHeight)) {
                    nextval += 20;
                } else if (delta > 0 && nextval > 0) {
                    nextval -= 20;
                }
                contentbox.css('top', -nextval + 'px');
                barSpanTop = nextval / contentheight * wrapHeight;
                barSpan.css('top', barSpanTop + 'px');
                _outFun(barSpanTop);
            });
            var t;
    
            /*拖动滚动靶事件*/
            barSpan.on('mousedown', function (event) {
                event.preventDefault();
                var e = event || window.event;
                t = e.clientY - barSpan.position().top;
                $(document).on('mousemove', function (event) {
                    _dragFun(event);
                    event.preventDefault();
                });
                $(document).on('mouseup', _mouseup);
                return false;
            });
    
            /*调用移入和移出时document的禁用状态*/
            $self.css('outline', 'none');
            $self.attr('hidefocus', true);
            $self.mouseenter(function () {
                scrollHanlder.disableScroll();
    //使div获取焦点 $self.attr(
    'tabindex', 1); $self.focus(); $self.off('keydown').on('keydown', function (event) { var e = event || window.event; keyPress(event) }); }).mouseleave(function () { scrollHanlder.enableScroll();
    //移除焦点 $self.removeAttr(
    'tabindex'); $self.blur(); $self.off('keydown'); }); function keyPress(event) { var e = event || window.event; var code = e.keyCode; if (code === 37 || code === 38 || code === 65 || code === 87 && nextval > 0) { if (nextval <= 0) { return; } else { nextval -= 20; } } else if (code === 39 || code === 40 || code === 68 || code === 83 && nextval <= (contentheight - wrapHeight)) { if (nextval >= (contentheight - wrapHeight)) { return; } else { nextval += 20; } } console.log(nextval); contentbox.css('top', -nextval + 'px'); barSpanTop = nextval / contentheight * wrapHeight; barSpan.css('top', barSpanTop + 'px'); _outFun(barSpanTop); } function _mouseup() { $(document).off('mousemove'); $(document).off('mouseup'); return false; } function _dragFun(event) { var e = event || window.event; var disY = e.clientY - t; var wt = disY / wrapHeight * contentheight; contentbox.css('top', -wt + 'px'); barSpan.css('top', disY + 'px'); _outFun(disY); return false; } function _outFun(barTop) { // 如果滚动条已经超出了内容的上方,停止 if (barTop < 0) { disY = 0; barSpan.css('top', 0); contentbox.css('top', 0); } // 如果滚动条已经超出了内容的下方,停止 if (barTop > scrollHeight) { disY = barTop; barSpan.css('top', scrollHeight + 'px'); contentbox.css('top', -(contentheight - wrapHeight) + 'px'); } } }; /*禁用和开启document的滚动条*/ var keys = {37: 1, 38: 1, 39: 1, 40: 1}; function preventDefault(event) { e = event || window.event; if (e.preventDefault) { e.preventDefault(); } e.returnValue = false; return false; } function preventDefaultForScrollKeys(event) { var e = event || window.event; if (keys[e.keyCode]) { if (e.preventDefault) { e.preventDefault(); } e.returnValue = false; return false; } } var oldonmousewheel1, oldonmousewheel2, oldontouchmove, oldonkeydown, isDisabled; function disableScroll() { if (document.addEventListener) { // older FF document.addEventListener('DOMMouseScroll', preventDefault, false); } //oldonwheel = document.body.onwheel; //document.body.onwheel = preventDefault; // modern standard oldonmousewheel1 = window.onmousewheel; window.onmousewheel = preventDefault; // older browsers, IE oldonmousewheel2 = document.onmousewheel; document.onmousewheel = preventDefault; // older browsers, IE oldontouchmove = window.ontouchmove; window.ontouchmove = preventDefault; // mobile oldonkeydown = document.onkeydown; document.onkeydown = preventDefaultForScrollKeys; isDisabled = true; } function enableScroll() { if (!isDisabled) return; if (document.removeEventListener) { document.removeEventListener('DOMMouseScroll', preventDefault, false); } //document.body.onwheel = oldonwheel; // modern standard window.onmousewheel = oldonmousewheel1; // older browsers, IE document.onmousewheel = oldonmousewheel2; // older browsers, IE window.ontouchmove = oldontouchmove; // mobile document.onkeydown = oldonkeydown; isDisabled = false; } window.scrollHanlder = { disableScroll: disableScroll, enableScroll : enableScroll }; })(window, jQuery);

    兼容性:IE7及以上、chrome、firefox、360、遨游。

  • 相关阅读:
    PHP调用WCF提供的方法
    关于git报 warning: LF will be replaced by CRLF in README.md.的警告的解决办法
    vue中引入mui报Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them的错误
    微信小程序报Cannot read property 'setData' of undefined的错误
    Vue那些事儿之用visual stuido code编写vue报的错误Elements in iteration expect to have 'v-bind:key' directives.
    关于xampp中无法启动mysql,Attempting to start MySQL service...的解决办法!!
    PHP的环境搭建
    新手PHP连接MySQL数据库出问题(Warning: mysqli_connect(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES))
    手机号码、获得当前时间,下拉框,填写限制
    团队作业(五):冲刺总结
  • 原文地址:https://www.cnblogs.com/qianduanjingying/p/5312074.html
Copyright © 2011-2022 走看看