Я сделал простое слайд-шоу с CSS-анимацией в Angular. Работает хорошо, но между изображениями наблюдается белое мерцание, которое, я полагаю, зависит от загрузки изображения. Есть ли способ избежать этого мерцания и сделать его плавным?
CSS-файл
.bg{
background-size: 100%;
background-repeat: no-repeat;
background-attachment: fixed;
height: 100vh;
animation: BgAnimation forwards;
animation-duration: 8s;
animation-iteration-count: 1;
animation-timing-function: linear;
animation-direction: normal;
}
@keyframes BgAnimation {
0% { background-image: url(../../assets/outro/1.jpg); }
33% { background-image: url(../../assets/outro/2.png); }
66% { background-image: url(../../assets/outro/3.jpg); }
100% { background-image: url(../../assets/outro/4.png); }
}
HTML-файл
<div class = "bg"></div>
Угловой способ — использовать директиву ngOptimizedImage
в вашем коде, а затем преобразовать код для работы с тегами изображений вместо фонового изображения!
ngOptimizedImage начало работы
Мы можем использовать атрибут pilority, чтобы повысить приоритет загрузки ресурса!
<img ngSrc = "cat.jpg" width = "400" height = "200" priority>
Вы можете использовать приведенный ниже CSS для предварительной загрузки изображений (поскольку тег body отображается при первой загрузке, которая немедленно загружает изображения, упомянутые в содержимом), до начала анимации.
body {
position: relative;
}
body:after {
content: url(https://placehold.co/600x400/000000/FFFFFF/png) url(https://placehold.co/600x400/FFFFFF/000000/png) url(https://placehold.co/600x400/000000/FFFFFF/png) url(https://placehold.co/600x400/FFFFFF/000000/png);
height: 0px;
width: 0px;
visibility: hidden;
position: absolute;
top: -1000px;
}
Вы можете закодировать изображения в base64, чтобы они всегда присутствовали в HTML, но учтите, что это увеличивает размер вашей HTML-страницы (бесполезная трата размера), но это означает, что изображение становится доступным немедленно!
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANS...");
Этот подход сокрытия body:after
работает лучше: stackoverflow.com/questions/1373142/preloading-css-images Ваш работает, но оставляет пустые места.
@Tuffling_Tony Не могли бы вы попробовать установить display: none
, может сработает!
Предварительная загрузка изображения может помочь вам уменьшить или полностью устранить мерцание.
<!-- Preloading images in the DOM -->
<img src = "../../assets/outro/1.jpg" style = "display:none;" alt = "" />
<img src = "../../assets/outro/2.png" style = "display:none;" alt = "" />
<img src = "../../assets/outro/3.jpg" style = "display:none;" alt = "" />
<img src = "../../assets/outro/4.png" style = "display:none;" alt = "" />
<!-- Or using the preload link tag -->
<link rel = "preload" href = "../../assets/outro/1.jpg" as = "image">
<link rel = "preload" href = "../../assets/outro/2.png" as = "image">
<link rel = "preload" href = "../../assets/outro/3.jpg" as = "image">
<link rel = "preload" href = "../../assets/outro/4.png" as = "image">
Есть решения получше, но я нашел это очень простым в использовании, особенно для небольших приложений.