在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 使用scrollTop,但是元素獲取不到

使用scrollTop,但是元素獲取不到

我想在鼠標(biāo)按下時獲得scrollTop 值,但是按下后,卻找不到那個元素。

dragStartScrollPosition = self.$cont[0].scrollTop;

我認(rèn)為是元素沒有取到,但是檢查過新建的對象,類名是正確的。下面是源代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>滾動條的實現(xiàn)</title>
    <style>
        html, body, div, ul, li, p {
            margin: 0;
            padding: 0;
        }
        li {
            list-style: none;
        }
        .clearfix::after {
            display: block;
            content: ".";
            height: 0;
            clear: both;
            visibility: hidden;
        }

        body {
            background-color: #ccc;
        }
        .scrollBox {
            width: 540px;
            margin: 20px auto;
            background-color: #fff;
            border: 2px solid #e5e5e5;
        }
        .scroll-tab {
            height: 30px;
            border: 1px solid #e5e5e5;
            color: #666;
            background-color: #f8f8f8;
        }
        .scroll-tab .tab-item {
            float: left;
            font: 16px/30px "Microsoft YaHei";
            line-height: 30px;
            padding:0 20px;
        }
        /* 選中時的背景顏色 */
        .scroll-tab .tab-active {
            color: #00be3c;
            background-color: #fff;
            border-top:2px solid #00be3c;
            margin: -1px 0;
        }
        /* 滾動內(nèi)容區(qū) */
        .scroll-wrap {
            width: 100%;
            height: 300px;
            position: relative;
        }
        .scroll-wrap .scroll-cont {
            height: 100%;
            padding: 0 15px;
            overflow: hidden;
        }
        .scroll-wrap .scroll-cont h3 {
            font: 16px/3 "Microsoft YaHei";
            text-align: center;
        }
        .scroll-wrap .scroll-cont p {
            font-size: 14px;
            line-height: 30px;
            text-indent: 2em;
        }
        /* 寫個滾動條 */
        .scroll-bar {
            position: absolute;
            top: 0;
            right: 0;
            width: 10px;
            height: 100%;
            background-color: #aeaeae;
        }
        .scroll-bar .scroll-slider {
            position: absolute;
            top: 0;
            left: 1px;
            width: 8px;
            height: 40px;
            background-color: #fff;
        }
    </style>
</head>
<body>
    

