JavaScript限制在客戶區(qū)可見范圍的拖拽(解決scrollLeft和scrollTop的問題)(2)
限制范圍的拖拽,要求被拖拽的對象必須在客戶區(qū)可見范圍!
div是body的子元素,div的left/top是針對body的,不是針對可見客戶區(qū)的,所以在拖拽的過程中不得不考慮被卷走的部分,因?yàn)榫W(wǎng)頁文檔可能很大,無論寬度還是高度都可能大于客戶區(qū),等于客戶區(qū)大小就很好處理,大于的話就得考慮scrollTop和scrollLeft,否則div會跟鼠標(biāo)脫離,因?yàn)榫嚯x都算錯(cuò)了。
/*切記:凡是clientX/Y 的 一定記得卷走的部分*/ document.body是DOM中Document對象里的body節(jié)點(diǎn), document.documentElement是文檔對象根節(jié)點(diǎn)(html)的引用, document.documentElement.scrollHeight網(wǎng)頁整體高度
function getPos(ev) {
var st = document.documentElement.scrollTop || document.body.scrollTop;
var sl = document.documentElement.scrollLeft || document.body.scrollLeft;
return {x:sl+ev.clientX, y:st+ev.clientY};
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>客戶區(qū)可見范圍限制拖拽</title>
<style type="text/css">
* {
padding: 0;
margin: 0;
}
#div1 {
width: 100px;
height: 100px;
background: orange;
position: absolute;
}
</style>
</head>
<body style="width: 200000px;height: 200000px;">
<div id="div1"></div>
<script type="text/javascript">
var oDiv = document.getElementById('div1');
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr];
} else {
return getComputedStyle(obj, null)[attr];
}
}
//getPos得到的是鼠標(biāo)當(dāng)前位置距離頁面最左/上邊的距離,包括被卷走的部分
function getPos(ev) {
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
return {
x : scrollLeft + ev.clientX,
y : scrollTop + ev.clientY
};
}
function getScrollPos() {
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
return {
x : scrollLeft,
y : scrollTop
};
}
oDiv.onmousedown = function(ev) {
var oEvent = ev || event;
var pos = getPos(oEvent);
var disX = pos.x - parseInt(getStyle(oDiv, 'left'));
var disY = pos.y - parseInt(getStyle(oDiv, 'top'));
document.onmousemove = function(ev) {
var oEvent = ev || event;
var l = oEvent.clientX - disX;
var t = oEvent.clientY - disY;
if (l < 0) {
l = 0;
} else if (l > document.documentElement.clientWidth - oDiv.offsetWidth) {
l = document.documentElement.clientWidth - oDiv.offsetWidth;
}
if (t < 0) {
t = 0;
} else if (t > document.documentElement.clientHeight - oDiv.offsetHeight) {
t = document.documentElement.clientHeight - oDiv.offsetHeight;
}
l = l + getScrollPos().x;//最后left是相對于body的,加上卷走的部分scrollLeft;
t = t + getScrollPos().y;//加上卷走的高度scrollTop
// oDiv.style.left = l + 'px';
// oDiv.style.top = t + 'px';
oDiv.style.cssText = ';left:' + l + 'px;top:' + t + 'px;';
};
document.onmouseup = function() {
document.onmousemove = null;
document.onmouseup = null;
};
};
</script>
</body>
</html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript判斷網(wǎng)頁是關(guān)閉還是刷新
本篇文章給大家介紹js判斷網(wǎng)頁是關(guān)閉還是刷新,實(shí)現(xiàn)原理就是通過離開頁面行為時(shí)間onunload觸發(fā)時(shí)間去檢測此時(shí)的瀏覽器的窗口大小,根據(jù)大小由此判斷用戶是刷新,跳轉(zhuǎn)或是關(guān)閉行為程序,需要的朋友可以參考下本文2015-09-09
基于BootStrap與jQuery.validate實(shí)現(xiàn)表單提交校驗(yàn)功能
學(xué)習(xí)前臺后臺最開始接觸的業(yè)務(wù)都是用戶注冊和登錄,下面通過本文給大家介紹BootStrap與jQuery.validate實(shí)現(xiàn)表單提交校驗(yàn)功能,感興趣的朋友一起學(xué)習(xí)吧2016-12-12
利用js實(shí)現(xiàn)遮罩以及彈出可移動(dòng)登錄窗口
本篇文章是對使用js實(shí)現(xiàn)遮罩以及彈出可移動(dòng)登錄窗口的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
js+css使DIV始終居于屏幕中間 左下 左上 右上 右下的代碼集合
js+css使DIV始終居于屏幕中間 左下 左上 右上 右下的代碼集合,需要的朋友可以參考下。2011-03-03
詳解JavaScript如何實(shí)現(xiàn)四種常用排序
這篇文章主要為大家介紹了如何利用JavaScript實(shí)現(xiàn)四個(gè)常用的排序:插入排序、交換排序、選擇排序和歸并排序,文中利用動(dòng)圖詳細(xì)介紹了實(shí)現(xiàn)過程,需要的可以參考一下2022-02-02
詳解CommonJS和ES6模塊循環(huán)加載處理的區(qū)別
這篇文章主要介紹了詳解CommonJS和ES6模塊循環(huán)加載處理的區(qū)別,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12

