CSS

图片预览放大功能实现

纯CSS或插件实现

Posted by Ayi on December 5, 2018

如何利用纯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()的方法,所以如果你恰好把你的方法命名为了这个,就会被默认执行一次,有时候会莫名出问题哦。

鸣谢

非常感谢瑰总分享这个方法给我,有想看他博客的朋友请点这里 —> 瑰总的博客

鸣谢蜡笔love小新的博客