1. 程式人生 > >調整html元素大小 resize

調整html元素大小 resize

1、使用css屬性:resize

div{ resize: both;}

resize 屬性規定是否可由使用者調整元素的尺寸。

取值:

none:預設,使用者無法調整元素的尺寸。
Both:使用者可調整元素的高度和寬度。
Horizontal:使用者可調整元素的寬度。
Vertical:使用者可調整元素的高度。

缺點:不支援ie!僅Firefox 4+、Chrome 以及 Safari 支援 resize。

2、自己造一個輪子

使用拖拽改變元素大小。
這裡寫圖片描述
以上圖為例,父層div包裹著內容區,在父層div裡還有三個div,分別位於父層div的下方,右方及右下方。拖拽下方div可改變父層div的高度,拖拽右方div可改變父層div的寬度,拖拽右下方div可改變父層div的寬度及高度。

//程式碼實現
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>resize</title>
    <style>
.myResize{ width: 300px; height:300px; position: relative; border-top: 3px solid #00f; border-left: 3px solid #00f; } .myResize .bottom, .myResize .right, .myResize .bottom-right{ position: absolute
; background: #00f; }
.myResize .bottom{ width: calc(100% - 6px); height:3px; bottom:0; cursor: s-resize; } .myResize .right{ width: 3px; height:calc(100% - 6px); right:0; cursor: e-resize; } .myResize .bottom-right{ width: 6px; height:6px; right:0; bottom:0; cursor: se-resize; } .myResize .content{ width: calc(100% - 3px); height: calc(100% - 3px); position: absolute; background: #efefef; }
</style> </head> <body> <div class="myResize"> <div class="bottom"></div> <div class="right"></div> <div class="bottom-right"></div> <div class="content"></div> </div> <script> function resize(option){ option = option || {}; var minWidth = parseInt(option.minWidth) || 5,//最小寬度,未設定則預設5 minHeight = parseInt(option.minHeight) || 5,//最小高度,未設定則預設5 el = document.querySelector(option.el), hasWidth, hasHeight; el.draggable = false; el.parentNode.draggable = false; switch(option.type){ case 'bottom':hasHeight = true;break; case 'right':hasWidth = true;break; case 'bottom-right':hasWidth = true;hasHeight = true;break; default:return; } el.onmousedown = function (e) { //滑鼠按下,計算當前元素距離可視區的距離 if(hasWidth){ var disX = e.clientX; var w = parseInt(window.getComputedStyle(el.parentNode).width); } if(hasHeight){ var disY = e.clientY; var h = parseInt(window.getComputedStyle(el.parentNode).height); } document.onmousemove = function (e) { var ew,eh; //通過事件委託,計算移動的距離 if(hasWidth){ var tx = disX - e.clientX; ew = w-tx; el.parentNode.style.width = (ew<minWidth?minWidth:ew) + 'px'; } if(hasHeight){ var ty = disY - e.clientY; eh = h-ty; el.parentNode.style.height = (eh<minHeight?minHeight:eh) + 'px'; } //回撥函式 option.callBack && option.callBack(ew?ew:eh,ew?eh:null); }; document.onmouseup = function (e) { document.onmousemove = null; document.onmouseup = null; }; }; } function callBack(w,h){ console.log(w,h) } ['bottom','right','bottom-right'].forEach(function(item,index){ resize({ el:'.'+item, type:item, callBack:callBack//回撥函式 }) }) </script> </body> </html>

vue自定義resize指令,拖拽改變父元素高度

Vue.directive('dragsize',//自定義指令
    {bind:function (el, binding, vnode) {
            el.draggable = false;
            el.onmousedown = function (e) {
                el.parentNode.draggable = false
                //滑鼠按下,計算當前元素距離可視區的距離
                let disY = e.clientY;
                let h = parseInt(window.getComputedStyle(el.parentNode).height);
                document.onmousemove = function (e) {
                    //通過事件委託,計算移動的距離
                    let t = disY - e.clientY;
                    el.parentNode.style.height = ((h+t)<5?5:(h+t)) + 'px';//最小寬度,預設5
                    //回撥函式
                    binding.value(h+t)
                };
                document.onmouseup = function (e) {
                    document.onmousemove = null;
                    document.onmouseup = null;
                };
            };
        }
    }
);