Q137796
by jun68ykt
HTML
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css">
<div id="app"></div>
CSS
.app {
padding: 10px;
}
.main-image, .thumbs {
overflow: hidden;
}
.main-image { margin-left: 32px; }
.main-image div,
.thumbs div
{
float: left;
}
.thumbs div
{
margin-right: 5px;
}
.thumbs img {
width: 180px;
}
.main-image .fas {
padding-top: 90px;
padding-right: 10px;
padding-left: 10px;
color: #888;
}
React
const Thumbnails = ({mainImageIndex, imageUrls}) => {
const thumbs = [...Array(imageUrls.length-1)].map((_, i) =>
<div key={i}>
<img src={imageUrls[(mainImageIndex + i + 1) % imageUrls.length]} />
</div>
);
return <div className="thumbs">{thumbs}</div>;
};
class App extends React.Component {
constructor(props) {
super(props);
this.imageUrls = [
'https://dummyimage.com/360x240/f29b91/fff&text=1',
'https://dummyimage.com/360x240/efbd40/fff&text=2',
'https://dummyimage.com/360x240/81d654/fff&text=3',
'https://dummyimage.com/360x240/f092c4/fff&text=4',
];
this.onArrowClicked = this.onArrowClicked.bind(this);
this.state = {
mainImageIndex: 0
};
}
onArrowClicked(direction) {
return () => {
let index = this.state.mainImageIndex;
switch(direction) {
case 'next':
index = (index + 1) % this.imageUrls.length;
break;
case 'prev':
index = index > 0 ? index - 1 : this.imageUrls.length - 1;
break;
}
this.setState({ mainImageIndex: index });
};
}
render() {
return (
<div className="app">
<div className="main-image">
<div onClick={this.onArrowClicked('prev')}><i className="fas fa-arrow-left fa-4x"></i></div>
<div><img src={this.imageUrls[this.state.mainImageIndex]}/></div>
<div onClick={this.onArrowClicked('next')}><i className="fas fa-arrow-right fa-4x"></i></div>
</div>
<Thumbnails mainImageIndex={this.state.mainImageIndex} imageUrls={this.imageUrls} />
</div>
);
}
}
ReactDOM.render(<App />, document.querySelector("#app"))