vue-preview动态获取图片宽高并增加旋转功能的实现


Posted in Javascript onJuly 29, 2020

vue-preview是一个常用的图片查看器,微博网页版就是用的这个插件:

vue-preview动态获取图片宽高并增加旋转功能的实现

我在项目中也用过这个插件,总体来说,还是比较满意。但是缺少一个图片旋转功能。

安装使用

第一步:安装

npm i vue-preview -S

第二步:引用配置

import VuePreview from 'vue-preview'
Vue.use(VuePreview)
Vue.use(preview, {
 mainClass: 'pswp--minimal--dark',
 barsSize: {top: 0, bottom: 0},
 captionEl: false,
 fullscreenEl: false,
 shareEl: false,
 bgOpacity: 0.85,
 tapToClose: true,
 tapToToggleControls: false
})

第三步:使用

// 定义预览图片列表
previewlist: [
  {
    src: ‘./pic01.jpg',
    w: 1200,
    h: 900
  },
  {
    src: ‘./pic01.jpg',
    w: 1200,
    h: 900
  }
]
 
// 给图片添加“preview-img”类(必须添加且要同名),以及绑定“show”方法
<img :src="decodeURIComponent(item.name)" class="preview-img" @click="show(index)">
 
// 点击图片触发预览方法
show (index) {
  this.$preview.open(index, this. previewlist);
}

动态获取图片宽高

如果图片列表资源是从服务器获取,则需要先获取图片的真实宽高,具体代码如下:

this. previewlist = []; //查看列表
let imglist = […]; //从服务器获取的图片地址列表
show (index) {
  for (let i = 0; i < imglist.length; i++) {
    // 获取图片实际大小
    let newImage = {};
    let img = new Image();
    img.src = imglist[i];
    img.onload = function () {
      newImage.src = imglist[i];
      newImage.w = img.width;
      newImage.h = img.height;
    };
    this.previewlist.push(newImage);
  }
  // 正常情况下javascript都是按照顺序执行的。但是我们可能让该语句后面的语句执行完再执行本身,用setTimeout延时0ms来实现。
  setTimeout(() => {
    this.$preview.open(index, this.previewlist);
  }, 0);
}

新增图片旋转功能

默认的功能有全屏、放大、分享、图片切换等,有时候我们还需要图片旋转功能,怎么办呢?那只能自己动手改插件了。

第一步:添加旋转图标

图标文件路径:node_modules\photoswipe\dist\default-skin

vue-preview动态获取图片宽高并增加旋转功能的实现

原来只有前面8个图片,后面那个稍微大一点的旋转图标是我加上去的,当然你也可以把尺寸设置为和原来的一样。

第二步:添加旋转按钮到页面

页面文件路径:node_modules\vue-preview\src\plugins\preview\preview.vue

<button class="pswp__button pswp__button--rotate" title="旋转" @click="imgRotateFn"></button>

第三步:添加旋转按钮的样式

样式文件路径:node_modules\photoswipe\dist\default-skin

.pswp__button--rotate {
 background-position: -176px 0;
}

第四步:实现旋转方法

文件路径:node_modules\vue-preview\src\plugins\preview\preview.vue

imgRotateFn () {
   this.angle+=90;
   let imgNode = document.getElementsByClassName('pswp__img');
   for (let i = 0; i<imgNode.length; i++) {
      imgNode[i].style.WebkitTransform = 'rotate('+this.angle+'deg)';
   }
 }

这里我只贴出了关键代码,需要你自己做浏览器兼容,以及切换图片时,应该将图片角度设置为0等。

测试结果

vue-preview动态获取图片宽高并增加旋转功能的实现

vue-preview动态获取图片宽高并增加旋转功能的实现

测试没有问题,终于可以下班了,哈哈哈。

Tips:懒得自己动手改插件的伙伴,可以在楼主的GitHub仓库下载改好后的文件,在你安装好 vue-preview 后用“attachment”文件夹中的三个文件替换你项目中的对应文件就拥有“旋转”功能了。GitHub地址:https://github.com/xiongjun0812/vue-preview

今天就分享到这里,有问题欢迎留言交流,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery中SetTimeOut传参问题探讨
May 10 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
Apr 06 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
Jun 13 Javascript
Node.js实现简单聊天服务器
Jun 20 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
Sep 06 Javascript
浅析location.href跨窗口调用函数
Nov 22 Javascript
javascript读取文本节点方法小结
Dec 15 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
Jul 11 jQuery
swiper移动端轮播插件(触碰图片之后停止轮播)
Dec 28 Javascript
JS解析后台返回的JSON格式数据实例
Aug 06 Javascript
js中事件对象和事件委托的介绍
Jan 21 Javascript
Vue使用localStorage存储数据的方法
May 27 Javascript
vuex管理状态仓库使用详解
Jul 29 #Javascript
解决vue项目获取dom元素宽高总是不准确问题
Jul 29 #Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 #Javascript
Vue实现input宽度随文字长度自适应操作
Jul 29 #Javascript
vue 判断元素内容是否超过宽度的方式
Jul 29 #Javascript
在vue中实现给每个页面顶部设置title
Jul 29 #Javascript
vue实现移动端项目多行文本溢出省略
Jul 29 #Javascript
You might like
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
2014/05/29 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
JavaScript执行顺序详细介绍
2013/12/04 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
js设置默认时间跨度过程详解
2019/07/17 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
python Gabor滤波器讲解
2020/10/26 Python
python中封包建立过程实例
2021/02/18 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
优秀会计求职信
2014/07/04 职场文书
2015年市场部工作总结
2015/04/30 职场文书
太空授课观后感
2015/06/17 职场文书
工程移交协议书
2016/03/24 职场文书
python常见的占位符总结及用法
2021/07/02 Python
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL