JSFiddle - React, Tailwind, and code Playground

by Lianer

HTML

<div id="list" class="list">
    <img src="http://oon8abkc0.bkt.clouddn.com/photoview-2.jpg" alt="">
    <img src="http://oon8abkc0.bkt.clouddn.com/photoview-4.png" alt="">
    <img src="http://oon8abkc0.bkt.clouddn.com/photoview-3.png" alt="">
    <img src="http://oon8abkc0.bkt.clouddn.com/photoview-1.jpg" alt="">
</div>

CSS

/* PhotoView */
.photoview{
  display: none;
  position: fixed;left: 0;top: 0;right: 0;bottom: 0;z-index: 100;overflow: hidden;
  background: rgba(0, 0, 0, .8);
  transition: all 0.3s ease-out;
  moz-user-select: -moz-none;
  -moz-user-select: none;
  -o-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
.photoview-container{
  position: relative;width: 100%;height: 100%;
}
.photoview-scale-value{
  position: absolute;left: 0;top: 0;right: 0;bottom: 0;margin: auto;z-index: 2;
  width: 3em;height: 20px;line-height: 20px;text-align: center;
  background: rgba(0, 0, 0, .7);color: #fff;border-radius: 20px;
  opacity: 0;
  transition: opacity 0.1s ease-out;
}
.photoview-view{
  position: absolute;
  cursor: all-scroll;
  background-repeat: no-repeat;
  background-position: 50% 50%;
  background-size: 100% 100%;
  box-shadow: 0 5px 25px 0 rgba(0, 0, 0, 0.4);
  transition: width 0.3s ease-out, 
    height 0.3s ease-out, 
    left 0.3s ease-out, 
    top 0.3s ease-out;
}
.photoview-close{position: absolute;right: 10px;top: 10px;color: #fff;cursor: pointer;}
.photoview-control{
  position: absolute;left: 0;right: 0;bottom: 0;height: 120px;
  background-color: rgba(0, 0, 0, .6);opacity: 0;
  transition: all 0.3s ease-out;
}
.photoview-control:hover{opacity: 1;}
.photoview-control-queue{
  position: absolute;left: 0;top: 15px;width: 10000%;height: 60px;
  transition: all 0.4s ease-out;
}
.photoview-control-queue p{
  display: inline-block;width: 60px;height: 60px;margin: 0 2px;background-color: rgba(0, 0, 0, .8);
  background-size: cover;cursor: pointer;
  transition: all 0.2s ease-out;
}
.photoview-control-queue p.active{
  opacity: 1;
}
.photoview-control-edit{
  position: absolute;left: 0;bottom: 15px;width: 100%;height: 15px;
  text-align: center;
}
.photoview-control-edit:before{
  content: "";position: absolute;left: 50%;top: -20px;width: 0;height: 0;margin-left: -10px;overflow: hidden;
  border:...

JavaScript

/**
 * 照片浏览
 * --
 * @author Lianer
 * @version 2015.06.11
 * @description 带有常用照片查看功能,包括缩放、自适应、移动、切换、旋转、下载,ie9+
 * @example
 *   var pv=new PhotoView();
 *   pv.add(["1.jpg", "2.jpg", "3.jpg"]);  // 追加列表
 *   pv.show();   // 显示
 *   pv.close();  // 关闭
 *   pv.aim(1);   // 定位到指定位置
 *   pv.reset();  // 重置
 */

(function() {
    "use strict";
    var PhotoView = window.PhotoView = function() {

        var createElement = function(type, className, parent) {
            var elem = document.createElement(type);
            if (className) elem.className = className;
            if (parent) parent.appendChild(elem);
            return elem;
        };

        var bindWheel = function(elem, fn, cancelBubble) {
            if ("onwheel" in document) {
                elem.onwheel = handler;
            } else if ("onmousewheel" in document) {
                elem.onmousewheel = handler;
            } else {
                return false;
            }
            return true;

            function handler(e) {
                e = window.event || e;
                var deltaX = e.deltaX || // wheel
                    -e.wheelDeltaX || // onmousewheel
                    0; // firefox,DOMMouseScroll不支持2D

                var deltaY = e.deltaY || // wheel
                    -e.wheelDeltaY || // onmousewheel
                    -e.wheelDelta || // 1D
                    e.detail || // firefox,DOMMouseScroll
                    0;

                deltaX = deltaX > 0 ? 1 : deltaX < 0 ? -1 : 0;
                deltaY = deltaY > 0 ? 1 : deltaY < 0 ? -1 : 0;

                fn(deltaY, deltaX, e);

                if (cancelBubble) {
                    if (e.preventDefault) e.preventDefault();
                    if (e.stopPropagation) e.stopPropagation();
                    e.cancelBubble = true;
                    e.returnValue = false;
                    return false;
                }
            }
        };


        var pv = function() {
            this.index = 0;
 ...