調整html元素大小 resize
阿新 • • 發佈:2019-02-06
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;
};
};
}
}
);