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对象和DOM对象使用说明
Jun 25 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
Nov 21 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
Nov 28 Javascript
微信小程序 progress组件详解及实例代码
Oct 25 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
Nov 25 Javascript
微信小程序下拉刷新界面的实现
Sep 28 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
Vue.js特性Scoped Slots的浅析
Feb 20 Javascript
Vue项目中使用WebUploader实现文件上传的方法
Jul 21 Javascript
layui 解决form表单点击无反应的问题
Oct 25 Javascript
VUE 动态组件的应用案例分析
Dec 02 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
Mar 05 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
我常用的几个类
2006/10/09 PHP
基于mysql的bbs设计(五)
2006/10/09 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
python求斐波那契数列示例分享
2014/02/14 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
详解python中的模块及包导入
2019/08/30 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
环保倡议书500字
2014/05/15 职场文书
先进党支部事迹材料
2014/12/24 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js