唐点伯虎 發表於 2020-7-25 18:06:00

React图片预览组件,支持缩放、旋转、上一张下一张功能

<p>1、<strong>功能需求:</strong>由于项目业务需要一个图片预览的功能,又不想引入太多组件依赖,所以决定自己编写一套,实现了图片放大缩小、旋转、查看下一张或上一张图片功能,如图1.0截图所示。</p>
<p>2、<strong>外部资源:</strong>这里的icon图标采用的是 iconfont 里面的图标,可自行寻找自己喜欢的图标代替,或者使用默认的图标,默认的图标css地址为</p>
<p class="p1"><span class="s1">  https://at.alicdn.com/t/font_1966765_c473t2y8dvr.css</span></p>
<p>3、<strong>功能说明:</strong>该组件支持鼠标滚轮放大缩小及esc关闭功能,也可通过配置进行禁用,根据项目实际应用进行配置。这里采用的 less 进行样式编写。</p>
<p>4、<strong>组件名称:</strong>Photo-preview。</p>
<p>5、<strong>组件截图:</strong></p>
<p>&nbsp; &nbsp; &nbsp;<img src="https://img2020.cnblogs.com/blog/659357/202007/659357-20200725175849480-408291671.png"></p>
<p>                 &nbsp; &nbsp;<span style="background-color: rgba(255, 153, 0, 1); color: rgba(0, 0, 0, 1)"> 图1.0截图&nbsp; &nbsp;&nbsp;</span></p>
<p><span style="color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1)">6、<strong>组件代码:</strong></span></p>
<p><span style="color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1)">less 样式:</span></p>
<div class="cnblogs_code"><img id="code_img_closed_08756f83-f7a1-44b3-9de5-45cea18de170" class="code_img_closed lazyload" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_08756f83-f7a1-44b3-9de5-45cea18de170" class="code_img_opened lazyload" style="display: none" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_08756f83-f7a1-44b3-9de5-45cea18de170" class="cnblogs_code_hide">
<pre><span style="color: rgba(128, 0, 0, 1)">.photo-preview__thumb-img </span>{<span style="color: rgba(255, 0, 0, 1)">
    cursor</span>:<span style="color: rgba(0, 0, 255, 1)"> pointer</span>;
}<span style="color: rgba(128, 0, 0, 1)">

