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> <img src="https://img2020.cnblogs.com/blog/659357/202007/659357-20200725175849480-408291671.png"></p>
<p> <span style="background-color: rgba(255, 153, 0, 1); color: rgba(0, 0, 0, 1)"> 图1.0截图 </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)">
&</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)">
&::-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)">
&::-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)">
&</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)">
&</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)">
& {
// 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
*<PhotoPreview
* bigUrl={item.bigUrl}
* url={item.url}
* alt={item.alt}
* tool={{ turnLeft: false, turnRight: false }}
* />
*
</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 = () =><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 ><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 ><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 && iWidth > iHeight) ||<span style="color: rgba(0, 0, 0, 1)">
(rotateDeg </span>% 360 === -270 && iWidth ><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 ><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 ><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 && iHeight > iWidth) ||<span style="color: rgba(0, 0, 0, 1)">
(rotateDeg </span>% 360 === -270 && iHeight ><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 ><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 ><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 ><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 ><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 = () =><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 < 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>=><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 = () =><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 > 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>=><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 = () =><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>=><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 = () =><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>=><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 = () =><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 < 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>=><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 = () =><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 > 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>=><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 = () =><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) =><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) =><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 > 0 ? -<span style="color: rgba(0, 0, 0, 1)">moveX : Math.abs(moveX);
const my </span>= moveY > 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 <= 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 >= 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 <= 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 >= 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 = () =><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 = () =><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) =><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 &&<span style="color: rgba(0, 0, 0, 1)"> tool.mousewheel) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (event.wheelDelta > 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) =><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 && tool.esc &&<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 = () =><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) =><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 () =><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>=><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><>
<<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"
/>
<span style="color: rgba(0, 0, 0, 1)"> {figureEl
</span>?<span style="color: rgba(0, 0, 0, 1)"> ReactDOM.createPortal(
</span><>
<figure className="photo-preview">
<div className="photo-preview__in" ref={<span style="color: rgba(0, 0, 255, 1)">this</span>.ppiRef}><span style="color: rgba(0, 0, 0, 1)">
{loadEl </span>?<span style="color: rgba(0, 0, 0, 1)"> (
</span><div className="photo-preview__loading"></div>
<span style="color: rgba(0, 0, 0, 1)"> ) : (
</span><<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>>
<<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>></span>
<<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>/>
</div>
<span style="color: rgba(0, 0, 0, 1)"> )}
</span><div className="photo-preview__tool"><span style="color: rgba(0, 0, 0, 1)">
{tool.toSmall </span>?<span style="color: rgba(0, 0, 0, 1)"> (
</span><<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>></i>
) : <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><<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>></i>
) : <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><<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>></i>
) : <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><<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>></i>
) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
{imgIndex </span>!== '' && imgs.length > 1 ?<span style="color: rgba(0, 0, 0, 1)"> (
</span><>
<<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>></i>
<<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>></i>
</>
) : <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><<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>></i>
) : <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">}
</span></div>
</div>
</figure>
</>,
<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></>
<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&text=Hello'<span style="color: rgba(0, 0, 0, 1)">,
bigUrl: </span>'http://dummyimage.com/800x400/ff3838&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&text=Photo'<span style="color: rgba(0, 0, 0, 1)">,
bigUrl: </span>'http://dummyimage.com/800x400/ff9f1a&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&text=Preview'<span style="color: rgba(0, 0, 0, 1)">,
bigUrl: </span>'http://dummyimage.com/800x400/c56cf0&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&text=!'<span style="color: rgba(0, 0, 0, 1)">,
bigUrl: </span>'http://dummyimage.com/400x400/3ae374&text=!'<span style="color: rgba(0, 0, 0, 1)">,
alt: </span>'!'<span style="color: rgba(0, 0, 0, 1)">,
},
];
const Test </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)"> (
</span><><span style="color: rgba(0, 0, 0, 1)">
{atlasImgList.map((item, index) </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)"> (
</span><<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>
/>
<span style="color: rgba(0, 0, 0, 1)"> );
})}
</span></>
<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> </p><br><br>
来源:https://www.cnblogs.com/zion0707/p/13377652.html
頁:
[1]