JavaScript限定范圍拖拽及自定義滾動

學(xué)習(xí)筆記:
拖拽div要發(fā)生三個事件:

  1. 鼠標按下onmousedown;
  2. 鼠標移動onmousemove;
  3. 鼠標松開onmouseup;

注意事項:
(1)要防止div移出可視框,要限制div移動的橫縱坐標;
(2)防止火狐的bug, 要在最后寫上return false,阻止默認事件鳞绕;
(3)防止鼠標運動時移出div洪鸭,所以要用document.onmousemove和document.onmouseup间影,不能用oDiv.onmousemove;

1. 實例一

兩個對象:div1 和 div2膛锭,其中div1是div2的父元素搀罢,div2只能在div1的范圍內(nèi)拖拽

image.png
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>客戶區(qū)可見范圍限制拖拽</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;//如果不取消腋粥,鼠標彈起div依舊會隨著鼠標移動
    document.onmouseup = null;
   };
  };
 </script>
</body>
</html>

2. 實例二

基于上述原理晦雨,我們來做一個自定義滾動條,通過拖拽滾動條的位置來控制另一個對象的大小隘冲,比如一幅圖闹瞧。

image.png
image.png
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>自定義滾動條</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">
 ![](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>

3. 更多相關(guān)文章

  1. js中event對象詳解
  2. offsetTop、clientTop展辞、scrollTop奥邮、offsetTop各屬性介紹
  3. js實時獲取鼠標所在坐標
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市罗珍,隨后出現(xiàn)的幾起案子洽腺,更是在濱河造成了極大的恐慌,老刑警劉巖覆旱,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蘸朋,死亡現(xiàn)場離奇詭異,居然都是意外死亡扣唱,警方通過查閱死者的電腦和手機藕坯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門团南,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炼彪,你說我怎么就攤上這事吐根。” “怎么了霹购?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵佑惠,是天一觀的道長。 經(jīng)常有香客問我齐疙,道長,這世上最難降的妖魔是什么旭咽? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任贞奋,我火速辦了婚禮,結(jié)果婚禮上穷绵,老公的妹妹穿的比我還像新娘轿塔。我一直安慰自己,他們只是感情好仲墨,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布勾缭。 她就那樣靜靜地躺著,像睡著了一般目养。 火紅的嫁衣襯著肌膚如雪俩由。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天癌蚁,我揣著相機與錄音幻梯,去河邊找鬼。 笑死努释,一個胖子當著我的面吹牛碘梢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伐蒂,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼煞躬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逸邦?” 一聲冷哼從身側(cè)響起恩沛,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昭雌,沒想到半個月后复唤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡烛卧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年佛纫,在試婚紗的時候發(fā)現(xiàn)自己被綠了妓局。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡呈宇,死狀恐怖好爬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甥啄,我是刑警寧澤存炮,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站蜈漓,受9級特大地震影響穆桂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜融虽,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一享完、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧有额,春花似錦般又、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萤衰,卻和暖如春堕义,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腻菇。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工胳螟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筹吐。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓糖耸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丘薛。 傳聞我的和親對象是個殘疾皇子嘉竟,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • jQuery基礎(chǔ) 什么是JQ?一個優(yōu)秀的JS庫洋侨,大型開發(fā)必備JQ的好處舍扰?一簡化JS的復(fù)雜操作二不再需要關(guān)心兼容性三...
    幺七閱讀 941評論 0 2
  • 1. tab列表折疊效果 html: 能源系統(tǒng)事業(yè)部 崗位名稱: 工作地點 崗位名...
    lilyping閱讀 1,842評論 0 1
  • 事件對象 鼠標事件 event.clientX在可視區(qū)中,鼠標點擊的x坐標 event.clientY在可視區(qū)中希坚,...
    LaBaby_閱讀 583評論 0 1
  • 雨一直下边苹,我就干緊把室內(nèi)的花草搬出來,讓“她們”也感受一下天露裁僧,因為我發(fā)現(xiàn)雨水比人工澆的“她們”更喜歡个束,而且長更也...
    快樂小窩閱讀 168評論 0 0