基于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 选择器部分整理
Oct 28 Javascript
jQuery DOM操作实例
Mar 05 Javascript
JavaScript几种数组去掉重复值的方法推荐
Apr 12 Javascript
JS Attribute属性操作详解
May 19 Javascript
javascript 面向对象function详解及实例代码
Feb 28 Javascript
解决Vue编译时写在style中的路径问题
Sep 21 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
Apr 20 Javascript
对vue中v-if的常见使用方法详解
Sep 28 Javascript
vue项目中mock.js的使用及基本用法
May 22 Javascript
JS/CSS实现字符串单词首字母大写功能
Sep 03 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 Javascript
vue常用高阶函数及综合实例
Feb 25 Vue.js
微信小程序车牌号码模拟键盘输入功能的实现代码
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
非常好用的Zend Framework分页类
2014/06/25 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
分享PHP守护进程类
2015/12/30 PHP
高质量PHP代码的50个实用技巧必备(上)
2016/01/22 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
Javascript之this关键字深入解析
2013/11/12 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
Python 解析XML文件
2009/04/15 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
Python序列化pickle模块使用详解
2020/03/05 Python
英国床垫在线:Mattress Online
2016/12/07 全球购物
Missguided美国官网:英国时尚品牌
2018/01/18 全球购物
奥巴马演讲稿
2014/01/08 职场文书
高中教师考核方案
2014/05/18 职场文书
护士年终考核评语
2014/12/31 职场文书
离婚案件答辩状
2015/05/22 职场文书
文明礼貌主题班会
2015/08/14 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python