#javascript #html #jquery #css #bootstrap-4
#javascript #HTML #jquery #css #bootstrap-4
Вопрос:
У меня есть три фоновых изображения, которые я хочу исчезать и исчезать с интервалом в 5 секунд. Я также использую собственный компонент начальной загрузки carousel для ввода и вывода текста с интервалом в 5 секунд, чтобы соответствовать и совпадать с изменяющимся и исчезающим фоновым изображением.
Сценарий
-
Проблема 1. Первое фоновое изображение будет фоновым изображением по умолчанию при загрузке страницы. Через 5 секунд второе фоновое изображение исчезает, что также совпадает с тем же временем, когда карусель переходит ко второму тексту. Еще через 5 секунд третье фоновое изображение исчезает, и карусель переходит к следующему тексту.
-
Проблема 2. Компоненты начальной загрузки carousel имеют индикатор, который при нажатии переключается и перемещает его на текст в этой части карусели. Я хочу, чтобы фоновое изображение менялось при нажатии на индикатор карусели. То есть, если щелкнуть индикатор карусели 1, фоновое изображение должно исчезнуть до первого фонового изображения. Это должно применяться ко второму и третьему индикатору карусели и их соответствующим фоновым изображениям. Фоновое изображение НЕ должно меняться и исчезать до щелкаемого, если в настоящее время оно является активным элементом карусели и фоновым изображением.
Текущая ситуация
-
Я смог добиться фонового изображения с эффектом затухания с помощью jquery с помощью решения, которое я также получил здесь, в stackoverflow. Я также создал текстовую карусель, используя компонент bootstrap carousel с опцией (data-interval =»5000″), которая устанавливает время переключения равным 5 секундам, чтобы соответствовать тому же временному интервалу, с которым фоновое изображение исчезает и исчезает, но все еще есть заметная небольшая задержка. Как можно устранить заметную задержку?
-
Изображение иногда мигает перед исчезновением. Есть ли лучший и более подходящий способ добиться эффекта затухания без мигания изображения?
-
Нажатие на индикатор карусели не переключает и не изменяет фоновое изображение на следующее, даже когда я запускал функцию по щелчку. Как это может быть достигнуто правильным способом?
Вот что я пробовал:
var bgImageArray = ["1_ozdgvm.jpg", "2_vjtjfy.jpg", "3_oxpdx2.jpg"],
base = "https://res.cloudinary.com/iolamide/image/upload/v1604569872/home_banner_",
secs = 5;
bgImageArray.forEach(function(img) {
new Image().src = base img;
// caches images, avoiding white flash between background replacements
});
function backgroundSequence() {
window.clearTimeout();
var k = 0;
for (i = 0; i < bgImageArray.length; i ) {
setTimeout(function() {
document.getElementById('animated-bg').style.backgroundImage = "url(" base bgImageArray[k] ")";
// document.getElementById('animated-bg').style.backgroundSize ="cover";
if ((k 1) === bgImageArray.length) {
setTimeout(function() {
backgroundSequence()
}, (secs * 1000))
} else {
k ;
}
}, (secs * 1000) * i)
}
}
backgroundSequence();
$('.carousel-item').click(function() {
backgroundSequence();
})
*,
*::before,
*::after {
margin: 0;
padding: 0;
}
html {
box-sizing: border-box;
}
body {
box-sizing: inherit;
color: #fff !important;
}
.animated-bg {
background-image: url("https://res.cloudinary.com/iolamide/image/upload/v1604569872/home_banner_1_ozdgvm.jpg");
background-size: cover;
background-position: center;
background-repeat: no-repeat;
transition: background 1s;
height: 694px;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.animated-bg:before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.container {
padding: 3rem;
border-radius: 20px;
width: 700px;
background: rgba(0, 0, 0, 0.3);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
}
.text-top p {
width: 400px;
margin: 30px auto;
text-align: center;
}
h1 {
margin-top: 0;
text-align: center;
font-weight: 600;
}
.carousel-item p {
width: 330px;
text-align: center;
}
.carousel-indicators {
bottom: -50px !important;
}
@media only screen and (max-width: 800px) {
.container {
padding: 2rem;
width: 90%;
}
}
@media only screen and (max-width: 500px) {
.text-top p {
width: 80%;
}
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<div class="animated-bg" id="animated-bg">
<div class="container">
<div class="text-top" id="texttop">
<h1>Crossfade and Text Carousel</h1>
<p>Fade background image and swipe text at the same time. Also fade the background image to the one that matches the carousel's text when the carousel's indicator is clicked</p>
</div>
<div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel" data-interval="5000">
<ol class="carousel-indicators">
<li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
<li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
<li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
<div class="carousel-item active">
<p>
Carousel Text One
</p>
</div>
<div class="carousel-item">
<p>Carousel Text Two</p>
</div>
<div class="carousel-item">
<p>Carousel Text Three</p>
</div>
</div>
</div>
</div>
</div>
Ответ №1:
Вам не нужна вся логика создания изображений самостоятельно. Вы можете прослушивать смену слайдов с помощью API carousel on('slide.bs.carousel')
и соответствующим образом переключать изображение.
const bgImageArray = ["1_ozdgvm.jpg", "2_vjtjfy.jpg", "3_oxpdx2.jpg"],
base = "https://res.cloudinary.com/iolamide/image/upload/v1604569872/home_banner_";
bgImageArray.forEach(function(img) {
new Image().src = base img;
// caches images, avoiding white flash between background replacements
});
$('.carousel'). on('slide.bs.carousel', function(e) {
$('.animated-bg').css({
backgroundImage: `url(${base}${bgImageArray[e.to]})`
});
});
*,
*::before,
*::after {
margin: 0;
padding: 0;
}
html {
box-sizing: border-box;
}
body {
box-sizing: inherit;
color: #fff !important;
}
.animated-bg {
background-image: url("https://res.cloudinary.com/iolamide/image/upload/v1604569872/home_banner_1_ozdgvm.jpg");
background-size: cover;
background-position: center;
background-repeat: no-repeat;
transition: background 1s;
height: 694px;
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.animated-bg:before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.container {
padding: 3rem;
border-radius: 20px;
width: 700px;
background: rgba(0, 0, 0, 0.3);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
}
.text-top p {
width: 400px;
margin: 30px auto;
text-align: center;
}
h1 {
margin-top: 0;
text-align: center;
font-weight: 600;
}
.carousel-item p {
width: 330px;
text-align: center;
}
.carousel-indicators {
bottom: -50px !important;
}
@media only screen and (max-width: 800px) {
.container {
padding: 2rem;
width: 90%;
}
}
@media only screen and (max-width: 500px) {
.text-top p {
width: 80%;
}
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<div class="animated-bg" id="animated-bg">
<div class="container">
<div class="text-top" id="texttop">
<h1>Crossfade and Text Carousel</h1>
<p>Fade background image and swipe text at the same time. Also fade the background image to the one that matches the carousel's text when the carousel's indicator is clicked</p>
</div>
<div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel" data-interval="5000">
<ol class="carousel-indicators">
<li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
<li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
<li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
</ol>
<div class="carousel-inner">
<div class="carousel-item active">
<p>
Carousel Text One
</p>
</div>
<div class="carousel-item">
<p>Carousel Text Two</p>
</div>
<div class="carousel-item">
<p>Carousel Text Three</p>
</div>
</div>
</div>
</div>
</div>