<div class="scrollBox">
    <ul class="scroll-tab">
        <!-- 標(biāo)簽切換 -->
        <li class="tab-item tab-active">one</li>
        <li class="tab-item">two</li>
        <li class="tab-item">three</li>
        <li class="tab-item">four</li>
    </ul>
    <!-- 滾動內(nèi)容 -->
    <div class="scroll-wrap clearfix">
    <!-- 內(nèi)容 -->
        <div class="scroll-cont">
            <h3>春天來了</h3>
            <div class="scroll-ol">
                <p>來就來了,關(guān)你什么事。一年之計在于春,春天來了,萬物復(fù)蘇。那一碧千里的小草綠了,像一塊綠色的地毯鋪在大地上;那五彩繽紛、燦爛多姿的花兒像七彩的云朵隨風(fēng)飄游;那壯麗高聳、生機(jī)勃勃的大樹像是被人涂了一層綠油油的漆·</p>
            </div>
            <div class="scroll-ol">
            <h3>夏天來了</h3>
                <p>夏日,就應(yīng)當(dāng)是靜謐的,不需要風(fēng)的做伴,這會打破一切靜止的畫面,不需要與別人分享,這樣的美麗就會減少一分,不需要蟬鳴的演奏,這樣會增加不協(xié)調(diào)的聲音。就只需明媚的陽光,高高的天空與漂浮的云朵和我這一個觀賞者就夠了,就因這樣,我對這情景越來越喜愛,把我所有的感情傾注于它,已不是用“喜愛”二字來形容的。只能用心靈來訴說……</p>
            </div>
            <div class="scroll-ol">
            <h3>秋天來了</h3>
                <p>夏日,就應(yīng)當(dāng)是靜謐的,不需要風(fēng)的做伴,這會打破一切靜止的畫面,不需要與別人分享,這樣的美麗就會減少一分,不需要蟬鳴的演奏,這樣會增加不協(xié)調(diào)的聲音。就只需明媚的陽光,高高的天空與漂浮的云朵和我這一個觀賞者就夠了,就因這樣,我對這情景越來越喜愛,把我所有的感情傾注于它,已不是用“喜愛”二字來形容的。只能用心靈來訴說……</p>
            </div>
            <div class="scroll-ol">
            <h3>冬天來了</h3>
                <p>夏日,就應(yīng)當(dāng)是靜謐的,不需要風(fēng)的做伴,這會打破一切靜止的畫面,不需要與別人分享,這樣的美麗就會減少一分,不需要蟬鳴的演奏,這樣會增加不協(xié)調(diào)的聲音。就只需明媚的陽光,高高的天空與漂浮的云朵和我這一個觀賞者就夠了,就因這樣,我對這情景越來越喜愛,把我所有的感情傾注于它,已不是用“喜愛”二字來形容的。只能用心靈來訴說……</p>
            </div>
        </div>
    <!-- 滾動條 -->
        <div class="scroll-bar">
            <!-- 滾動滑塊 -->
            <div class="scroll-slider"></div>
        </div>
    </div>
    <script type="text/javascript" src="./js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
    // 創(chuàng)建全局變量,讓匿名函數(shù)中的變量在外部能夠訪問
    var Scroll = {};
    // 自調(diào)用匿名函數(shù),防止與已有函數(shù)、方法或變量沖突
    (function(win,doc,$){
        // 創(chuàng)建構(gòu)造函數(shù)
        function CusScrollBar(options){
            // 實例化時,this就代表實例
            this._init(options);
        }
        // 構(gòu)造函數(shù)原型上添加屬性和方法,所有實例上就能夠共享(不同實例之間的屬性相互獨(dú)立)
        // CusScrollBar.prototype._init = function() {
        //     console.log("test");
        // }
        // 利用 $.extend(true, target object, object1);優(yōu)化構(gòu)造函數(shù).
        //CusScrollBar.prototype 上添加_init方法
        $.extend(CusScrollBar.prototype, {
            // 指定參數(shù)
            _init:function(options){
                //防止this的混用
                var self = this;
                // 指定默認(rèn)屬性
                self.options = {
                    scrollDir      : "y",   //滾動的方向
                    contSelector   : "",    //滾動內(nèi)容區(qū)選擇器
                    barSelector    : "",    //滾動條選擇器
                    sliderSelector : ""     //滾動滑塊選擇器
                }
                //通過參數(shù)傳遞,進(jìn)行深拷貝,||是為了代碼的健壯性
                $.extend(true, self.options, options || {});
                // console.log(self.options);
                // 調(diào)用初始化DOM函數(shù) 
                self._initDomEvent();
                return self;
            },
            // 監(jiān)聽內(nèi)容的滾動,同步滑塊位置
            _bindContScroll : function() {

            }
            // 初始化DOM引用
            // @method _initDomEvent
            // @return {CusScrollBar}
            _initDomEvent : function() {
                // DOM的引用更方便使用
                var opts = this.options;
                // 滾動內(nèi)容區(qū),必填項
                this.$cont = $(opts.contSelector);
                // 滾動條滑塊,必填項
                this.$slider = $(opts.sliderSelector);
                // 滾動條對象
                this.$bar = opts.barSelector ? $(opts.barSelector) : self.$slider.parent();
                //獲取文檔對象
                this.$doc = $(doc);
                // 調(diào)用滑塊拖動功能
                this._initSliderDragEvent();
            },
            // 初始化滑塊拖動功能
            // @return {[Object]} [this]
            _initSliderDragEvent:function() {
                var slider = this.$slider,
                // 獲取slider元素
                    sliderEl = slider[0];
                if (sliderEl) {
                    var doc = this.$doc,
                        dragStartPagePosition,
                        dragStartScrollPosition,
                        dragContBarRate;
                // 鼠標(biāo)移動事件
                function mousemoveHandler(e) {
                    e.preventDefault();
                    console.log('mousemove');
                    // 判斷是否有按下鼠標(biāo)
                    if (dragStartPagePosition == null) { return;}
                        //傳入的參數(shù)為內(nèi)容的滾動高度
                    self.scrollTo(dragStartScrollPosition + (e.pageY - dragStartPagePosition)*dragContBarRate);
                }
                // 事件對象是經(jīng)過jQuery包裝后的,可以不用考慮兼容性問題
                slider.on('mousedown',function(e){
                    var self = this;
                    // 阻止事件默認(rèn)行為
                    e.preventDefault();
                    console.log('mousedown');
                    // 鼠標(biāo)按下時,獲得鼠標(biāo)相對于文檔頂部邊緣的距離
                    dragStartPagePosition = e.pageY;
                    // 超出元素上邊界的那部分內(nèi)容
                    // 內(nèi)容可滾動高度封裝成一個方法
                    dragStartScrollPosition = self.$cont[0].scrollTop;
                    dragContBarRate = self.getMaxScrollPosition / self.getMaxSliderPositon;
                    // 鼠標(biāo)按下時,仍能夠移動
                    // 通過事件的命名空間確定具體事件
                    doc.on('mousemove.scroll', mousemoveHandler).on('mouseup.scroll', function(e) {
                        console.log('mouseup');
                        // 可以直接通過命名空間進(jìn)行移除事件
                        doc.off('.scroll');
                    })
                })
                }
            },
            // 內(nèi)容可滾動的高度
            getMaxScrollPosition :function() {
                var self = this;
                //取最大的值(可視區(qū)的高度, 整篇內(nèi)容的完整高度)作為內(nèi)容的整體高度
                return Math.max(self.$cont.height(), self.$cont[0].scrollHeight) - self.$cont.height();
            },
            // 滑塊可移動的距離
            getMaxSliderPositon :function() {
                var self = this; 
                return self.$bar.height() - self.$slider.height();
            },
            scrollTo : function(positionVal) {
                var self = this;
                self.$cont.scrollTop(positionVal);
            } 
        });

        win.CusScrollBar = CusScrollBar;
    })(window,document,jQuery);
    new CusScrollBar({
        contSelector   : ".scroll-wrap",        //滾動內(nèi)容區(qū)選擇器
        barSelector    : ".scroll-bar",         //滾動條選擇器
        sliderSelector : ".scroll-slider"       //滾動滑塊選擇器 
    });
</script>
</div>
</body>
</html>

以下是報錯信息

Uncaught TypeError: Cannot read property '0' of undefined
回答
編輯回答
莫小染
{
...,
// 你是這樣定義的
_initDomEvent:function() {
      var opts = this.options;
      this.$cont = $(opts.contSelector);
      this.$slider = $(opts.sliderSelector);
      this.$bar = opts.barSelector ? $(opts.barSelector) : self.$slider.parent();
      this.$doc = $(doc);
      ...
    },
// 其他方法,你是這樣調(diào)用的
xxx:function() {
      var self = this;
      self.$cont/self.slider/self.$cont/self.$doc

}

這樣你的self.$cont/self.slider/self.$cont/self.$doc其實并沒有定義;
如果你的意圖是在_initDomEvent定義在其他方法里使用,那應(yīng)該類似于

{
a:{},
b:function() {
    this.a.$cont = $(opts.contSelector),
    this.a.$slider = $(opts.sliderSelector),
    ....
},
c: function() {
    this.b();
    console.log(this.a.$cont);
    }
}
2018年8月23日 21:48