ES6 用class方式實現鼠標拖拽

ES6 用class方式實現鼠標拖拽

鼠標拖拽div ,div隨機顏色生成

    <script>
        //1.首先創建一個拖拽類
        class Drag {
            constructor() {//constructor 類的構造函數
            //這個了作用域裏 this 代表着new操作符創建的空實例對象
                //2.新建一個dom節點                
                this.div = document.createElement('div')
                //3.給dom節點設置一些樣式
                this.div.style.cssText = `
                     width:100px;
                     height:100px;
                     position:absolute;
                     background:green;
                     left:0;
                     top:0;
                     `
                //4.讓dom節點上樹
                document.body.appendChild(this.div)
                //調用隨機顏色方法
                this.random()
                //5.調用開始方法,也就是監聽鼠標按下            
                this.start()
            }
            start() {
                //開始方法
                //在此方法中監聽鼠標按下
                //該方法需要在構造函數裏調用,用來創建一個,就start方法
                //在start作用域裏this代表着 new操作符創建的實例對象
                //6.監聽鼠標按下事件
                this.div.onmousedown =  (evt)=> {
                    //因爲let只在當前作用域中起作用。所以,我們這裏用this. 也就是用屬性的方法,保存值
                    //7.需要先找到鼠標在按下時的位置
                    this.downX=evt.clientX;
                    this.downY=evt.clientY;
                    //8.找到,div移動前的位置
                    this.downLeft=this.div.offsetLeft;
                    this.downTop=this.div.offsetTop;
                    //這個作用域裏this 代表着 onmousedown前面的變量 也就是this.div 也就是div
                    //div 是沒有move的方法的,所以我們這裏用箭頭函數來解決這個問題
                    //因爲箭頭函數是沒有this的,如果出現,他會向上找。
                    //現在this 代表的就是new操作符創建的實例對象
                    //9.調用移動方法 也就是監聽鼠標移動事件
                    this.move()
                    //10.調用停止方法  也就是監聽鼠標停止事件
                    this.end()
                }
            }
            move() {
                //移動方法
                //在此方法中監聽鼠標移動
                //在此作用域中,this 代表着 new操作符創建的實例對象
                 let that=this
                //11.監聽鼠標移動               
                window.onmousemove=function(evt){
                     //這個作用域裏this 代表着 onmousemove前面的變量 也就是window
                     //window 是沒有new操作符創建的實例對象的屬性的,這裏我們可以換一種方式解決這個問題
                     //我們可以把上面作用域的this先存起來
                     //這樣that 就是d1
                     //12.得到div移動的距離,就是現在的鼠標座標減去移動前的鼠標座標
                     let moveX=evt.clientX-that.downX;
                     let moveY=evt.clientY-that.downY;
                     //13.改變div的left 就是div在移動前的位置加上移動的距離
                     that.div.style.left=that.downLeft+moveX+'px';
                     that.div.style.top=that.downTop+moveY+'px';

                }
            }
            end() {
                //停止方法
                //在此方法中監聽鼠標擡起
                //14.監聽鼠標擡起
                window.onmouseup=function(){
                    //15.請鼠標移動,與鼠標擡起
                    window.onmousemove=null;
                    window.onmouseup=null;
                }
            }
            random(){
                //隨機顏色方法
                //在此方法中隨機顏色
                //在此作用域中,this代表着new操作符創建的實例對象
                //15.隨機顏色
                //方法一
                // let r=Math.floor(Math.random()*256)
                // let g=Math.floor(Math.random()*256)
                // let b=Math.floor(Math.random()*256)
                //設置顏色
                // this.div.style.backgroundColor=`rgb(${r},${g},${b})`          
                //方法二
                let r=Math.floor(Math.random()*0xFFFFFF)//0xFFFFFF 代表16進制數
                //0xFFFFFF只是指定了隨機數的範圍,但是得到的隨機數,依然是以10進制的數展現的
                r=r.toString(16)//轉化成16進制數
                r=('000000'+r).slice(-6);//前面補0
                //設置顏色
                this.div.style.backgroundColor=`#${r}`

            }

        }
        //調用
        new Drag();
        //如果要多個div的話。在控制檯,執行上面語句就可以了
    </script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章