js 元素大小縮放實例


 

 

元素大小縮放是一套連貫事件,按下鼠標不放,拖動鼠標 然后松開。

按下鼠標事件

當按下鼠標時,記錄元素大小、鼠標按下的位置、狀態位。

拖動鼠標事件

當鼠標拖動時,計算元素調用后的大小。

 

元素調整后大小 =  初始元素大小 + (鼠標移動位置 - 鼠標按下位置)

鼠標松開事件

當調整完成后,鼠標松開這時重置狀態位,防止移動鼠標時觸發移動事件。

 

'use strict';

class DivElement {

    /**
     * 構造函數
     * @param {object} option 
     * @param {HTMLElement} option.element
     * @param {number} option.minwidth
     * @param {number} option.minheight
     */
    constructor({ element, minwidth, minheight }) {
        this.element = element;
        this.minheight = minheight;
        this.minwidth = minwidth;
        this.state = false;
    }


    /**
     * @returns {CSSStyleDeclaration}
     */
    get style() {
        return window.getComputedStyle(this.element);
    }

    /**
     * 調整大小
     */
    resizable() {        
        let nodese = this._createSe('resizable-se');
        let [mousedownX, mousedownY, width, height] = [0, 0, 0, 0];
        
        // 鼠標按下
        nodese.addEventListener("mousedown", (event) => {
            this.state = true;   // 設置狀態位
            [mousedownX, mousedownY, width, height] = [
                event.clientX,   // 鼠標按下時X坐標
                event.clientY,   // 鼠標按下時Y坐標
                Number.parseFloat(this.style.width),  // 獲取元素寬度
                Number.parseFloat(this.style.height),  // 獲取 元素高度
            ];
        });

        // 鼠標拖動        
        document.addEventListener("mousemove", (event) => {
            if (this.state) {
                let w = width + (event.clientX - mousedownX);   // 調整后的寬度
                let h = height + (event.clientY - mousedownY);  // 調整后的高度
                if (w > this.minwidth) {              // 限制最小 寬度
                    this.element.style.width = w + 'px';
                }
                if (h > this.minheight) {   // 限制最小 高度
                    this.element.style.height = h + 'px';
                }
            }
        })

        // 鼠標松開
        this.element.addEventListener("mouseup", (event) => {
            this.state = false;   // 重置狀態位
        })
    }

    _createSe(className) {
        let node = document.createElement('div');
        node.className = className;
        this.element.appendChild(node);
        return node;
    }
}

 

<!DOCTYPE html>

<head>
    <meta charset="utf8">
    <title>縮放</title>
    <script src="DivElement.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>

<body>
    <div class="resizable">
        <h2>右下角</h2>
    </div>

    <script>
        'use strict';
        let o = new DivElement({
            element: document.querySelector('.resizable'),
            minwidth: 140,
            minheight: 140
        });
        o.resizable();
        
    </script>
</body>


</html>

 

 

.resizable {
    border: 1px #ccc solid;
    float: left;
    height: 200px;
    width: 200px;
    padding: 40px;
    position: relative;
}

.resizable-se {
    cursor: se-resize;
    width: 12px;
    height: 12px;
    right: 1px;
    bottom: 1px;
    background: url("ui-icons.png") no-repeat;
    position: absolute;
}

 

樣本:http://js.zhuamimi.cn/%E5%85%83%E7%B4%A0%E5%A4%A7%E5%B0%8F%E8%B0%83%E6%95%B4/

源碼:https://pan.baidu.com/s/1f4n0NK6QzFnQokMSWf7kEg

我的百度經驗:https://jingyan.baidu.com/article/1876c85223513b890b1376f5.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM