var gallery = document.getElementsByClassName('gallery')[0];
var images = gallery.getElementsByClassName("gallery-img");
var currentIndex = -1;
var timeoutMs = 3000;
gallery.getElementsByClassName('gallery-btn-prev')[0].addEventListener('click', prevSlide);
gallery.getElementsByClassName('gallery-btn-next')[0].addEventListener('click', nextSlide);
initializeAndRunSlider(gallery);
function initializeAndRunSlider(gallery) {
nextSlide();
setTimeout(initializeAndRunSlider.bind(null, gallery), timeoutMs);
}
function prevSlide(e) {
currentIndex = mod(currentIndex - 1, images.length);
displayCurrentImage();
}
function nextSlide(e) {
currentIndex = mod(currentIndex + 1, images.length);
displayCurrentImage();
}
function displayCurrentImage() {
hideAllImages(images);
showImage(images, currentIndex);
}
function hideAllImages(images) {
for (var i = 0; i < images.length; i++) {
removeClass(images[i], 'visible');
addClass(images[i], 'hidden');
}
}
function showImage(images, index) {
removeClass(images[index], 'hidden');
addClass(images[index], 'visible');
}
function mod(m, n) {
return (m + n) % n;
}
function addClass(el, className) {
if (el.classList) el.classList.add(className);
else el.className += ' ' + className;
}
function removeClass(el, className) {
if (el.classList) el.classList.remove(className);
else el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
}
function hasClass(el, className) {
if (el.classList) el.classList.contains(className);
else new RegExp('(^|)' + className + '(|$)', 'gi').test(el.className);
}
.gallery {
position: relative;
}
.gallery-images {
position: relative;
}
.gallery-img {
position: absolute;
top: 0;
width: 100%;
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+ */
-o-user-select: none;
user-select: none;
}
.gallery-controls {
position: absolute;
top: 50vh;
width: 100%;
z-index: 100;
}
.gallery-btn {
font-size: 3em;
opacity: 0.25;
cursor: pointer;
}
.gallery-btn:hover {
opacity: 0.75;
}
.gallery-btn-prev { float: left; }
.gallery-btn-prev:before { content: "◄"; }
.gallery-btn-next { float: right; }
.gallery-btn-next:before { content: "►"; }
/* https://fvsch.com/code/transition-fade/test5.html */
.visible {
visibility: visible;
opacity: 1;
transition: opacity 2s linear;
}
.hidden {
visibility: hidden;
opacity: 0;
transition: visibility 0s 1s, opacity 1s linear;
}
<div class="gallery">
<div class="gallery-images">
<img class="gallery-img visible" src="http://placehold.it/128x48/7ff/700?text=First">
<img class="gallery-img" src="http://placehold.it/128x48/ff7/007?text=Second">
<img class="gallery-img" src="http://placehold.it/128x48/f7f/070?text=Third">
</div>
<div class="gallery-controls">
<div class="gallery-btn gallery-btn-prev"></div>
<div class="gallery-btn gallery-btn-next"></div>
</div>
</div>
おかげで、私はギャラリーの下にボタンを配置しようとすると、なぜそれが動作を停止するのですか?ボタンをクリックすると画像が2回変わります – Cassy
ギャラリーの画像の 'position'を' absolute'に設定してボタンが機能しなくなったので、ボタンはギャレーの下にあり、現在は高さと幅を導入して固定されていますギャラリーの親div。これは、ボタンをクリックすると2回変化します。これは、ボタンを1回トリガし、もう1度はsetInterval関数によってトリガされるためです。 – acesmndr
大変ありがとうございます。私は実際にブラウザの一番下にスクロールバーが表示されているので、ギャラリーを幅100%に設定すると、それが使用するという意味ではありません全体の窓とより多くの? – Cassy