#javascript
#javascript
Вопрос:
Я пытаюсь заставить этот слайдер изображения работать без jQuery; используя значки font awesome в качестве кнопок next и previous. Когда я изменяю значение imgCounter
переменной, изображение меняется, однако я не могу заставить его работать должным образом.
var $ = function(id) {
return document.getElementById(id);
};
var imgCounter = 0;
var next = function() {
if (imgCounter < 6) {
imgCounter ;
} else {
imgCounter = 0;
}
}
window.onload = function() {
// where image will display
var imageNode = $('display');
var slideNode = $('slides');
// gathers all the images in an array
var slides = document.getElementsByClassName('img');
//to target a specific index
imgCounter = imgCounter % slides.length;
var image = slides[imgCounter];
//to switch the current photo with the next one in the array
imageNode.src = image.src;
$('right').onclick = next;
};
<section id="slider">
<img id="display" src="" alt="display" />
<i id="left" class="fa fa-arrow-left fa-4x" aria-hidden="true"></i>
<i id="right" class="fa fa-arrow-right fa-4x" aria-hidden="true"></i>
<div id="slides">
<img class="img" src="images/20anniversary-large.png" alt="anniversary" />
<img class="img" src="images/53rd.jpg" alt="53rd" />
<img class="img" src="images/Award.png" alt="Award">
<img class="img" src="images/rotator-03-lg.jpg" alt="rotator-03-lg" />
<img class="img" src="images/rotator01lg.jpg" alt="rotator01lg" />
<img class="img" src="images/rotator-02-lg.jpg" alt="rotator-02-lg" />
</div>
</section>
Комментарии:
1. Взгляните на это: jsfiddle.net/t2emherc
2. можете ли вы объяснить, что у вас не работает? Просто сказать, что он не работает должным образом, не проясняет, какие проблемы у вас на самом деле.
3. извините, когда я нажал на кнопку далее, это не изменило изображения.
Ответ №1:
Вот пример фреймворка, с которым можно поиграть:
var $ = function(query) {
return document.querySelector(query);
};
var $all = function(query) {
return document.querySelectorAll(query);
};
var imageSlider = (function() {
var imgCounter = 0;
var next = function() {
imgCounter ;
if (imgCounter >= $all('.img').length) {
imgCounter = 0;
}
changeImage();
}
var changeImage = function() {
var imageNode = $('#display');
var slides = $all('.img');
var image = slides[imgCounter];
imageNode.src = image.src;
}
return {
changeImage: changeImage,
next: next
}
})();
window.onload = function() {
imageSlider.changeImage();
$('#right').onclick = function() {
imageSlider.next();
}
};
div#slides > img {
display: none;
}
<section id="slider">
<i id="left" class="fa fa-arrow-left fa-4x" aria-hidden="true">Left</i>
<img id="display" src="" alt="My ducks slider" />
<i id="right" class="fa fa-arrow-right fa-4x" aria-hidden="true">Right</i>
<div id="slides">
<img class="img" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Bucephala-albeola-010.jpg/220px-Bucephala-albeola-010.jpg" alt="anniversary" />
<img class="img" src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Mallard_drake_.02.jpg/220px-Mallard_drake_.02.jpg" alt="53rd" />
<img class="img" src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Mandarin.duck.arp.jpg/220px-Mandarin.duck.arp.jpg" alt="Award">
<img class="img" src="https://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/Mallard_drake_and_blue_mood.jpg/220px-Mallard_drake_and_blue_mood.jpg" alt="rotator-03-lg" />
<img class="img" src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/52/Ducks_in_the_ponds.JPG/220px-Ducks_in_the_ponds.JPG" alt="rotator01lg" />
<img class="img" src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Parrulo_-Muscovy_duckling.jpg/220px-Parrulo_-Muscovy_duckling.jpg" alt="rotator-02-lg" />
</div>
</section>
Ответ №2:
Я не мог действительно следовать вашему коду, но я создал чистое решение JavaScript, CSS, HTML. Посмотрите на этот JSBin, чтобы вы могли увидеть его в действии: https://jsbin.com/kixofal/5/edit?html ,css,js, вывод
HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<div id="slider" data-showing="2">
<div class="slide image-1"></div>
<div class="slide image-2"></div>
<div class="slide image-3"></div>
</div>
<button class="button previous">left</button>
<button class="button next">right</button>
</body>
</html>
JAVASCRIPT:
function initSlider() {
var slider = document.querySelector("#slider");
var previousButton = document.querySelector(".previous");
var nextButton = document.querySelector(".next");
var slides = slider.querySelectorAll(".slide");
var animationDuration = 700;
// put slides in it's initial place
var currentIndex = slider.dataset.showing * 1;
[].forEach.call(document.querySelectorAll(".slide"), function(elem, i){
i = i 1; // index starts at 0
if(i === currentIndex) return;
elem.style.transform = i < currentIndex ? "translateX(-100%)" : "translateX(100%)";
});
// prevent user from bursting through the slides.
function onAnimationEnd() {
clearTimeout(slider.isMoving);
slider.isMoving = undefined;
}
function moveSlide(animationName){
var direction = 0;
if(animationName === "left") direction = -1;
if(animationName === "right") direction = 1;
return function() {
// check if it is currently moving
if(!isNaN(slider.isMoving)) return;
// some old devices might skip a few animationEnd events
// setTimeout is used as a last reource to prevent that to happen.
slider.isMoving = setTimeout(onAnimationEnd, animationDuration 50);
var current = slider.dataset.showing * 1;
var next = current direction;
if(next < 1) next = 3;
if(next > slides.length) next = 1;
var currentSlide = slider.querySelector(".image-" current);
var nextSlide = slider.querySelector(".image-" next);
currentSlide.style.animationName = "slide-out-" animationName;
nextSlide.style.animationName = "slide-in-from-" animationName;
slider.dataset.showing = next;
};
}
previousButton.addEventListener("click", moveSlide("left"), false);
nextButton.addEventListener("click", moveSlide("right"), false);
slider.addEventListener("animationend", onAnimationEnd, false);
}
window.addEventListener("load", initSlider, false);
CSS:
#slider {
overflow: hidden;
position: relative;
width: 100%;
/* viewport units to keep the ratio */
height: 50vw;
}
.slide {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-size: cover;
background-position: 50% 50%;
animation-fill-mode: forwards;
animation-duration: 700ms;
animation-timing-function: ease;
}
.image-1 {
background-image: url("http://www.freedigitalphotos.net/images/img/homepage/87357.jpg");
}
.image-2 {
background-image: url("http://www.gettyimages.pt/gi-resources/images/Homepage/Hero/PT/PT_hero_42_153645159.jpg");
}
.image-3 {
background-image: url("http://www.gettyimages.ca/gi-resources/images/Homepage/Hero/UK/CMS_Creative_164657191_Kingfisher.jpg");
}
// animations
@keyframes slide-out-left {
from { transform: translateX(0); }
to { transform: translateX(-100%); }
}
@keyframes slide-out-right {
from { transform: translateX(0); }
to { transform: translateX(100%); }
}
@keyframes slide-in-from-left {
from { transform: translateX(100%); }
to { transform: translateX(0); }
}
@keyframes slide-in-from-right {
from { transform: translateX(-100%); }
to { transform: translateX(0); }
}
Редактировать
Я забыл упомянуть, что в этом решении отсутствуют префиксы браузера, которых я избегал, чтобы попытаться сохранить решение в чистоте.
Кроме того, это решение не использует jQuery или какие-либо другие внешние модули, и оно скорее ориентировано на то, чтобы позволить графическому процессору отображать смену слайдов (пытаясь оптимизировать анимацию, чтобы каждое устройство могло отображать ее плавно).