#javascript #css #slider
Вопрос:
Я пытаюсь применить «непрозрачность / скольжение влево» для моего автоматического ползунка, но я не смог этого сделать. Пожалуйста, помогите мне с этим.
let images = ["images/a.jpg", "images/b.jpg", "images/c.jpg", "images/d.jpg", ]; let i = 0; function changeImg() { document.querySelector("#slider img").src = images[i]; if (i lt; images.length - 1) { i ; } else { i = 0; } setTimeout("changeImg()", 1000); } onload(changeImg());
#slider img { width: 100vw; height: 60vh; transition: opacity 2s ease-out; }
lt;section id="slider"gt; lt;img name="slide" width="400" height="200" /gt; lt;/sectiongt;
Комментарии:
1. Извините, но почему вы можете это сделать? где именно вы столкнулись с проблемой?
2. Слайдер работает нормально, но когда изображения меняются, я хочу добавить плавный переход. Поэтому я добавил этот «переход: облегчение непрозрачности 2s», но он не работает.
3. Я нигде не вижу, чтобы непрозрачность изображения менялась, поэтому никакого перехода никогда не происходит. Кстати, вы сможете изменить непрозрачность только входящего изображения, а не исходящего, так как в любой момент времени есть только одно место для отображения изображения. Это то, чего ты хочешь?
4. ДА. Пожалуйста, напишите код для реализации этого.
Ответ №1:
Первоначальное требование состоит в том, чтобы изображение исчезло и появилось другое.
Это может быть достигнуто путем размещения изображений одно поверх другого (абсолютное положение) и непрозрачности 0 с переходом, установленным на непрозрачность. Когда это конкретное изображение, поверните, чтобы показать изображение, прежде чем оно будет установлено в непрозрачность 0, а для нового изображения будет установлена непрозрачность 1.
let images = ["https://picsum.photos/id/1015/300/300", "https://picsum.photos/id/1016/200/300", "https://picsum.photos/id/1018/300/200.jpg", "https://picsum.photos/id/1022/400/300", ]; const slider = document.querySelector('#slider'); const imgEls = []; images.forEach(image =gt; { let imgEl = document.createElement('img'); imgEl.src = image; imgEls.push(imgEl); slider.appendChild(imgEl); }); let i = 0; function changeImg() { imgEls[i].style.opacity = 0; if (i lt; images.length - 1) { i ; } else { i = 0; } imgEls[i].style.opacity = 1; setTimeout("changeImg()", 1000); } window.onload = changeImg;
#slider { width: 100vw; height: 60vh; position: relative; isplay: felx; justify-content: center; align-items: center; } #slider img { display: inline-block; width: 100vw; height: 60vh; object-fit: contain; transition: opacity 2s ease-out; opacity: 0; position: absolute; top: 0; left: 0; }
lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"gt;lt;/scriptgt; lt;section id="slider"gt; lt;https://stackoverflow.com/questions/69870264/how-to-add-css-transitions-to-automatic-slider#img name="slide" width="400" height="200" /gt; lt;/sectiongt;
Хотя действие, похоже, соответствует тому, что обсуждалось в комментариях, оно не создает реального «слайдера», и в вопросе также говорится о скольжении влево с помощью CSS.
Этот фрагмент использует несколько иной подход к коду вопроса, поскольку, как только начальная настройка слайдов была выполнена с использованием Javascript, все остальное выполняется с помощью CSS. Это имеет то преимущество, что система может просто передать анимацию на графический процессор без необходимости прерывать работу основной программы по тайм-ауту.
Каждое изображение расположено слева на 100% (т. Е. справа от экрана), и ему дается та же анимация, что и другому — переместитесь в центр, подождите, а затем переместитесь влево — непрозрачность уменьшается и уменьшается соответственно. Однако изображения начинают анимироваться в шахматном порядке, поэтому скольжение выглядит непрерывным.
const slider = document.querySelector('#slider'); const images = ["https://picsum.photos/id/1015/300/300", "https://picsum.photos/id/1016/200/300", "https://picsum.photos/id/1018/300/200", "https://picsum.photos/id/1022/400/300"]; let div; let count = 0; images.forEach(image =gt; { div = document.createElement('div'); div.style.animationDelay = (count * 2) 's'; count ; div.style.setProperty('--img', 'url(' image ')'); slider.appendChild(div); }); slider.style.setProperty('--n', count);
#slider { overflow: hidden; width: 100vw; height: 60vh; position: relative; } #slider div { width: 100%; height: 100%; position: absolute; left: 0; top: 0; opacity: 0; display: inline-block; background-size: contain; background-position: center center; background-repeat: no-repeat; background-image: var(--img); animation-name: slide; animation-iteration-count: infinite; animation-timing-function: linear; animation-duration: calc(var(--n) * 2s); animation-fill-mode: forwards; } @keyframes slide { 0% { opacity: 0; transform: translateX(100vw); } 12.5% { opacity: 1; transform: translateX(0); } 25% { opacity: 1; transform: translateX(0); } 37.5%, 100% { opacity: 0; transform: translateX(-100vw); } }
lt;div id="slider"gt;lt;/divgt;
Обратите внимание, что настройки ключевых кадров предполагают 4 изображения. Значения % должны были бы быть изменены на большее или меньшее количество. К сожалению, CSS не допускает переменных в качестве значений % в ключевых кадрах, поэтому JS в идеале должен найти количество изображений и создать правильные ключевые кадры.
Комментарии:
1. Спасибо за ваш ответ, но это далеко за пределами моего понимания. Я был бы рад, если бы это было написано в соответствии с кодом, который я предоставил.
2. Кое-что из того, что вы хотите, можно сделать на основе вашего исходного кода. Вы можете оставить все как есть, просто добавив JS, чтобы установить непрозрачность текущего img на 0, а для следующего-на непрозрачность 1. Тогда ваш переход будет иметь некоторый эффект, но ваш код действительно слишком ограничен наличием только одного элемента, в котором можно отобразить изображение, чтобы сделать что-то похожее на слайдер.