JavaScript限定范圍拖拽及自定義滾動(dòng)條應(yīng)用(3)
兩個(gè)對(duì)象:div1 和 div2,其中div1是div2的父元素,div2只能在div1的范圍內(nèi)拖拽

圖中,紅點(diǎn)是鼠標(biāo)的位置,兩個(gè)綠色箭頭相減的結(jié)果就是disX,最后oEvent.clientX - disX 就是綠色箭頭的部分,這個(gè)長(zhǎng)度就是判斷是否“出格”的依據(jù),也就是這個(gè)短的綠色箭頭范圍應(yīng)該在0 ~ div2.offsetWidth - div1.offsetWidth之間!
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>客戶區(qū)可見(jiàn)范圍限制拖拽</title>
<style type="text/css">
* {
padding: 0;
margin: 0;
}
#div1 {
width: 500px;
height: 500px;
background: orange;
position: relative;
left: 100px;
top: 30px;
}
#div2 {
width: 100px;
height: 100px;
background: black;
position: absolute;
border: 1px solid blue;
}
</style>
</head>
<body>
<div id="div1">
<div id="div2"></div>
</div>
<script type="text/javascript">
var oDiv1 = document.getElementById('div1');
var oDiv2 = document.getElementById('div2');
function getStyle(obj, attr) {
if (obj.currentStyle) {
return obj.currentStyle[attr];
} else {
return getComputedStyle(obj, null)[attr];
}
}
oDiv2.onmousedown = function(ev) {
var oEvent = ev || event;
// var disX = oEvent.clientX - oDiv2.offsetLeft;
// var disY = oEvent.clientY - oDiv2.offsetTop;
var disX = oEvent.clientX - parseInt(getStyle(oDiv2, 'left'));
var disY = oEvent.clientY - parseInt(getStyle(oDiv2, '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 > oDiv1.offsetWidth - /*parseInt(getStyle(oDiv2,'width'))*/oDiv2.offsetWidth) {
l = oDiv1.offsetWidth - oDiv2.offsetWidth;
}
if (t < 0) {
t = 0;
} else if (t > oDiv1.offsetHeight - oDiv2.offsetHeight) {
t = oDiv1.offsetHeight - oDiv2.offsetHeight;
}
oDiv2.style.left = l + 'px';
oDiv2.style.top = t + 'px';
};
document.onmouseup = function() {
document.onmousemove = null;//如果不取消,鼠標(biāo)彈起div依舊會(huì)隨著鼠標(biāo)移動(dòng)
document.onmouseup = null;
};
};
</script>
</body>
</html>
基于上述原理,我們來(lái)做一個(gè)自定義滾動(dòng)條,通過(guò)拖拽滾動(dòng)條的位置來(lái)控制另一個(gè)對(duì)象的大小,比如一幅圖。


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>自定義滾動(dòng)條</title>
<style type="text/css">
#div1 {
width: 600px;
height: 20px;
background: orange;
position: relative;
margin: 50px auto;
}
#div2 {
width: 20px;
height: 20px;
background: green;
position: absolute;
}
#div3 {
width: 0;
height: 0;
margin: 20px auto;
}
#div3 img {
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="div1">
<div id="div2"></div>
</div>
<div id="div3">
<img src="https://timgsa.baidu.com/141128%2F201411281041075742.jpg">
</div>
<script type="text/javascript">
var oDiv1 = document.getElementById('div1');
var oDiv2 = document.getElementById('div2');
var oDiv3 = document.getElementById('div3');
oDiv2.onmousedown = function(ev) {
var oEvent = ev || event;
var disX = oEvent.clientX - oDiv2.offsetLeft;
document.onmousemove = function(ev) {
var oEvent = ev || event;
var l = oEvent.clientX - disX;
if (l < 0) {
l = 0;
} else if (l > oDiv1.offsetWidth - oDiv2.offsetWidth) {
l = oDiv1.offsetWidth - oDiv2.offsetWidth;
}
oDiv2.style.left = l + 'px';//l范圍:[0,580]
//document.title = l / 580; //范圍:[0,1]
var ratio = oDiv1.offsetWidth - oDiv2.offsetWidth;
var scale = l / ratio;
var w = 600 * scale;
var h = 370 * scale;
console.log(w);
oDiv3.style.cssText = ';width:' + w + 'px;height:' + h +'px;';
};
document.onmouseup = function() {
document.onmousemove = null;
document.onmouseup = null;
};
};
</script>
</body>
</html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- javaScript實(shí)現(xiàn)滾動(dòng)條事件詳解
- 原生JS實(shí)現(xiàn)自定義滾動(dòng)條效果
- JS自定義滾動(dòng)條效果簡(jiǎn)單實(shí)現(xiàn)代碼
- js滾動(dòng)條平滑移動(dòng)示例代碼
- 學(xué)習(xí)使用jquery iScroll.js移動(dòng)端滾動(dòng)條插件
- js/jquery獲取瀏覽器窗口可視區(qū)域高度和寬度以及滾動(dòng)條高度實(shí)現(xiàn)代碼
- 判斷滾動(dòng)條到底部的JS代碼
- JS實(shí)現(xiàn)判斷滾動(dòng)條滾到頁(yè)面底部并執(zhí)行事件的方法
- js操作滾動(dòng)條事件實(shí)例
- javascript實(shí)現(xiàn)自定義滾動(dòng)條效果
相關(guān)文章
使用bootstrap typeahead插件實(shí)現(xiàn)輸入框自動(dòng)補(bǔ)全之問(wèn)題及解決辦法
這篇文章主要介紹了使用bootstrap typeahead插件實(shí)現(xiàn)輸入框自動(dòng)補(bǔ)全之問(wèn)題及解決辦法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
關(guān)于javascript模塊加載技術(shù)的一些思考
這篇文章主要介紹了關(guān)于javascript模塊加載技術(shù)的一些思考 ,需要的朋友可以參考下2014-11-11
利用webpack理解CommonJS和ES Modules的差異區(qū)別
這篇文章主要介紹了利用webpack理解CommonJS和ES Modules的差異區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
js實(shí)現(xiàn)網(wǎng)頁(yè)音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)網(wǎng)頁(yè)音樂(lè)播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
es6中的解構(gòu)賦值、擴(kuò)展運(yùn)算符和rest參數(shù)使用詳解
這篇文章分別給大家介紹了關(guān)于es6中解構(gòu)賦值、擴(kuò)展運(yùn)算符和rest參數(shù)使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
JavaScript實(shí)現(xiàn)的in_array函數(shù)
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的in_array函數(shù),用于判斷一個(gè)值是否在數(shù)組中,類似PHP的in_array函數(shù),需要的朋友可以參考下2014-08-08
JavaScript中實(shí)現(xiàn)異步編程模式的4種方法
這篇文章主要介紹了JavaScript中實(shí)現(xiàn)異步編程模式的4種方法,本文講解了回調(diào)函數(shù)、事件監(jiān)聽、發(fā)布/訂閱、Promises對(duì)象4種方法,需要的朋友可以參考下2014-09-09
JavaScript 判斷iPhone X Series機(jī)型的方法
這篇文章主要介紹了JavaScript 判斷iPhone X Series機(jī)型的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
js輸出數(shù)據(jù)精確到小數(shù)點(diǎn)后n位代碼
要保留小數(shù)點(diǎn)后N位的問(wèn)題,經(jīng)過(guò)一番思索,終于解決了,這篇文章主要介紹了js輸出數(shù)據(jù)精確到小數(shù)點(diǎn)后n位代碼,感興趣的朋友可以參考一下2016-07-07
nestjs實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄的示例代碼
本文主要介紹了nestjs實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

