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 相关文章推荐
悄悄用脚本检查你访问过哪些网站的代码
Dec 04 Javascript
JQuery在页面中添加和除移DOM示例代码
Jun 24 Javascript
jQuery响应enter键的实现思路
Apr 18 Javascript
express的中间件bodyParser详解
Dec 04 Javascript
利用JavaScript阻止表单提交的两种方法
Aug 11 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
Jan 19 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
May 05 jQuery
jquery+css实现下拉列表功能
Sep 03 jQuery
详解Angularjs 自定义指令中的数据绑定
Jul 19 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
Oct 30 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
May 20 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
Nov 06 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
聊天室php&amp;mysql(三)
2006/10/09 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
Symfony生成二维码的方法
2016/02/04 PHP
学习面向对象之面向对象的基本概念:对象和其他基本要素
2010/11/30 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
浅谈angular4实际项目搭建总结
2017/12/01 Javascript
vuex的简单使用教程
2018/02/02 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
使用Python写一个小游戏
2018/04/02 Python
python高阶爬虫实战分析
2018/07/29 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
python re.match()用法相关示例
2021/01/27 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
纯css3实现照片墙效果
2014/12/26 HTML / CSS
美国旅游网站:Tours4Fun
2017/02/17 全球购物
Farnell德国:电子元器件供应商
2018/07/10 全球购物
留学自荐信写作方法
2014/01/27 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
Go 语言结构实例分析
2021/07/04 Golang