Изменение фонового изображения с помощью Javascript
Я пытался создать слайд-шоу на одной из веб-страниц, которые я создавал. Я создал div с уникальным именем класса, который предназначен для изменения фонового изображения с помощью JavaScript. До сих пор мне удавалось делать следующее:
- захватите div, где я хочу изменить фоновое изображение с помощью querySelector
- предпринята попытка изменить фоновое изображение указанного div с помощью JavaScript
Я отлаживал эту функцию используя DevTools, я все же не могу понять, почему изображение не изменится. Есть идеи, что здесь происходит? Я включил фрагменты кода ниже. Спасибо.
HTML
<div class="content-one-right">
<div class="inner-content-one-right">
<div class="slideshow-container">
<a class="prev" onclick="transitionSlides(-1)">❮</a>
<a class="next" onclick="transitionSlides(1)">❯</a>
</div>
</div>
</div>
CSS
.content-one-right {
grid-column: col-start 7 / span 6;
height: 60vh;
}
.inner-content-one-right {
height: 90%;
width: 90%;
}
.slideshow-container {
height: 100%;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
background-image: url('../images/home-slideshow/home1.jpg');
background-repeat: no-repeat;
background-size: cover;
}
.prev, .next {
cursor: pointer;
color: #FFF;
font-weight: bold;
font-size: 1em;
border-radius: 0 3px 3px 0;
}
.prev:hover, .next:hover {
background-color: rgba(0,0,0,0.8);
}
JavaScript
var slideshowIndex = 0;
function transitionSlides(n) {
var images = ["home1", "home2", "home3", "home4", "home5", "home6"];
slideshowIndex += n;
if(slideshowIndex < 0) {
slideshowIndex = images.length-1;
}
else if (slideshowIndex >= images.length) {
slideshowIndex = 0;
}
var getContainer = document.getElementsByClassName('slideshow-container')[0];
var imageToChange = "url('../images/home-slideshow/" + images[slideshowIndex] + ".jpg')";
getContainer.style.backgroundImage = imageToChange;
}
2 ответа:
Я думаю, что проблема заключается в том, как вы пытаетесь изменить фоновое изображение. Первый раз, когда вы устанавливаете его, вы устанавливаете его в таблице стилей. Вы используете свойство CSS там.
Позже вы попытаетесь изменить его, используя свойство
.style
элемента. Это не одно и то же. Из этой страницы:Свойство style не является полезным для полного изучения стили, применяемые к элементу, так как он представляет только CSS декларации, установленные в атрибут встроенного стиля элемента, а не те которые исходят из правил стиля в других местах, таких как правила стиля в раздел, или внешние таблицы стилей.
Чтобы уточнить, попробуйте сделать это в консоли на этой самой странице:
document.querySelectorAll('input[type="submit"]')[3].style
Это захватывает синюю кнопку в нижней части страницы, на которой написано "опубликовать свой ответ". Он довольно четко получил синий фон, который установлен в CSS. Но этот объект CSSDeclaration в консоли имеет только пустые значения. Это потому, что он только отражает встроенные стили , а не стили, применяемые с помощью CSS.
Весело, да? С этим знанием, я думаю, вы можете выбрать тот или иной способ, чтобы сделать ваше слайд-шоу так, как вы ожидаете. Хотя, наверное, проще всего вообще не использовать фоновое изображение. Я думаю, что обычно там есть тег
img
и использовать javascript для установки атрибутаsrc
.
Вы сталкиваетесь с той же проблемой, что и в этом посте . Есть хорошая информация, предоставленная там тоже есть. При запуске кода в JSFiddle он просто создает следующее исключение:
transitionSlides is not defined.
Удалите обработчик onclick и используйте вместо негоaddEventListener()
. Было бы лучше использовать ID для ваших кнопок prev и next, но это будет работать:HTML:
<div class="content-one-right"> <div class="inner-content-one-right"> <div class="slideshow-container"> <a class="prev">❮</a> <a class="next">❯</a> </div> </div> </div>
JavaScript:
var slideshowIndex = 0; document.getElementsByClassName('prev')[0].addEventListener("click", function() { transitionSlides(-1); }, false); document.getElementsByClassName('next')[0].addEventListener("click", function() { transitionSlides(1); }, false); function transitionSlides(n) { var images = ["home1", "home2", "home3", "home4", "home5", "home6"]; slideshowIndex += n; if(slideshowIndex < 0) { slideshowIndex = images.length-1; } else if (slideshowIndex >= images.length) { slideshowIndex = 0; } var getContainer = document.getElementsByClassName('slideshow-container')[0]; var imageToChange = "url('../images/home-slideshow/" + images[slideshowIndex] + ".jpg')"; getContainer.style.backgroundImage = imageToChange; }