如何利用纯css实现放大和缩小
页面布局和数据定义
<div id="Imgs">
<img :id="'myImg' + index" class="imgplus" v-for="(item, index) in picArr" :key="index" :src="item.picPath" height="120">
</div>
<div id="myModal" class="modal">
<span id="close">×</span>
<img class="modal-content" id="img01">
</div>
picArr: [{
picPath: ''
}]
css实现
.imgplus {
border-radius: 5px;
cursor: pointer;
transition: 0.3s;
}
.imgplus:hover {
opacity: 0.7;
}
/* The Modal (background) */
.modal {
display: none;
/* Hidden by default */
position: fixed;
/* Stay in place */
z-index: 1;
/* Sit on top */
padding-top: 100px;
/* Location of the box */
left: 0;
top: 0;
width: 100%;
/* Full width */
height: 100%;
/* Full height */
overflow: auto;
/* Enable scroll if needed */
background-color: rgb(0, 0, 0);
/* Fallback color */
background-color: rgba(0, 0, 0, 0.9);
/* Black w/ opacity */
}
/* Modal Content (image) */
.modal-content {
margin: auto;
display: block;
width: 80%;
max-width: 700px;
}
/* Add Animation */
.modal-content {
-webkit-animation-name: zoom;
-webkit-animation-duration: 0.6s;
animation-name: zoom;
animation-duration: 0.6s;
}
@-webkit-keyframes zoom {
from {
-webkit-transform: scale(0)
}
to {
-webkit-transform: scale(1)
}
}
@keyframes zoom {
from {
transform: scale(0.1)
}
to {
transform: scale(1)
}
}
/* The Close Button */
#close {
position: absolute;
top: 15px;
right: 35px;
color: #f1f1f1;
font-size: 40px;
font-weight: bold;
transition: 0.3s;
}
#close:hover,
#close:focus {
color: #bbb;
text-decoration: none;
cursor: pointer;
}
/* 100% Image Width on Smaller Screens */
@media only screen and (max-width: 700px) {
.modal-content {
width: 100%;
}
}
方法实现
let Imgs = document.getElementById('Imgs')
let imgs = Imgs.getElementsByTagName('img')
for (let i = 0; i < imgs.length; i++) {
imgs[i].index = i
imgs[i].onclick = function () {
// console.log(this.getAttribute('id'))
// console.log(this.index)
let modal = document.getElementById('myModal') // 获取模态窗口
let img = document.getElementById(this.getAttribute('id')) // 获取图片模态框
let modalImg = document.getElementById('img01')
modal.style.display = 'block'
modalImg.src = img.src
let span = document.getElementById('close') // 设置关闭模态按钮
span.onclick = function () { // 关闭模态框
modal.style.display = 'none'
}
}
}
主要思路:根据后台返回的图片数量,动态生成多个img标签,每个img标签生成时候带有一个id,其中包含索引,然后遍历每一个标签,绑定一个点击事件,用css写一个模态动画,动态进行缩放。
实现效果
利用vue标签实现图片预览
插件安装
npm install vue-photo-preview
在vue项目的main.js引进
import preview from 'vue-photo-preview'
import 'vue-photo-preview/dist/skin.css
Vue.use(preview)
页面布局
<div id="Imgs">
<img class="imgplus" v-for="(item, index) in picArr" :key="index" :src="item.picPath" height="120" preview preview-text="查看图片">
</div>
调用方法
this.$previewRefresh() // 在加载图片的方法里使用,否则会为空
要避免的坑
使用了这个插件以后,组件里的不要把方法命名为init(),因为这个插件全局混入了一个方法会调用名字为init()的方法,所以如果你恰好把你的方法命名为了这个,就会被默认执行一次,有时候会莫名出问题哦。
鸣谢
非常感谢瑰总分享这个方法给我,有想看他博客的朋友请点这里 —> 瑰总的博客