因为项目中使用了antd.业务上有个需求,需要预览图片。想到了antd里面有个modal.稍作修改就只需要处理前后翻页的业务逻辑就行。
1,可以通过前一张,后一张按钮来进行翻页,图片右上角有退出预览按钮
2,键盘的左右按钮可以前后翻页,ESC按钮可以退出预览
代码如下:
interface IpicPreviewProps{
index:number; // 第几张图片索引值
pic:any[]; // 图片链接数组,存储图片地址
modalShow:boolean; // modal显示和隐藏
setModalShow:(v:boolean) => void; // 回调
}
function PicturePreview(props:IpicPreviewProps) :JSX.Element {
const {modalShow,index,pic} = props;
const [current,setCurrent] = useState(''); // 用于存放当前显示图片地址
const [currentIndex,setCurrentIndex] = useState(0); // 用于存放当前播放图片在数组中索引值
useEffect(()=>{
document.addEventListener('keyup',upHandle);
retrurn ()=>{
document.removeEventListener('keyup',upHandle);
}
},[currentIndex]);
useEffect(()=>{
setCurrent(pic[index]);
setCurrentIndex(index);
},[idnex,pic]);
const leftClick = useMemo(()=>
()=>{
if(currentIndex !== 0){
setCurrentIndex((prev:number) => prev-1);
sestCurrent(pic[currentIndex-1]);
}
},[currentIndex,pic]);
const rightClick = useMemo(()=>
() =>{
const length = pic.length;
if(currentIndex !== length -1){
setCurrentIndex((prev:number) =>prev +1);
setCurrent(pic[currentIndex +1]);
}
},[currentIndex,pic]);
const upHandle = useMemo(()=>
(e:any) =>{
if(e.keyCode === 37){ // left
leftClick();
} else if(e.keyCode === 39){ // right
rightClick();
} else if(e.keyCode === 27){ // esc
props.setModalShow(false);
}
},[leftClick,rightClick,props.setModalShow]);
return (
<Modal
visible = {modalShow}
title =''
centered = {true}
maskClosable = {false}
footer ={null}
closable = {false}
keyboard = {true}
className = 'pic-preview-container'>
<div className = 'content'>
<div className = 'left-btn' onClick={leftClick}><img src = {left}/></div>
<div className = 'pic-content'>
<img src = {current} className = 'main-pic' />
<img src = {close} className='close-btn' onClick{()=>{props.setModalShow(false)}}/>
</div>
<div className = 'right-btn' onClick={rightClick}><img src = {right}/></div>
</div>
</Modal>
)
}
export default Memo(PicturePreview);
样式less文件如下
.ant-modal-root{
.pic-preview-container{
width:9rem !important;
padding-bottom: 0 !important;
.ant-modal-content{
background:tansparent;
box-shadow: 0 0 0 rgba(0 ,0 ,0,0);
.content{
background-color:transparent;
display:flex;
flex-direction:row;
align-items:center;
justify-content:center;
.left-btn{
justify-content:center;
align-items:center;
display:flex;
width: 0.4rem;
height:0.7rem;
background:#000000
opacity:.5;
margin-right:.2rem;
img{
display:inline-block;
height:.25rem;
width:.15rem;
}
}
.right-btn{
margin-left:.2rem;
justify-content:center;
align-items:center;
display:flex;
width:.4rem;
height:.7rem;
background:#000000;
opacity:.5;
img{
display:inline-block;
height:.25rem;
width:.15rem;
}
}
.pic-content{
position:relative;
.main-pic{
max-width:11rem;
max-height:8rem;
}
.close-btn{
display:inline-block;
width:.4rem;
height:.4rem;
position:absolute;
right:-0.2rem;
top:-0.2rem;
}
}
}
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。