.photo-preview </span>{<span style="color: rgba(255, 0, 0, 1)">
    margin</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
    position</span>:<span style="color: rgba(0, 0, 255, 1)"> fixed</span>;<span style="color: rgba(255, 0, 0, 1)">
    left</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
    top</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
    bottom</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
    right</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
    z-index</span>:<span style="color: rgba(0, 0, 255, 1)"> 999999</span>;<span style="color: rgba(255, 0, 0, 1)">
    background-color</span>:<span style="color: rgba(0, 0, 255, 1)"> rgba(0, 0, 0, 0.5)</span>;<span style="color: rgba(255, 0, 0, 1)">
    animation</span>:<span style="color: rgba(0, 0, 255, 1)"> fadeIn 0.4s</span>;<span style="color: rgba(255, 0, 0, 1)">

    .photo-preview__in {
      position</span>:<span style="color: rgba(0, 0, 255, 1)"> absolute</span>;<span style="color: rgba(255, 0, 0, 1)">
      left</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
      top</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
      right</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
      bottom</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
      overflow</span>:<span style="color: rgba(0, 0, 255, 1)"> auto</span>;<span style="color: rgba(255, 0, 0, 1)">
      user-select</span>:<span style="color: rgba(0, 0, 255, 1)"> none</span>;<span style="color: rgba(255, 0, 0, 1)">
      display</span>:<span style="color: rgba(0, 0, 255, 1)"> flex</span>;<span style="color: rgba(255, 0, 0, 1)">
      justify-content</span>:<span style="color: rgba(0, 0, 255, 1)"> center</span>;<span style="color: rgba(255, 0, 0, 1)">
      align-items</span>:<span style="color: rgba(0, 0, 255, 1)"> center</span>;<span style="color: rgba(255, 0, 0, 1)">

      &amp;</span>:<span style="color: rgba(0, 0, 255, 1)">:-webkit-scrollbar {
            width: 15px</span>;<span style="color: rgba(255, 0, 0, 1)">
            height</span>:<span style="color: rgba(0, 0, 255, 1)"> 15px</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      &amp;::-webkit-scrollbar-track </span>{<span style="color: rgba(255, 0, 0, 1)">
            border-radius</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      &amp;::-webkit-scrollbar-thumb </span>{<span style="color: rgba(255, 0, 0, 1)">
            border-radius</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;<span style="color: rgba(255, 0, 0, 1)">
            background-color</span>:<span style="color: rgba(0, 0, 255, 1)"> silver</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      .photo-preview__img-wrap </span>{<span style="color: rgba(255, 0, 0, 1)">
            transition-duration</span>:<span style="color: rgba(0, 0, 255, 1)"> 0.2s</span>;<span style="color: rgba(255, 0, 0, 1)">
            position</span>:<span style="color: rgba(0, 0, 255, 1)"> absolute</span>;<span style="color: rgba(255, 0, 0, 1)">
            .photo-preview__img-placeholder {
                display</span>:<span style="color: rgba(0, 0, 255, 1)"> block</span>;<span style="color: rgba(255, 0, 0, 1)">
                width</span>:<span style="color: rgba(0, 0, 255, 1)"> 100%</span>;<span style="color: rgba(255, 0, 0, 1)">
                height</span>:<span style="color: rgba(0, 0, 255, 1)"> 100%</span>;<span style="color: rgba(255, 0, 0, 1)">
                position</span>:<span style="color: rgba(0, 0, 255, 1)"> absolute</span>;<span style="color: rgba(255, 0, 0, 1)">
                pointer-events</span>:<span style="color: rgba(0, 0, 255, 1)"> none</span>;
            }<span style="color: rgba(128, 0, 0, 1)">
            img </span>{<span style="color: rgba(255, 0, 0, 1)">
                position</span>:<span style="color: rgba(0, 0, 255, 1)"> absolute</span>;<span style="color: rgba(255, 0, 0, 1)">
                width</span>:<span style="color: rgba(0, 0, 255, 1)"> 100%</span>;<span style="color: rgba(255, 0, 0, 1)">
                height</span>:<span style="color: rgba(0, 0, 255, 1)"> 100%</span>;<span style="color: rgba(255, 0, 0, 1)">
                // cursor</span>:<span style="color: rgba(0, 0, 255, 1)"> move</span>;
            }<span style="color: rgba(128, 0, 0, 1)">
      }
    }

    .photo-preview__loading </span>{<span style="color: rgba(255, 0, 0, 1)">
      position</span>:<span style="color: rgba(0, 0, 255, 1)"> relative</span>;<span style="color: rgba(255, 0, 0, 1)">
      &amp;</span>:<span style="color: rgba(0, 0, 255, 1)">:before {
            content: ' '</span>;<span style="color: rgba(255, 0, 0, 1)">
            display</span>:<span style="color: rgba(0, 0, 255, 1)"> block</span>;<span style="color: rgba(255, 0, 0, 1)">
            border-top</span>:<span style="color: rgba(0, 0, 255, 1)"> 5px solid #999999</span>;<span style="color: rgba(255, 0, 0, 1)">
            border-right</span>:<span style="color: rgba(0, 0, 255, 1)"> 5px solid #999999</span>;<span style="color: rgba(255, 0, 0, 1)">
            border-bottom</span>:<span style="color: rgba(0, 0, 255, 1)"> 5px solid #999999</span>;<span style="color: rgba(255, 0, 0, 1)">
            border-left</span>:<span style="color: rgba(0, 0, 255, 1)"> 5px solid #ffffff</span>;<span style="color: rgba(255, 0, 0, 1)">
            width</span>:<span style="color: rgba(0, 0, 255, 1)"> 50px</span>;<span style="color: rgba(255, 0, 0, 1)">
            height</span>:<span style="color: rgba(0, 0, 255, 1)"> 50px</span>;<span style="color: rgba(255, 0, 0, 1)">
            border-radius</span>:<span style="color: rgba(0, 0, 255, 1)"> 50%</span>;<span style="color: rgba(255, 0, 0, 1)">
            animation</span>:<span style="color: rgba(0, 0, 255, 1)"> rotating 0.8s linear 0s infinite</span>;
      }<span style="color: rgba(128, 0, 0, 1)">
    }

    .photo-preview__tool </span>{<span style="color: rgba(255, 0, 0, 1)">
      border-radius</span>:<span style="color: rgba(0, 0, 255, 1)"> 45px</span>;<span style="color: rgba(255, 0, 0, 1)">
      padding</span>:<span style="color: rgba(0, 0, 255, 1)"> 5px 10px</span>;<span style="color: rgba(255, 0, 0, 1)">
      height</span>:<span style="color: rgba(0, 0, 255, 1)"> 45px</span>;<span style="color: rgba(255, 0, 0, 1)">
      background-color</span>:<span style="color: rgba(0, 0, 255, 1)"> #ffffff</span>;<span style="color: rgba(255, 0, 0, 1)">
      opacity</span>:<span style="color: rgba(0, 0, 255, 1)"> 0.3</span>;<span style="color: rgba(255, 0, 0, 1)">
      position</span>:<span style="color: rgba(0, 0, 255, 1)"> fixed</span>;<span style="color: rgba(255, 0, 0, 1)">
      top</span>:<span style="color: rgba(0, 0, 255, 1)"> 20px</span>;<span style="color: rgba(255, 0, 0, 1)">
      right</span>:<span style="color: rgba(0, 0, 255, 1)"> 20px</span>;<span style="color: rgba(255, 0, 0, 1)">
      user-select</span>:<span style="color: rgba(0, 0, 255, 1)"> none</span>;<span style="color: rgba(255, 0, 0, 1)">
      transition-duration</span>:<span style="color: rgba(0, 0, 255, 1)"> 0.5s</span>;<span style="color: rgba(255, 0, 0, 1)">
      display</span>:<span style="color: rgba(0, 0, 255, 1)"> flex</span>;<span style="color: rgba(255, 0, 0, 1)">

      &amp;</span>:<span style="color: rgba(0, 0, 255, 1)">hover {
            opacity: 0.9</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      .iconfont </span>{<span style="color: rgba(255, 0, 0, 1)">
            font-size</span>:<span style="color: rgba(0, 0, 255, 1)"> 25px</span>;<span style="color: rgba(255, 0, 0, 1)">
            text-align</span>:<span style="color: rgba(0, 0, 255, 1)"> center</span>;<span style="color: rgba(255, 0, 0, 1)">
            width</span>:<span style="color: rgba(0, 0, 255, 1)"> 35px</span>;<span style="color: rgba(255, 0, 0, 1)">
            height</span>:<span style="color: rgba(0, 0, 255, 1)"> 35px</span>;<span style="color: rgba(255, 0, 0, 1)">
            line-height</span>:<span style="color: rgba(0, 0, 255, 1)"> 35px</span>;<span style="color: rgba(255, 0, 0, 1)">
            color</span>:<span style="color: rgba(0, 0, 255, 1)"> #444444</span>;<span style="color: rgba(255, 0, 0, 1)">
            // display</span>:<span style="color: rgba(0, 0, 255, 1)"> inline-block</span>;<span style="color: rgba(255, 0, 0, 1)">
            transition-duration</span>:<span style="color: rgba(0, 0, 255, 1)"> 0.4s</span>;<span style="color: rgba(255, 0, 0, 1)">
            margin</span>:<span style="color: rgba(0, 0, 255, 1)"> 0 2px</span>;<span style="color: rgba(255, 0, 0, 1)">
            cursor</span>:<span style="color: rgba(0, 0, 255, 1)"> pointer</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      .icon-close:hover </span>{<span style="color: rgba(255, 0, 0, 1)">
            transform</span>:<span style="color: rgba(0, 0, 255, 1)"> scale(1.15)</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      .icon-turn-left </span>{<span style="color: rgba(255, 0, 0, 1)">
            transform</span>:<span style="color: rgba(0, 0, 255, 1)"> rotate(50deg)</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      .icon-turn-left:hover </span>{<span style="color: rgba(255, 0, 0, 1)">
            transform</span>:<span style="color: rgba(0, 0, 255, 1)"> rotate(0deg)</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      .icon-turn-right </span>{<span style="color: rgba(255, 0, 0, 1)">
            transform</span>:<span style="color: rgba(0, 0, 255, 1)"> rotate(-50deg)</span>;
      }<span style="color: rgba(128, 0, 0, 1)">

      .icon-turn-right:hover </span>{<span style="color: rgba(255, 0, 0, 1)">
            transform</span>:<span style="color: rgba(0, 0, 255, 1)"> rotate(0deg)</span>;
      }<span style="color: rgba(128, 0, 0, 1)">
      .icon-go-left,
      .icon-go-right </span>{<span style="color: rgba(255, 0, 0, 1)">
            &amp; {
                // pointer-events</span>:<span style="color: rgba(0, 0, 255, 1)"> none</span>;<span style="color: rgba(255, 0, 0, 1)">
                cursor</span>:<span style="color: rgba(0, 0, 255, 1)"> wait</span>;
            }<span style="color: rgba(128, 0, 0, 1)">
      }
    }
}

body </span>{<span style="color: rgba(255, 0, 0, 1)">
    overflow</span>:<span style="color: rgba(0, 0, 255, 1)"> hidden</span>;
}<span style="color: rgba(128, 0, 0, 1)">

// 渐现
@keyframes fadeIn </span>{<span style="color: rgba(255, 0, 0, 1)">
    0% {
      opacity</span>:<span style="color: rgba(0, 0, 255, 1)"> 0</span>;
    }<span style="color: rgba(128, 0, 0, 1)">

    100% </span>{<span style="color: rgba(255, 0, 0, 1)">
      opacity</span>:<span style="color: rgba(0, 0, 255, 1)"> 1</span>;
    }<span style="color: rgba(128, 0, 0, 1)">
}

// 旋转
@keyframes rotating </span>{<span style="color: rgba(255, 0, 0, 1)">
    0% {
      transform</span>:<span style="color: rgba(0, 0, 255, 1)"> rotate(0deg)</span>;
    }<span style="color: rgba(128, 0, 0, 1)">

    100% </span>{<span style="color: rgba(255, 0, 0, 1)">
      transform</span>:<span style="color: rgba(0, 0, 255, 1)"> rotate(360deg)</span>;
    }<span style="color: rgba(128, 0, 0, 1)">
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>js 组件代码:</p>
<div class="cnblogs_code"><img id="code_img_closed_377d902d-1f69-4d71-8069-10fe479e5bbf" class="code_img_closed lazyload" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_377d902d-1f69-4d71-8069-10fe479e5bbf" class="code_img_opened lazyload" style="display: none" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_377d902d-1f69-4d71-8069-10fe479e5bbf" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* @param {type: number, desc: 当前点击的图片索引} imgIndex
* @param {type: array, desc: 传入的图片列表,结构也应该是[{bigUrl:'imgUrl', alt:'图片描述'}]} imgs
* @param {type: string, desc: 弹框显示出来的大图} bigUrl
* @param {type: string, desc: 默认显示的小图片} url
* @param {type: string, desc: 图片描述} alt
* @param {type: object, desc: 操作按钮显示,默认都显示,如果对象中指定哪个按钮为false那么表示不显示,
    example : {
      toSmall: bool,//缩小按钮是否显示
      toBig: bool,   //放大按钮是否显示
      turnLeft: bool, //左转按钮是否显示
      turnRight: bool//右转按钮是否显示
      close: bool, //关闭按钮是否显示
      esc: bool, //键盘中的esc键事件是否触发
      mousewheel: bool, // 鼠标滚轮事件是否触发
    }} tool
*
* 示例: @example
*&lt;PhotoPreview
*      bigUrl={item.bigUrl}
*      url={item.url}
*      alt={item.alt}
*      tool={{ turnLeft: false, turnRight: false }}
*   /&gt;
*
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
import React from </span>'react'<span style="color: rgba(0, 0, 0, 1)">;
import ReactDOM from </span>'react-dom'<span style="color: rgba(0, 0, 0, 1)">;
import PropTypes from </span>'prop-types'<span style="color: rgba(0, 0, 0, 1)">;
import </span>'@/less/components/photo-preview.less'<span style="color: rgba(0, 0, 0, 1)">;

class PhotoPreview extends React.Component {
    constructor(props) {
      super(props);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {
            bigUrl: props.bigUrl </span>=== '' ?<span style="color: rgba(0, 0, 0, 1)"> props.url : props.bigUrl,
            tool: Object.assign(PhotoPreview.defaultProps.tool, props.tool),
            imgIndex: props.imgIndex,
            imgs: props.imgs,

            loadEl: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> loading元素显示隐藏</span>
            figureEl: <span style="color: rgba(0, 0, 255, 1)">false</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 生成图片预览元素</span>
            imgOriginalWidth: 0, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 当前大图默认宽度值</span>
            imgOriginalHeight: 0, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 当前大图默认高度值</span>
<span style="color: rgba(0, 0, 0, 1)">            imgAttr: {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 大图的地址及描述</span>
                src: ''<span style="color: rgba(0, 0, 0, 1)">,
                alt: </span>''<span style="color: rgba(0, 0, 0, 1)">,
            },
            imgParentStyle: {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 大图父级div元素样式</span>
                width: '0px'<span style="color: rgba(0, 0, 0, 1)">,
                height: </span>'0px'<span style="color: rgba(0, 0, 0, 1)">,
            },
            rotateDeg: </span>0, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片旋转角度</span>
            increaseNum: 20, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片放大时距离空隙</span>
<span style="color: rgba(0, 0, 0, 1)">      };

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取相关元素</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.bigImgRef =<span style="color: rgba(0, 0, 0, 1)"> React.createRef();
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.ppiRef =<span style="color: rgba(0, 0, 0, 1)"> React.createRef();
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 预览图片超出window宽或高的处理</span>
    beyondWindow = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { imgParentStyle, rotateDeg, increaseNum } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      const iWidth </span>= parseFloat(imgParentStyle.width) + increaseNum * 2<span style="color: rgba(0, 0, 0, 1)">;
      const iHeight </span>= parseFloat(imgParentStyle.height) + increaseNum * 2<span style="color: rgba(0, 0, 0, 1)">;
      const ppiEl </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.ppiRef.current;

      let ips </span>=<span style="color: rgba(0, 0, 0, 1)"> imgParentStyle;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (rotateDeg % 360 === 90 || rotateDeg % 360 === 270<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (iHeight &gt;<span style="color: rgba(0, 0, 0, 1)"> window.innerWidth) {
                ips </span>= { ...ips, left: `${(iHeight - iWidth) / 2 +<span style="color: rgba(0, 0, 0, 1)"> increaseNum}px` };
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                ips </span>= { ...ips, left: 'auto'<span style="color: rgba(0, 0, 0, 1)"> };
            }
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (iWidth &gt;<span style="color: rgba(0, 0, 0, 1)"> window.innerHeight) {
                ips </span>= { ...ips, top: `${(iWidth - iHeight) / 2 +<span style="color: rgba(0, 0, 0, 1)"> increaseNum}px` };
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                ips </span>= { ...ips, top: 'auto'<span style="color: rgba(0, 0, 0, 1)"> };
            }
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (
            (rotateDeg </span>% 360 === -90 &amp;&amp; iWidth &gt; iHeight) ||<span style="color: rgba(0, 0, 0, 1)">
            (rotateDeg </span>% 360 === -270 &amp;&amp; iWidth &gt;<span style="color: rgba(0, 0, 0, 1)"> iHeight)
      ) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果是-90或-270,并且图片宽大于高的话,那么则需要做兼容处理</span>
            let left = 'auto'<span style="color: rgba(0, 0, 0, 1)">;
            let top </span>= 'auto'<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (iHeight &gt;<span style="color: rgba(0, 0, 0, 1)"> ppiEl.clientWidth) {
                left </span>= `${-(iHeight / 2) + increaseNum * 2<span style="color: rgba(0, 0, 0, 1)">}px`;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (iWidth &gt;<span style="color: rgba(0, 0, 0, 1)"> ppiEl.clientHeight) {
                top </span>= `${iHeight / 2 + increaseNum / 2<span style="color: rgba(0, 0, 0, 1)">}px`;
            }
            ips </span>=<span style="color: rgba(0, 0, 0, 1)"> { ...ips, left: `${left}`, top: `${top}` };
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (
            (rotateDeg </span>% 360 === -90 &amp;&amp; iHeight &gt; iWidth) ||<span style="color: rgba(0, 0, 0, 1)">
            (rotateDeg </span>% 360 === -270 &amp;&amp; iHeight &gt;<span style="color: rgba(0, 0, 0, 1)"> iWidth)
      ) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果是-90或-270,并且图片高大于宽的话,那么则需要做兼容处理</span>
            let left = 'auto'<span style="color: rgba(0, 0, 0, 1)">;
            let top </span>= 'auto'<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (iHeight &gt;<span style="color: rgba(0, 0, 0, 1)"> ppiEl.clientWidth) {
                left </span>= `${iWidth / 2<span style="color: rgba(0, 0, 0, 1)">}px`;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (iWidth &gt;<span style="color: rgba(0, 0, 0, 1)"> ppiEl.clientHeight) {
                top </span>= `${-(iWidth / 2) + increaseNum * 2<span style="color: rgba(0, 0, 0, 1)">}px`;
            }

            ips </span>=<span style="color: rgba(0, 0, 0, 1)"> { ...ips, left: `${left}`, top: `${top}` };
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (iWidth &gt;<span style="color: rgba(0, 0, 0, 1)"> window.innerWidth) {
                ips </span>=<span style="color: rgba(0, 0, 0, 1)"> { ...ips, left: `${increaseNum}px` };
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                ips </span>= { ...ips, left: 'auto'<span style="color: rgba(0, 0, 0, 1)"> };
            }
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (iHeight &gt;<span style="color: rgba(0, 0, 0, 1)"> window.innerHeight) {
                ips </span>=<span style="color: rgba(0, 0, 0, 1)"> { ...ips, top: `${increaseNum}px` };
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                ips </span>= { ...ips, top: 'auto'<span style="color: rgba(0, 0, 0, 1)"> };
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            imgParentStyle: ips,
      });
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片缩小事件</span>
    toSmallEvent = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { tool, imgParentStyle, imgOriginalWidth, imgOriginalHeight } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (tool.toSmall === <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      let width </span>= parseFloat(imgParentStyle.width) / 1.5<span style="color: rgba(0, 0, 0, 1)">;
      let height </span>= parseFloat(imgParentStyle.height) / 1.5<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片缩小不能超过5倍</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (width &lt; imgOriginalWidth / 5<span style="color: rgba(0, 0, 0, 1)">) {
            width </span>= imgOriginalWidth / 5<span style="color: rgba(0, 0, 0, 1)">;
            height </span>= imgOriginalHeight / 5<span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState(
            {
                imgParentStyle: Object.assign(imgParentStyle, {
                  width: `${width}px`,
                  height: `${height}px`,
                }),
            },
            () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.beyondWindow();
            }
      );
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片放大事件</span>
    toBigEvent = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { tool, imgParentStyle, imgOriginalWidth, imgOriginalHeight } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (tool.toBig === <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      let width </span>= parseFloat(imgParentStyle.width) * 1.5<span style="color: rgba(0, 0, 0, 1)">;
      let height </span>= parseFloat(imgParentStyle.height) * 1.5<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片放大不能超过5倍</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (width &gt; imgOriginalWidth * 5<span style="color: rgba(0, 0, 0, 1)">) {
            width </span>= imgOriginalWidth * 5<span style="color: rgba(0, 0, 0, 1)">;
            height </span>= imgOriginalHeight * 5<span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState(
            {
                imgParentStyle: Object.assign(imgParentStyle, {
                  width: `${width}px`,
                  height: `${height}px`,
                }),
            },
            () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.beyondWindow();
            }
      );
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向左旋转事件</span>
    turnLeftEvent = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { tool, rotateDeg, imgParentStyle } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (tool.turnLeft === <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      const iRotateDeg </span>= rotateDeg - 90<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState(
            {
                imgParentStyle: Object.assign(imgParentStyle, {
                  transform: `rotate(${iRotateDeg}deg)`,
                }),
                rotateDeg: iRotateDeg,
            },
            () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.beyondWindow();
            }
      );
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向右旋转事件</span>
    turnRightEvent = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { tool, rotateDeg, imgParentStyle } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (tool.turnRight === <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      const iRotateDeg </span>= rotateDeg + 90<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState(
            {
                imgParentStyle: Object.assign(imgParentStyle, {
                  transform: `rotate(${iRotateDeg}deg)`,
                }),
                rotateDeg: iRotateDeg,
            },
            () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.beyondWindow();
            }
      );
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 上一张图片</span>
    goLeftEvent = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { imgIndex, imgs, loadEl } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果还在loading加载中,不予许上一张下一张操作</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (loadEl) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      const nImgIndex </span>= imgIndex - 1<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log(nImgIndex);</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (nImgIndex &lt; 0<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState(
            {
                imgIndex: nImgIndex,
                rotateDeg: </span>0<span style="color: rgba(0, 0, 0, 1)">,
                imgParentStyle: {
                  width: </span>'0px'<span style="color: rgba(0, 0, 0, 1)">,
                  height: </span>'0px'<span style="color: rgba(0, 0, 0, 1)">,
                },
            },
            () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.photoShow(imgs.bigUrl, imgs.alt, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
            }
      );
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 下一张图片</span>
    goRightEvent = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { imgIndex, imgs, loadEl } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果还在loading加载中,不予许上一张下一张操作</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (loadEl) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      const nImgIndex </span>= imgIndex + 1<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log(nImgIndex);</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> (nImgIndex &gt; imgs.length - 1<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState(
            {
                imgIndex: nImgIndex,
                rotateDeg: </span>0<span style="color: rgba(0, 0, 0, 1)">,
                imgParentStyle: {
                  width: </span>'0px'<span style="color: rgba(0, 0, 0, 1)">,
                  height: </span>'0px'<span style="color: rgba(0, 0, 0, 1)">,
                },
            },
            () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果不存在大图,那么直接拿小图代替。</span>
                const bigUrl = imgs.bigUrl ||<span style="color: rgba(0, 0, 0, 1)"> imgs.url;
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.photoShow(bigUrl, imgs.alt);
            }
      );
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭事件</span>
    closeEvent = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 恢复到默认值</span>
      const { imgIndex, imgs } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            imgIndex,
            imgs,
            figureEl: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
            rotateDeg: </span>0<span style="color: rgba(0, 0, 0, 1)">,
            imgParentStyle: {
                width: </span>'0px'<span style="color: rgba(0, 0, 0, 1)">,
                height: </span>'0px'<span style="color: rgba(0, 0, 0, 1)">,
            },
      });
      window.removeEventListener(</span>'mousewheel', <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._psMousewheelEvent);
      window.removeEventListener(</span>'keydown', <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._psKeydownEvent);
      window.removeEventListener(</span>'resize', <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._psWindowResize);
      document.body.removeAttribute(</span>'photo-preview-show'<span style="color: rgba(0, 0, 0, 1)">);
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 大图被执行拖拽操作</span>
    bigImgMouseDown = (event) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      event.preventDefault();
      const ppiEl </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.ppiRef.current;
      const bigImgEl </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.bigImgRef.current;
      const diffX </span>= event.clientX -<span style="color: rgba(0, 0, 0, 1)"> bigImgEl.offsetLeft;
      const diffY </span>= event.clientY -<span style="color: rgba(0, 0, 0, 1)"> bigImgEl.offsetTop;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 鼠标移动的时候</span>
      bigImgEl.onmousemove = (ev) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            const moveX </span>= parseFloat(ev.clientX -<span style="color: rgba(0, 0, 0, 1)"> diffX);
            const moveY </span>= parseFloat(ev.clientY -<span style="color: rgba(0, 0, 0, 1)"> diffY);
            const mx </span>= moveX &gt; 0 ? -<span style="color: rgba(0, 0, 0, 1)">moveX : Math.abs(moveX);
            const my </span>= moveY &gt; 0 ? -<span style="color: rgba(0, 0, 0, 1)">moveY : Math.abs(moveY);
            let sl </span>= ppiEl.scrollLeft + mx * 0.1<span style="color: rgba(0, 0, 0, 1)">;
            let sr </span>= ppiEl.scrollTop + my * 0.1<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (sl &lt;= 0<span style="color: rgba(0, 0, 0, 1)">) {
                sl </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (sl &gt;= ppiEl.scrollWidth -<span style="color: rgba(0, 0, 0, 1)"> ppiEl.clientWidth) {
                sl </span>= ppiEl.scrollWidth -<span style="color: rgba(0, 0, 0, 1)"> ppiEl.clientWidth;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (sr &lt;= 0<span style="color: rgba(0, 0, 0, 1)">) {
                sr </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (sr &gt;= ppiEl.scrollHeight -<span style="color: rgba(0, 0, 0, 1)"> ppiEl.clientHeight) {
                sr </span>= ppiEl.scrollHeight -<span style="color: rgba(0, 0, 0, 1)"> ppiEl.clientHeight;
            }
            ppiEl.scrollTo(sl, sr);
      };
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 鼠标抬起的时候</span>
      bigImgEl.onmouseup = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            bigImgEl.onmousemove </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            bigImgEl.onmouseup </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      };
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 鼠标离开的时候</span>
      bigImgEl.onmouseout = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            bigImgEl.onmousemove </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            bigImgEl.onmouseup </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      };
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 鼠标滚轮事件</span>
    _psMousewheelEvent = (event) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> event.preventDefault();</span>
      const { figureEl, tool } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (figureEl &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> tool.mousewheel) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (event.wheelDelta &gt; 0<span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.toBigEvent();
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.toSmallEvent();
            }
      }
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 键盘按下事</span>
    _psKeydownEvent = (event) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { figureEl, tool } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (event.keyCode === 27 &amp;&amp; tool.esc &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> figureEl) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.closeEvent();
      }
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 窗口发生改变的时候</span>
    _psWindowResize = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      const { figureEl } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (figureEl) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.beyondWindow();
      }
    };

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片展示</span>
    photoShow = (url, alt, winEventToggle) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 图片加载并处理</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
            loadEl: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
            figureEl: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
      });
      const img </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Image();
      img.src </span>=<span style="color: rgba(0, 0, 0, 1)"> url;
      img.onload </span>= async () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState(
                {
                  loadEl: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
                  imgOriginalWidth: img.width,
                  imgOriginalHeight: img.height,
                  imgAttr: {
                        src: url,
                        alt,
                  },
                  imgParentStyle: {
                        width: `${img.width}px`,
                        height: `${img.height}px`,
                  },
                },
                () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.beyondWindow();
                }
            );
      };

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 是否需再次执行window事件</span>
      const wev = winEventToggle || <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (wev) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log('wev');</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> window触发事件</span>
            window.addEventListener('mousewheel', <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._psMousewheelEvent);
            window.addEventListener(</span>'keydown', <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._psKeydownEvent);
            window.addEventListener(</span>'resize', <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">._psWindowResize);
            document.body.setAttribute(</span>'photo-preview-show', 'true'<span style="color: rgba(0, 0, 0, 1)">);
      }
    };

    UNSAFE_componentWillReceiveProps(newProps) {
      console.log(`</span><span style="color: rgba(0, 0, 255, 1)">new</span>-<span style="color: rgba(0, 0, 0, 1)">props:${newProps.nImgIndex}`);
    }

    render() {
      const { alt, url } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
      const {
            bigUrl,
            tool,
            figureEl,
            loadEl,
            imgAttr,
            imgParentStyle,
            imgIndex,
            imgs,
            increaseNum,
      } </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
      const iParentStyle </span>=<span style="color: rgba(0, 0, 0, 1)"> { ...imgParentStyle };
      const iSpanStyle </span>=<span style="color: rgba(0, 0, 0, 1)"> {
            width: `${parseFloat(imgParentStyle.width) </span>+ increaseNum * 2<span style="color: rgba(0, 0, 0, 1)">}px`,
            height: `${parseFloat(imgParentStyle.height) </span>+ increaseNum * 2<span style="color: rgba(0, 0, 0, 1)">}px`,
      };
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
            </span>&lt;&gt;
                &lt;<span style="color: rgba(0, 0, 0, 1)">img
                  onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span>.photoShow.bind(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">, bigUrl, alt)}
                  src</span>=<span style="color: rgba(0, 0, 0, 1)">{url}
                  alt</span>=<span style="color: rgba(0, 0, 0, 1)">{alt}
                  className</span>="photo-preview__thumb-img"
                /&gt;
<span style="color: rgba(0, 0, 0, 1)">                {figureEl
                  </span>?<span style="color: rgba(0, 0, 0, 1)"> ReactDOM.createPortal(
                        </span>&lt;&gt;
                              &lt;figure className="photo-preview"&gt;
                                  &lt;div className="photo-preview__in" ref={<span style="color: rgba(0, 0, 255, 1)">this</span>.ppiRef}&gt;<span style="color: rgba(0, 0, 0, 1)">
                                    {loadEl </span>?<span style="color: rgba(0, 0, 0, 1)"> (
                                          </span>&lt;div className="photo-preview__loading"&gt;&lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">                                    ) : (
                                          </span>&lt;<span style="color: rgba(0, 0, 0, 1)">div
                                              className</span>="photo-preview__img-wrap"<span style="color: rgba(0, 0, 0, 1)">
                                              style</span>=<span style="color: rgba(0, 0, 0, 1)">{iParentStyle}
                                          </span>&gt;
                                              &lt;<span style="color: rgba(0, 0, 0, 1)">span
                                                className</span>="photo-preview__img-placeholder"<span style="color: rgba(0, 0, 0, 1)">
                                                style</span>=<span style="color: rgba(0, 0, 0, 1)">{{
                                                      ...iSpanStyle,
                                                      marginLeft: `</span>-<span style="color: rgba(0, 0, 0, 1)">${increaseNum}px`,
                                                      marginTop: `</span>-<span style="color: rgba(0, 0, 0, 1)">${increaseNum}px`,
                                                }}
                                              </span>&gt;&lt;/span&gt;
                                              &lt;<span style="color: rgba(0, 0, 0, 1)">img
                                                src</span>=<span style="color: rgba(0, 0, 0, 1)">{imgAttr.src}
                                                alt</span>=<span style="color: rgba(0, 0, 0, 1)">{imgAttr.alt}
                                                onMouseDown</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.bigImgMouseDown}
                                                ref</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.bigImgRef}
                                              </span>/&gt;
                                          &lt;/div&gt;
<span style="color: rgba(0, 0, 0, 1)">                                    )}
                                    </span>&lt;div className="photo-preview__tool"&gt;<span style="color: rgba(0, 0, 0, 1)">
                                          {tool.toSmall </span>?<span style="color: rgba(0, 0, 0, 1)"> (
                                              </span>&lt;<span style="color: rgba(0, 0, 0, 1)">i
                                                className</span>="iconfont icon-to-small"<span style="color: rgba(0, 0, 0, 1)">
                                                onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.toSmallEvent}
                                              </span>&gt;&lt;/i&gt;
                                          ) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
                                          {tool.toBig </span>?<span style="color: rgba(0, 0, 0, 1)"> (
                                              </span>&lt;<span style="color: rgba(0, 0, 0, 1)">i
                                                className</span>="iconfont icon-to-big"<span style="color: rgba(0, 0, 0, 1)">
                                                onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.toBigEvent}
                                              </span>&gt;&lt;/i&gt;
                                          ) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
                                          {tool.turnLeft </span>?<span style="color: rgba(0, 0, 0, 1)"> (
                                              </span>&lt;<span style="color: rgba(0, 0, 0, 1)">i
                                                className</span>="iconfont icon-turn-left"<span style="color: rgba(0, 0, 0, 1)">
                                                onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.turnLeftEvent}
                                              </span>&gt;&lt;/i&gt;
                                          ) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
                                          {tool.turnRight </span>?<span style="color: rgba(0, 0, 0, 1)"> (
                                              </span>&lt;<span style="color: rgba(0, 0, 0, 1)">i
                                                className</span>="iconfont icon-turn-right"<span style="color: rgba(0, 0, 0, 1)">
                                                onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.turnRightEvent}
                                              </span>&gt;&lt;/i&gt;
                                          ) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}

                                          {imgIndex </span>!== '' &amp;&amp; imgs.length &gt; 1 ?<span style="color: rgba(0, 0, 0, 1)"> (
                                              </span>&lt;&gt;
                                                &lt;<span style="color: rgba(0, 0, 0, 1)">i
                                                      className</span>="iconfont icon-go-left"<span style="color: rgba(0, 0, 0, 1)">
                                                      onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.goLeftEvent}
                                                      data</span>-disable={loadEl ? 'true' : 'false'<span style="color: rgba(0, 0, 0, 1)">}
                                                </span>&gt;&lt;/i&gt;
                                                &lt;<span style="color: rgba(0, 0, 0, 1)">i
                                                      className</span>="iconfont icon-go-right"<span style="color: rgba(0, 0, 0, 1)">
                                                      onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.goRightEvent}
                                                      data</span>-disable={loadEl ? 'true' : 'false'<span style="color: rgba(0, 0, 0, 1)">}
                                                </span>&gt;&lt;/i&gt;
                                              &lt;/&gt;
                                          ) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}

                                          {tool.close </span>?<span style="color: rgba(0, 0, 0, 1)"> (
                                              </span>&lt;<span style="color: rgba(0, 0, 0, 1)">i
                                                className</span>="iconfont icon-close"<span style="color: rgba(0, 0, 0, 1)">
                                                onClick</span>={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.closeEvent}
                                              </span>&gt;&lt;/i&gt;
                                          ) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
                                    </span>&lt;/div&gt;
                                  &lt;/div&gt;
                              &lt;/figure&gt;
                        &lt;/&gt;,
<span style="color: rgba(0, 0, 0, 1)">                        document.body
                      )
                  : </span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
            </span>&lt;/&gt;
<span style="color: rgba(0, 0, 0, 1)">      );
    }
}

PhotoPreview.defaultProps </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    bigUrl: </span>''<span style="color: rgba(0, 0, 0, 1)">,
    alt: </span>''<span style="color: rgba(0, 0, 0, 1)">,
    tool: {
      toSmall: </span><span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 缩小按钮</span>
      toBig: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 放大按钮</span>
      turnLeft: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 左转按钮</span>
      turnRight: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 右转按钮</span>
      close: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭按钮</span>
      esc: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> esc键触发</span>
      mousewheel: <span style="color: rgba(0, 0, 255, 1)">true</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 鼠标滚轮事件是否触发</span>
<span style="color: rgba(0, 0, 0, 1)">    },
    imgIndex: </span>''<span style="color: rgba(0, 0, 0, 1)">,
    imgs: [],
};
PhotoPreview.propTypes </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    bigUrl: PropTypes.string,
    url: PropTypes.string.isRequired,
    alt: PropTypes.string,
    tool: PropTypes.object,
    imgIndex: PropTypes.number,
    imgs: PropTypes.array,
};
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> PhotoPreview;</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>js 组件案例代码:</p>
<div class="cnblogs_code"><img id="code_img_closed_17bb6d1e-49f4-4f4d-bbaf-30e4fa3de875" class="code_img_closed lazyload" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_17bb6d1e-49f4-4f4d-bbaf-30e4fa3de875" class="code_img_opened lazyload" style="display: none" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_17bb6d1e-49f4-4f4d-bbaf-30e4fa3de875" class="cnblogs_code_hide">
<pre>import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 导入图片预览组件</span>
import PhotoPreview from '@/components/photo-preview'<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 模拟图片列表数据</span>
const atlasImgList =<span style="color: rgba(0, 0, 0, 1)"> [
    {
      url: </span>'http://dummyimage.com/200x100/ff3838&amp;text=Hello'<span style="color: rgba(0, 0, 0, 1)">,
      bigUrl: </span>'http://dummyimage.com/800x400/ff3838&amp;text=Hello'<span style="color: rgba(0, 0, 0, 1)">,
      alt: </span>'Hello'<span style="color: rgba(0, 0, 0, 1)">,
    },
    {
      url: </span>'http://dummyimage.com/200x100/ff9f1a&amp;text=Photo'<span style="color: rgba(0, 0, 0, 1)">,
      bigUrl: </span>'http://dummyimage.com/800x400/ff9f1a&amp;text=Photo'<span style="color: rgba(0, 0, 0, 1)">,
      alt: </span>'Photo'<span style="color: rgba(0, 0, 0, 1)">,
    },
    {
      url: </span>'http://dummyimage.com/200x100/c56cf0&amp;text=Preview'<span style="color: rgba(0, 0, 0, 1)">,
      bigUrl: </span>'http://dummyimage.com/800x400/c56cf0&amp;text=Preview'<span style="color: rgba(0, 0, 0, 1)">,
      alt: </span>'Preview'<span style="color: rgba(0, 0, 0, 1)">,
    },
    {
      url: </span>'http://dummyimage.com/100x100/3ae374&amp;text=!'<span style="color: rgba(0, 0, 0, 1)">,
      bigUrl: </span>'http://dummyimage.com/400x400/3ae374&amp;text=!'<span style="color: rgba(0, 0, 0, 1)">,
      alt: </span>'!'<span style="color: rgba(0, 0, 0, 1)">,
    },
];

const Test </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
      </span>&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">
            {atlasImgList.map((item, index) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
                  </span>&lt;<span style="color: rgba(0, 0, 0, 1)">PhotoPreview
                        key</span>=<span style="color: rgba(0, 0, 0, 1)">{index}
                        imgIndex</span>=<span style="color: rgba(0, 0, 0, 1)">{index}
                        imgs</span>=<span style="color: rgba(0, 0, 0, 1)">{atlasImgList}
                        url</span>=<span style="color: rgba(0, 0, 0, 1)">{item.url}
                        bigUrl</span>=<span style="color: rgba(0, 0, 0, 1)">{item.bigUrl}
                        alt</span>=<span style="color: rgba(0, 0, 0, 1)">{item.alt}
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> tool={{ turnLeft: false, turnRight: false }}</span>
                  /&gt;
<span style="color: rgba(0, 0, 0, 1)">                );
            })}
      </span>&lt;/&gt;
<span style="color: rgba(0, 0, 0, 1)">    );
};

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Test;</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/zion0707/p/13377652.html
頁: [1]
查看完整版本: React图片预览组件,支持缩放、旋转、上一张下一张功能