基于Vue实现图片在指定区域内移动的思路详解


Posted in Javascript onNovember 11, 2018

  当图片比要显示的区域大时,需要将多余的部分隐藏掉,我们可以通过绝对定位来实现,并通过动态修改图片的left值和top值从而实现图片的移动。具体实现效果如下图,如果我们移动的是div 实现思路相仿。

基于Vue实现图片在指定区域内移动的思路详解

此处需要注意的是

我们在移动图片时,需要通过draggable="false" 将图片的 <img src="/static/pano-dev/test/image-2.jpg" draggable="false" />,否则按下鼠标监听onmousemove事件时监听不到

然后还需要禁用图片的选中css

/*禁止元素选中*/
-moz-user-select: none; /*火狐*/
-webkit-user-select: none; /*webkit浏览器*/
-ms-user-select: none; /*IE10*/
-khtml-user-select: none; /*早期浏览器*/
user-select: none;

Vue 代码

<style lang="less" scoped>
@import url("./test.less");
</style>
<template>
 <div class="page">
  <div class="image-move-wapper">
   <div class="image-show-box" ref="imageShowBox">
    <div class="drag-container" ref="dragContainer" :style="'left:' + dragContainer.newPoint.left+'px; top:' + dragContainer.newPoint.top+'px'" @mousedown="DragContainerMouseDown">
     <div class="drag-image-box">
      <img src="/static/pano-dev/test/image-2.jpg" draggable="false" />
      <div class="point" style="left:10%; top:10%" @mousedown="PointMouseDown"></div>
     </div>
    </div>
   </div>
  </div>
 </div>
</template>
<script>
export default {
 data() {
  return {
   dragContainer: {
    box: {
     w: 0,
     h: 0
    },
    point: {
     left: 0,
     top: 0
    },
    newPoint: {
     left: 0,
     top: 0
    }
   },
   mousePoint: {
    x: 0,
    y: 0
   },
   imageShowBox: {
    box: {
     w: 0,
     h: 0
    },
    dragcheck: {
     h: true,
     v: true
    }
   }
  };
 },
 updated() {
  let _this = this;
  // 确保DOM元素已经渲染成功,然后获取拖拽容器和显示区域的大小
  _this.$nextTick(function() {
   _this.dragContainer.box = {
    w: _this.$refs.dragContainer.offsetWidth,
    h: _this.$refs.dragContainer.offsetHeight
   };
   _this.imageShowBox.box = {
    w: _this.$refs.imageShowBox.offsetWidth,
    h: _this.$refs.imageShowBox.offsetHeight
   };
   // 判断是否允许拖拽
   _this.imageShowBox.dragcheck = {
    h: _this.imageShowBox.box.w > _this.dragContainer.box.w ? false : true,
    v: _this.imageShowBox.box.h > _this.dragContainer.box.h ? false : true
   };
  });
 },
 methods: {
  // 鼠标在拖拽容器中按下时触发
  DragContainerMouseDown(e) {
   const _this = this;
   // 记录鼠标点击时的初始坐标
   this.mousePoint = {
    x: e.clientX,
    y: e.clientY
   };
   _this.dragContainer.point = _this.dragContainer.newPoint;
   document.body.onmousemove = _this.DragContainerMouseMove;
   document.onmouseup = _this.DragContainerMouseUp;
   return false;
  },
  // 容器拖拽时触发
  DragContainerMouseMove(e) {
   const _this = this;
   // 鼠标偏移量 = 初始坐标 - 当前坐标
   let dx = e.clientX - _this.mousePoint.x;
   let dy = e.clientY - _this.mousePoint.y;
   // 获取拖拽容器移动后的left和top值
   if (_this.imageShowBox.dragcheck.h)
    var newx = dx > 0 ? Math.min(0, _this.dragContainer.point.left + dx) : Math.max(- _this.dragContainer.box.w + _this.imageShowBox.box.w, _this.dragContainer.point.left + dx );
   if (_this.imageShowBox.dragcheck.v)
    var newy = dy > 0 ? Math.min(0, _this.dragContainer.point.top + dy) : Math.max(- _this.dragContainer.box.h + _this.imageShowBox.box.h, _this.dragContainer.point.top + dy );
   _this.dragContainer.newPoint = {
    left: typeof newx != 'undefined' ? newx : _this.dragContainer.point.left,
    top: typeof newy != 'undefined' ? newy : _this.dragContainer.point.top
   };
   console.log(_this.dragContainer.newPoint);
   return false;
  },
  // 移动完成 取消onmousemove和onmouseup事件
  DragContainerMouseUp(e) {
   document.body.onmousemove = null;
   document.onmouseup = null;
  },
  PointMouseDown(e) {
   //阻止事件冒泡
   e.stopPropagation();
  }
 }
};
</script>

样式表

.page {
 background: #444;
 width: 100%;
 height: 100%;
 position: relative;
 .image-move-wapper {
  position: absolute;
  right: 50px;
  top: 50px;
  background: #fff;
  box-shadow: rgba(255, 255, 255, 0.5);
  padding: 10px;
 }
 .image-show-box {
  height: 400px;
  width: 400px;
  cursor: move;
  overflow: hidden;
  position: relative;
  .drag-container {
   position: absolute;
   left: 0px;
   top: 0;
   /*禁止元素选中*/
   -moz-user-select: none; /*火狐*/
   -webkit-user-select: none; /*webkit浏览器*/
   -ms-user-select: none; /*IE10*/
   -khtml-user-select: none; /*早期浏览器*/
   user-select: none;
   .drag-image-box {
    position: relative;
    .point {
     position: absolute;
     background: red;
     height: 30px;
     width: 30px;
     border-radius: 50%;
    }
   }
  }
 }
}

总结

以上所述是小编给大家介绍的基于Vue实现图片在指定区域内移动的思路详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
用js来解决ajax读取页面乱码
Nov 28 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
Sep 25 Javascript
js HTML5 Ajax实现文件上传进度条功能
Feb 13 Javascript
基于jquery实现简单的分页控件
Mar 17 Javascript
对js中回调函数的一些看法
Aug 29 Javascript
浅谈使用React.setState需要注意的三点
Dec 18 Javascript
对vue事件的延迟执行实例讲解
Aug 28 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
Oct 29 Javascript
小程序接入腾讯位置服务的详细流程
Mar 03 Javascript
Node.js API详解之 V8模块用法实例分析
Jun 05 Javascript
解决vue请求接口第一次成功,第二次失败问题
Sep 08 Javascript
处理canvas绘制图片模糊问题
May 11 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
Nov 11 #Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 #Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 #Javascript
AngularJS上传文件的示例代码
Nov 10 #Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
Nov 10 #Javascript
优雅的在React项目中使用Redux的方法
Nov 10 #Javascript
Vue组件之单向数据流的解决方法
Nov 10 #Javascript
You might like
乐信RP2100的电路分析和打磨
2021/03/02 无线电
PHP hebrev()函数用法讲解
2019/02/21 PHP
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
javascript中通过arguments参数伪装方法重载
2014/10/08 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
使用python存储网页上的图片实例
2018/05/22 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python实现代码统计器
2019/09/19 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python和php学习哪个更有发展
2020/06/17 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
三星美国官网:Samsung美国
2017/02/06 全球购物
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
创建绿色学校先进个人材料
2014/08/20 职场文书
关键在于落实心得体会
2014/09/03 职场文书
在职员工证明书
2014/09/19 职场文书
买卖合同协议书范本
2014/10/18 职场文书
我的1919观后感
2015/06/03 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
mysql全面解析json/数组
2022/07/07 MySQL