大致介紹
拖拽改變元素大小是在模擬拖拽上增加了一些功能
拖拽改變元素大小原理
首先這個方塊得知道我們想要改變這個它的大小,所以我給它設定一個范圍,當點擊這個范圍時表明我們想要改變它的大小

當我們點擊方塊的這些紅色區域時,方快就知道我們想要改變它的大小
代碼實現:
// 獲取event對象,兼容性寫法
var ev = ev || event;
// 鼠標按下時的位置
var mouseDownX = ev.clientX;
var mouseDownY = ev.clientY;
// 方塊上下左右四個邊的位置和方塊的長寬
var T0 = this.offsetTop;
var B0 = this.offsetTop + this.offsetHeight;
var L0 = this.offsetLeft;
var R0 = this.offsetLeft + this.offsetWidth;
var W = this.offsetWidth;
var H = this.offsetHeight;
// 設置方塊的識別范圍
var areaT = T0 + 10;
var areaB = B0 - 10;
var areaL = L0 + 10;
var areaR = R0 - 10;
其中areaT、areaB、areaL、areaR就是紅色的區域
接下來方塊知道我們想要改變它的大小了,但是要怎麼改變,朝哪種方向改變大小。所以要判斷改變大小的方向
代碼實現:
// 判斷改變方塊的大小的方向
// 左
var changeL = mouseDownX < areaL;
// 右
var changeR = mouseDownX > areaR;
// 上
var changeT = mouseDownY < areaT;
// 下
var changeB = mouseDownY > areaB;
接下來就是最重要的改變樣式了
代碼實現:
//根據改變方塊大小的方向不同進行大小的改變
// 左
if(changeL){
oDiv.style.width = (mouseDownX - mouseMoveX) + W + 'px';
oDiv.style.left = L0 - (mouseDownX - mouseMoveX) + 'px';
}
// 右
if(changeR){
oDiv.style.width = (mouseMoveX - mouseDownX) + W + 'px';
}
// 上
if(changeT){
oDiv.style.height = (mouseDownY - mouseMoveY) + H + 'px';
oDiv.style.top = T0 - (mouseDownY - mouseMoveY) + 'px';
}
// 下
if(changeB){
oDiv.style.height = (mouseMoveY - mouseDownY) + H +'px';
}
注意:在改變左側和上側時要同時修改方塊的位置,不然會出現拖左側邊而右側邊位置擴大的現象(拖動上側邊下側邊位置變大)
代碼優化
未優化前的代碼:
var oDiv = document.getElementById('div1');
oDiv.onmousedown = function(ev){
// 獲取event對象,兼容性寫法
var ev = ev || event;
// 鼠標按下時的位置
var mouseDownX = ev.clientX;
var mouseDownY = ev.clientY;
// 方塊上下左右四個邊的位置和方塊的長寬
var T0 = this.offsetTop;
var B0 = this.offsetTop + this.offsetHeight;
var L0 = this.offsetLeft;
var R0 = this.offsetLeft + this.offsetWidth;
var W = this.offsetWidth;
var H = this.offsetHeight;
// 設置方塊的識別范圍
var areaT = T0 + 10;
var areaB = B0 - 10;
var areaL = L0 + 10;
var areaR = R0 - 10;
// 判斷改變方塊的大小的方向
// 左
var changeL = mouseDownX < areaL;
// 右
var changeR = mouseDownX > areaR;
// 上
var changeT = mouseDownY < areaT;
// 下
var changeB = mouseDownY > areaB;
oDiv.onmousemove = function(ev){
var ev = ev || event;
// 鼠標移動時的鼠標位置
var mouseMoveX = ev.clientX;
var mouseMoveY = ev.clientY;
//根據改變方塊大小的方向不同進行大小的改變
// 左
if(changeL){
oDiv.style.width = (mouseDownX - mouseMoveX) + W + 'px';
oDiv.style.left = L0 - (mouseDownX - mouseMoveX) + 'px';
}
// 右
if(changeR){
oDiv.style.width = (mouseMoveX - mouseDownX) + W + 'px';
}
// 上
if(changeT){
oDiv.style.height = (mouseDownY - mouseMoveY) + H + 'px';
oDiv.style.top = T0 - (mouseDownY - mouseMoveY) + 'px';
}
// 下
if(changeB){
oDiv.style.height = (mouseMoveY - mouseDownY) + H +'px';
}
// 限定范圍
if(parseInt(oDiv.style.width) < 50){
oDiv.style.width = 50 + 'px';
}
if(parseInt(oDiv.style.height) < 50){
oDiv.style.height = 50 + 'px';
}
}
oDiv.onmouseup = function(){
oDiv.onmousemove = null;
}
}
這段代碼現在主要有兩個問題:
1、當鼠標移動過快移出方塊時,就不能夠繼續改變元素的大小了
解決方案:把onmousemove事件和onmouseup事件綁定到document對象上
2、當方塊中有文字時,拖拽改變方塊大小時會觸發浏覽器默認的原生拖放行為
解決方案:1、阻止浏覽器的默認行為(IE8浏覽器除外)
在onmousedown中添加語句 return false
2、設置全局捕獲(IE8)
在onmousedown中設置全局捕獲
在onmouseup中取消全局捕獲
優化後的代碼:
<div id="div1">adfadsf</div>
<script type="text/javascript">
var oDiv = document.getElementById('div1');
oDiv.onmousedown = function(ev){
// 獲取event對象,兼容性寫法
var ev = ev || event;
// 鼠標按下時的位置
var mouseDownX = ev.clientX;
var mouseDownY = ev.clientY;
// 方塊上下左右四個邊的位置和方塊的長寬
var T0 = this.offsetTop;
var B0 = this.offsetTop + this.offsetHeight;
var L0 = this.offsetLeft;
var R0 = this.offsetLeft + this.offsetWidth;
var W = this.offsetWidth;
var H = this.offsetHeight;
// 設置方塊的識別范圍
var areaT = T0 + 10;
var areaB = B0 - 10;
var areaL = L0 + 10;
var areaR = R0 - 10;
// 判斷改變方塊的大小的方向
// 左
var changeL = mouseDownX < areaL;
// 右
var changeR = mouseDownX > areaR;
// 上
var changeT = mouseDownY < areaT;
// 下
var changeB = mouseDownY > areaB;
// IE8 取消默認行為-設置全局捕獲
if(oDiv.setCapture){
oDiv.setCapture();
}
document.onmousemove = function(ev){
var ev = ev || event;
// 鼠標移動時的鼠標位置
var mouseMoveX = ev.clientX;
var mouseMoveY = ev.clientY;
//根據改變方塊大小的方向不同進行大小的改變
// 左
if(changeL){
oDiv.style.width = (mouseDownX - mouseMoveX) + W + 'px';
oDiv.style.left = L0 - (mouseDownX - mouseMoveX) + 'px';
}
// 右
if(changeR){
oDiv.style.width = (mouseMoveX - mouseDownX) + W + 'px';
}
// 上
if(changeT){
oDiv.style.height = (mouseDownY - mouseMoveY) + H + 'px';
oDiv.style.top = T0 - (mouseDownY - mouseMoveY) + 'px';
}
// 下
if(changeB){
oDiv.style.height = (mouseMoveY - mouseDownY) + H +'px';
}
// 限定范圍
if(parseInt(oDiv.style.width) < 50){
oDiv.style.width = 50 + 'px';
}
if(parseInt(oDiv.style.height) < 50){
oDiv.style.height = 50 + 'px';
}
}
document.onmouseup = function(){
document.onmousemove = null;
// 釋放全局捕獲
if(oDiv.releaseCapture){
oDiv.releaseCapture();
}
}
return false;
}
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持!