JavaScript限定范围拖拽及自定义滚动条应用(3)


Posted in Javascript onMay 17, 2017

两个对象:div1 和 div2,其中div1是div2的父元素,div2只能在div1的范围内拖拽

JavaScript限定范围拖拽及自定义滚动条应用(3)

图中,红点是鼠标的位置,两个绿色箭头相减的结果就是disX,最后oEvent.clientX - disX 就是绿色箭头的部分,这个长度就是判断是否“出格”的依据,也就是这个短的绿色箭头范围应该在0 ~ div2.offsetWidth - div1.offsetWidth之间!

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>客户区可见范围限制拖拽</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>

基于上述原理,我们来做一个自定义滚动条,通过拖拽滚动条的位置来控制另一个对象的大小,比如一幅图。

JavaScript限定范围拖拽及自定义滚动条应用(3)

JavaScript限定范围拖拽及自定义滚动条应用(3)

<!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">
 <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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 解析xml文件
Aug 09 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
Apr 07 Javascript
JS.elementGetStyle(element, style)应用示例
Sep 24 Javascript
YUI模块开发原理详解
Nov 18 Javascript
jquery ajax jsonp跨域调用实例代码
Dec 11 Javascript
jQueryMobile之Helloworld与页面切换的方法
Feb 04 Javascript
JavaScript字符串常用类使用方法汇总
Apr 14 Javascript
超全面的vue.js使用总结
Feb 12 Javascript
swiper 自动图片无限轮播实现代码
May 21 Javascript
js实现网页同时进行多个倒计时功能
Feb 25 Javascript
Vue组件通信的几种实现方法
Apr 25 Javascript
Vue 监听元素前后变化值实例
Jul 29 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 #Javascript
12个非常有用的JavaScript技巧
May 17 #Javascript
Javascript中的async awai的用法
May 17 #Javascript
ES6入门教程之Iterator与for...of循环详解
May 17 #Javascript
angular.fromJson与toJson方法用法示例
May 17 #Javascript
Node.js编写CLI的实例详解
May 17 #Javascript
ES6入门教程之Class和Module详解
May 17 #Javascript
You might like
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
Jquery实现图片预加载与延时加载的方法
2014/12/22 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
ES6中Array.includes()函数的用法
2017/09/20 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
解决Layui 表单提交数据为空的问题
2018/08/15 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
在Django中创建第一个静态视图
2015/07/15 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
浅析Python函数式编程
2018/10/06 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
早会主持词
2014/03/17 职场文书
职称评定自我鉴定
2014/03/18 职场文书
公司年会搞笑主持词
2014/03/24 职场文书
聘用意向书范本
2014/04/01 职场文书
个人求职信范文
2014/05/24 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书