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 相关文章推荐
用JavaScript和注册表脚本实现右键收藏Web页选中文本
Jan 28 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
Mar 13 Javascript
如何学JavaScript?前辈的经验之谈
Dec 28 Javascript
分享十三个最佳JavaScript数据网格库
Apr 07 Javascript
VueJs监听window.resize方法示例
Jan 17 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
Apr 08 Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 Javascript
js单线程的本质 Event Loop解析
Oct 29 Javascript
vue与django集成打包的实现方法
Nov 11 Javascript
Openlayers实现地图的基本操作
Sep 28 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
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
php中变量及部分适用方法
2008/03/27 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
Python中List.count()方法的使用教程
2015/05/20 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
Java中的基本数据类型所占存储空间大小固定的吗
2012/02/15 面试题
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
带你了解Java中的ForkJoin
2022/04/28 Java/Android