vue.js实现双击放大预览功能


Posted in Javascript onJune 23, 2020

本文实例为大家分享了vue.js实现双击放大预览的具体代码,供大家参考,具体内容如下

vue.js实现双击放大预览功能

vue.js实现双击放大预览功能

imgPreview组件

<template>
 <div class="vue-uploader" @keyup.esc.native="hide">
 <div v-if="visible" @click.self="hide" class="img_model" >
 <div class="img-btn btn-pre" @click="preImg" v-show="imgList.length>1"><i class="el-icon-arrow-left"></i></div>
 <div class="img-btn btn-next" @click="nextImg" v-show="imgList.length>1"><i class="el-icon-arrow-right"></i></div>
 <div class="center-box">
 <div class="img_box" v-bind:style="{ transform: 'rotate(' + deg + 'deg)' }">
  <img :src="imgList[imgIndex]" alt="" id="oImg" @click="e=>e.stopPropagation()" v-bind:style="{ zoom: zoom }">
 </div>
 </div>
 <div @click="e=>e.stopPropagation()" class="btns">
 <img src="https://static-frontpicture.lexing360.com/min.png" @click="imgToSize(false)">
 <img src="https://static-frontpicture.lexing360.com/rotate.png" @click="rotate">
 <img src="https://static-frontpicture.lexing360.com/plus.png" @click="imgToSize(true)">
 </div>
 </div>
 </div>
</template>
<script>
 export default {
 props: {
 initImgIndex: {
 required: true
 },
 imgList: {
 required: true,
 },
 visible: {
 required: true
 },
 },
 data() {
 return {
 src: '',
 pasteText: '',
 zoom: '100%',
 imgIndex: 0,
 deg: 0,
 firstTag: true
 }
 },
 created () {
 this.imgIndex = this.initImgIndex
 },
 watch: {
 visible(val) {
 this.imgIndex = this.initImgIndex
 this.zoom = '100%'
 this.firstTag = true
 this.$emit('update:visible', val);
 if (val) {
  this.$emit('open');
 } else {
  this.$el.removeEventListener('scroll', this.updatePopper);
  this.$emit('close');
 }
 }
 },
 methods: {
 imgToSize(oBool) {
 if (this.firstTag && !oBool && document.getElementById('oImg') && document.getElementById('oImg').naturalWidth > window.innerWidth) {
  this.zoom = parseInt(window.innerWidth * 0.9 / document.getElementById('oImg').naturalWidth * 100) + '%'
  this.firstTag = false
 }
 if ((document.getElementById('oImg').width * parseInt(this.zoom) / 100 <= 200 || this.zoom == '2%') && !oBool) {
  this.$message.info('已经最小了!')
  return
 }
 if (document.getElementById('oImg') && document.getElementById('oImg').x <= window.innerWidth * 0.05 && oBool) {
  this.$message.info('已经最大了!')
  return
 }
 this.zoom = parseInt(this.zoom) + (oBool ? 2 : -2) + '%'; 
 },
 rotate () {
 this.deg += 90
 },
 nextImg (e) {
 e.stopPropagation()
 if (this.imgIndex == this.imgList.length-1) {
  this.imgIndex = 0
 } else {
  this.imgIndex ++
 }

 },
 preImg(e) {
 e.stopPropagation()
 if (this.imgIndex == 0) {
  this.imgIndex = this.imgList.length - 1
 } else {
  this.imgIndex --
 }
 },
 
 hide (cancel) {
 if (cancel !== false) {
  this.$emit('update:visible', false);
  this.$emit('visible-change', false);
 }
 },
 }
 }
</script>
<style>
 .img_model{
 position: fixed;
 width: 100%;
 min-height: 100%;
 background: rgba(0,0,0,.5);
 top: 0;
 left: 0;
 z-index: 9999;
 /* text-align: center; */
 display: flex;
 flex-direction: column;
 justify-content: center;
 align-items: center; 
 }
 .center-box {
 position: relative;
 max-width: 90%;
 }
 .img_model .img_box {
 max-width: 100%;
 max-height: 800px;
 overflow-y: scroll;
 }
 .img_model .img_box::-webkit-scrollbar {
 display: none;
}
 .img_model .img_box img{
 max-width: 100%;
 }
 .img_model .img-btn {
 position: absolute;
 top: 50%;
 transform: translateY(-50%);
 z-index: 100;
 width: 50px;
 height: 70px;
 font-size: 30px;
 line-height: 70px;
 text-align: center;
 background: rgba(255, 255, 255, .3);
 color: #FFF;
 }
 .img_model .btn-pre {
 left: 5%;
 }
 .img_model .btn-next {
 right: 5%;
 }
 .img_model .img_box .btn-next {
 right: 20rpx;
 }
 .img_model .btns{
 position: fixed;
 bottom: 25px;
 -webkit-user-select:none;
 -moz-user-select:none;
 -ms-user-select:none;
 user-select:none;
 }
</style>

引入这个组件

import imgPreview from './imgPreview'
 data:{
 return{
 bigImgShow: false,
 bigImgIndex:'',
 imgList:[],
 }
 }
 components: {
 imgPreview
 }, 
 method:{
 previewImage (imgList, index) {
 if (imgList) {
  this.imgList = imgList
  this.bigImgIndex = index
  this.bigImgShow = true
 }
 },
 }

template里面渲染

<imgPreview :visible.sync="bigImgShow" :initImgIndex="bigImgIndex" :imgList="imgList"></imgPreview>

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 显示当前系统时间代码
Dec 28 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
Dec 28 Javascript
JavaScript—window对象使用示例
Dec 09 Javascript
jQuery自定义事件的简单实现代码
Jan 27 Javascript
JavaScript数组常用操作技巧汇总
Nov 17 Javascript
javascript中传统事件与现代事件
Jun 23 Javascript
jQuery实现简单隔行变色的方法
Feb 20 Javascript
详解Javascript中的Object对象
Feb 28 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
Jun 13 Javascript
简单实现轮播图效果的实例
Jul 15 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 jQuery
vue实现分页的三种效果
Jun 23 #Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
Jun 23 #Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 #Javascript
详细分析Node.js 多进程
Jun 22 #Javascript
详细分析vue响应式原理
Jun 22 #Javascript
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 #Javascript
如何解决jQuery 和其他JS库的冲突
Jun 22 #jQuery
You might like
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
javascript 精粹笔记
2010/05/09 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
js模糊查询实例分享
2016/12/26 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
浅谈node的事件机制
2017/10/09 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
Vue利用Blob下载原生二进制数组文件
2019/09/25 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
详细解析Python当中的数据类型和变量
2015/04/25 Python
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
详解Python发送邮件实例
2016/01/10 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
原装进口全世界:天猫国际
2016/08/03 全球购物
美国在线珠宝商店:SZUL
2017/02/11 全球购物
手机银行营销方案
2014/03/14 职场文书
投标保密承诺书
2014/05/19 职场文书
小学生环保标语
2014/06/13 职场文书
商业门面租房协议书
2014/11/25 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书