ポップアップやライトボックスにはいろいろライブラリがありますが、画像のみであればギャラリー形式(次々に画像を表示させる方法)で表示できるのに、テキストも付けたい場合にちょうどよく機能してくれるものが見つかりませんでした。
そこで自作した時のコードです。
最初にHTMLから。
<div class="container">
<!--まず画像のリスト-->
<ul class="popup_list">
<li><a class="popup_open" data-target="popup_01" href=""><img src="./images/img-01.jpg" alt=""></a></li>
<li><a class="popup_open" data-target="popup_02" href=""><img src="./images/img-02.jpg" alt=""></a></li>
<li><a class="popup_open" data-target="popup_03" href=""><img src="./images/img-03.jpg" alt=""></a></li>
</ul>
<!--ここからポップアップ表示させるコンテンツ-->
<div class="popup_content">
<div class="popup_box" id="popup_01">
<div class="tit"><span>Popup01</span></div>
<img src="./images/img-01.jpg" alt="">
<p>テキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div><!--/.popup_box-->
<div class="popup_box" id="popup_02">
<div class="tit"><span>Popup02</span></div>
<img src="./images/img-02.jpg" alt="">
<p>テキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div><!--/.popup_box-->
<div class="popup_box" id="popup_03">
<div class="tit"><span>Popup03</span></div>
<img src="./images/img-03.jpg" alt="">
<p>テキストテキストテキストテキストテキストテキストテキストテキスト</p>
</div><!--/.popup_box-->
</div><!--/.popup_content-->
</div>
popup_list の data-target=”popup_01″が ポップアップするコンテンツのpopup_boxのidになります。
popup_boxの中身は適宜変更してください。
次にcssです。
/* popup_list */
.container{
margin: 50px auto;
}
.popup_list{
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.popup_list li{
width: 30.7%;
margin-bottom: 40px;
}
.popup_list li a{
display: block;
width: 100%;
height: 100%;
}
.popup_list li img{
width: 100%;
border-radius: 3px;
}
/* popup_content */
.popup_bg{
position:fixed;
top:0;
bottom:0;
left:0;
right:0;
width: 100%;
height: 100vh;
background: rgba(64,73,82,0.8);
transition: 0.4s;
z-index:101;
}
.popup_content{
position: relative;
}
.popup_box{
display: none;
position: fixed;
top:50%;
left:50%;
transform: translateX(-50%) translateY(-50%);
z-index: 110;
width: 490px;
height: 480px;
background: #fff;
padding: 20px;
}
.popup_box .tit{
text-align: center;
margin:0 auto 20px;
}
.popup_box .tit span{
display: inline-block;
width: 127px;
height: 27px;
color:#fff;
font-size: 14px;
line-height: 27px;
background: #404952;
border-radius: 3px;
}
.popup_box img{
width: 100%;
border-radius: 3px;
margin-bottom: 20px;
}
.popup_box p{
font-size: 14px;
line-height: 1.8;
}
/* popup_nav */
.popup_nav .prev{
position:absolute;
top:50%;
left:-40px;
transform: translateY(-50%);
width: 30px;
height: auto;
z-index:130;
}
.popup_nav .next{
position:absolute;
top:50%;
right:-40px;
transform: translateY(-50%);
width: 30px;
height: auto;
}
.popup_nav .prev.disabled,
.popup_nav .next.disabled{
display: none;
}
/*--close btn--*/
.popup_close{
width: 30px;
height: 30px;
cursor: pointer;
position:absolute;
top:20px;
right:20px;
z-index:120;
}
.popup_close span {
display: block;
overflow: hidden;
white-space: nowrap;
text-indent: 100%;
width: 30px;
height: 2px;
background: #434c55;
position: absolute;
left: 50%;
top: 50%;
}
.popup_close span:nth-child(1) {
transform: translate(-50%, 50%) rotate(45deg);
}
.popup_close span:nth-child(2) {
transform: translate(-50%, 50%) rotate(-45deg);
}
@media screen and (max-width : 768px) {
.popup_close{
top:-10px;
right:-10px;
background: rgba(255,255,255,0.8);
border-radius: 50%;
}
.popup_close span {
width: 20px;
height: 2px;
left: 50%;
top: 45%;
}
.popup_close span:nth-child(1) {
transform: translate(-50%, 50%) rotate(45deg);
}
.popup_close span:nth-child(2) {
transform: translate(-50%, 50%) rotate(-45deg);
}
}
@media screen and (max-width : 600px) {
.popup_box{
width: 94%;
height: auto;
margin: 0 auto;
background: #fff;
display: flex;
flex-direction: column;
align-items: center;
}
.popup_nav .prev{
left:25px;
width:20px;
}
.popup_nav .next{
right:25px;
width: 20px;
}
}
最後にメインのjsです。
$(function(){
$('.popup_open').on('click',function(event){
event.preventDefault();
$('body').append('<div class="popup_bg"></div>');
$('.popup_bg').fadeIn();
var popup = '#' + $(this).attr('data-target'),
$popupBox = $('.popup_box'),
$popupGroup = $(popup).parents('.popup_content'),
$popups = $popupGroup.children('.popup_box'),
popupCount = $popups.length,
currentIndex = $(popup).index(),
popupClose =`
<div class="popup_close">
<span></span>
<span></span>
</div>`,
popupNav =`
<div class="popup_nav">
<a href="" class="prev"><img src="https://web-parts-box.com/sample/popup-01/images/arrow_white02.png" alt="next"></a>
<a href="" class="next"><img src="https://web-parts-box.com/sample/popup-01/images/arrow_white.png" alt="prev"></a>
</div>`;
$(popup).show();
$popupBox.append(popupClose);
$popupBox.append(popupNav);
setNav();
function setNav (){
$nav = $popups.find('.popup_nav'),
$navPrev = $nav.find('.prev'),
$navNext = $nav.find('.next');
if(currentIndex === 0){
$navPrev.addClass('disabled');
} else {
$navPrev.removeClass('disabled');
}
if(currentIndex === popupCount-1){
$navNext.addClass('disabled');
} else {
$navNext.removeClass('disabled');
}
}
$('.popup_bg, .popup_close').off().click(function(){
$popupBox.fadeOut();
$('.popup_bg,.popup_close,.popup_nav').fadeOut(function(){
$('.popup_bg,.popup_close,.popup_nav').remove();
});
});
//next,prev
$('.popup_nav').on('click','a', function(event){
event.preventDefault();
$(this).parents('.popup_box').fadeOut();
function goToPopup (index){
$popups.eq(index).fadeIn();
currentIndex = index;
updateNav();
}
function updateNav(){
if(currentIndex === 0){
$navPrev.addClass('disabled');
} else {
$navPrev.removeClass('disabled');
}
if(currentIndex === popupCount - 1){
$navNext.addClass('disabled');
} else {
$navNext.removeClass('disabled');
}
}
if($(this).hasClass('prev')){
goToPopup(currentIndex - 1);
} else {
goToPopup(currentIndex + 1);
}
});
});
});