基于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 相关文章推荐
妙用Jquery的val()方法
Jun 27 Javascript
3种不同方式的焦点图轮播特效分享
Oct 30 Javascript
使表格的标题列可左右拉伸jquery插件封装
Nov 24 Javascript
javascript实现切换td中的值
Dec 05 Javascript
JS基于面向对象实现的放烟花效果
May 07 Javascript
ECMAScript6块级作用域及新变量声明(let)
Jun 12 Javascript
JS实现动态增加和删除li标签行的实例代码
Oct 16 Javascript
bootstrap table 数据表格行内修改的实现代码
Feb 13 Javascript
JavaScript实现简单的树形菜单效果
Jun 23 Javascript
Vue项目中如何使用Axios封装http请求详解
Oct 23 Javascript
通过微信公众平台获取公众号文章的方法示例
Dec 25 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
微信小程序车牌号码模拟键盘输入功能的实现代码
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
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
js实现文字在按钮上滚动的方法
2015/08/20 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
JavaScript实现三级级联特效
2017/11/05 Javascript
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
基于Nodejs的Tcp封包和解包的理解
2018/09/19 NodeJs
javascript中如何判断类型汇总
2019/05/14 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
vue实现简单学生信息管理
2020/05/30 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
python基本语法练习实例
2017/09/19 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
DAWGS鞋官方网站:鞋,凉鞋,靴子
2016/10/04 全球购物
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
护士实习自我鉴定
2013/10/22 职场文书
家长给孩子的评语
2014/01/30 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
检讨书怎么写?
2019/06/21 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
java实现面板之间切换功能
2022/06/10 Java/Android