效果
实现
js代码:
import React, { Component } from 'react';
import Carousel from 'nuka-carousel';
import './largePreview.scss';
const Index = props => {
return props.visible ? <LargePriview {...props} /> : null;
};
/**
* @param {Array} pics 图片数组 [ {img: ''}, {img: ''} ]
* @param {boolean} visible 是否展示大图预览
* @param {number} currentIndex 当前是第几张图片,数组下标
* @param {function} close 关闭当前图片预览
*/
class LargePriview extends Component {
constructor(props) {
super(props);
this.state = {
screenHeight: '100%',
currentIndex: 1,
toggleBarHeight: 0,
pics: []
};
}
componentWillMount = () => {
if (navigator.userAgent.indexOf('cheshangtong') > -1) {
this.setState({
pics: JSON.parse(WBCST.getParamFromUrl('pic')),
currentIndex: Number(WBCST.getParamFromUrl('index'))
});
} else {
this.setState({
pics: this.props.location.param.pic,
currentIndex: this.props.location.param.index
});
}
WBCST.toggleTitlePanel(
{
hideNavBar: true,
bounces: 0,
statusBarStyle: 'light'
},
data => {
this.setState({
toggleBarHeight: data.toggleBarHeight
});
}
);
};
componentDidMount() {
const screenHeight = (document && document.body.clientHeight) || '100%';
this.setState({
screenHeight
});
}
screenHeight = () => {
const screenHeight = (document && document.body.clientHeight) || '100%';
let clientWidth = document.querySelector('body').offsetWidth;
const { toggleBarHeight } = this.state;
let height =
toggleBarHeight > 50 ? toggleBarHeight : toggleBarHeight + (45 / 375) * clientWidth;
return screenHeight - height;
};
handleImgClick(show, index) {
this.setState({
currentIndex: index
});
}
handleTop = () => {
const { toggleBarHeight } = this.state;
let clientWidth = document.querySelector('body').offsetWidth;
let top =
toggleBarHeight > 50 ? toggleBarHeight - (45 / 375) * clientWidth : toggleBarHeight;
return top;
};
render() {
const { screenHeight, currentIndex, pics } = this.state;
return (
<div className="imgs-large-wrapper">
<div style={{ height: this.handleTop() }} className="pre-status"></div>
<div className="imgs-top-float">
<div
className="close"
onClick={() => {
if (navigator.userAgent.indexOf('cheshangtong') > -1) {
WBCST.closeCurrentPage();
} else {
this.props.history.go(-1);
}
}}></div>
<div className="imgs-index-style">
{currentIndex + 1}/{pics.length}
</div>
<div className="right"></div>
</div>
<div>
<Carousel
autoplay={false}
slideIndex={currentIndex}
defaultControlsConfig={{
nextButtonText: '',
prevButtonText: '',
nextButtonStyle: {
display: 'none'
},
prevButtonStyle: {
display: 'none'
},
pagingDotsStyle: { display: 'none' }
}}
afterSlide={index => {
this.handleImgClick(true, index);
}}>
{pics.map((imgItem, imgIndex) => {
return (
<div
className="imgs-carousel-box"
style={{ height: this.screenHeight() }}
key={imgIndex}>
<img src={imgItem} />
</div>
);
})}
</Carousel>
</div>
</div>
);
}
}
export default LargePriview;
css代码:
$baseFontSize:32px !default;
//pixels to rems
@function pxToRem($px){
@return $px / $baseFontSize * 1rem;
}
.imgs-large-wrapper {
height: 100%;
width: 100%;
background: #000000;
overflow: hidden;
.pre-status{
background: #000000;
}
.imgs-top-float {
width: 100%;
height: pxToRem(88px);
display: flex;
align-items: center;
padding: 0 pxToRem(30px);
flex-direction: row;
justify-content: space-between;
.close{
background: url('./../../img/close.png');
background-repeat: no-repeat;
background-size: 100%;
width: pxToRem(60px);
height: pxToRem(60px);
}
.imgs-index-style {
width: 100%;
font-size: pxToRem(34px);
font-family: PingFang-SC-Bold,PingFang-SC;
color:#FFFFFF;
text-align: center;
}
.right{
width: pxToRem(60px);
}
}
.imgs-carousel-box {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。