javascript - 如何将 css 过渡应用于背景图像更改?
问题描述
如果我使用下面的简单 JS 来更改计时器上的背景图像,我可以应用 CSS 过渡来使这些淡入而不是立即交换吗?
var images = new Array(
'../images/pic1.jpg'
,'../images/pic2.jpg'
,'../images/pic3.jpg'
);
var i = 0;
function swap() {
var elm = document.querySelector('.myCSSClass');
if (i >= images.length) { i = 0 };
elm.style.backgroundImage = 'url(' + images[i] + ')';
i += 1;
}
window.onload = setInterval(swap, 2000);
例如,我正在尝试使用 CSS:
.myCSSClass{
transition: background-image linear 0.3s;
}
但没有得到任何结果。我觉得这是不可能的,因为 javascript 只是覆盖了图像?
解决方案
您只需要确保最初加载所有图像以进行过渡,或者每次调用新图像时都会发生突然变化,因为它将被加载或者您必须等待一个周期,因为您的脚本将加载该周期内的图像。
var images = new Array(
'https://picsum.photos/id/0/300/300',
'https://picsum.photos/id/10/300/300',
'https://picsum.photos/id/15/300/300'
);
var i = 0;
function swap() {
var elm = document.querySelector('.box');
if (i >= images.length) {
i = 0
};
elm.style.backgroundImage = 'url(' + images[i] + ')';
i += 1;
}
window.onload = setInterval(swap, 2000);
.box {
transition: background-image linear 0.5s;
width: 200px;
height: 200px;
background-size: cover;
/* This will force the initial load of all the images*/
background-image:
url(https://picsum.photos/id/0/300/300),
url(https://picsum.photos/id/10/300/300),
url(https://picsum.photos/id/15/300/300);
}
<div class="box"></div>
在上面,您只会在某些浏览器(如 chrome)上褪色。这是另一个想法,我将考虑另一层并依赖不透明度变化:
var images = new Array(
'https://picsum.photos/id/0/300/300',
'https://picsum.photos/id/10/300/300',
'https://picsum.photos/id/15/300/300'
);
var i = 0;
function swap() {
var elm = document.querySelector('.box');
if (i >= images.length) {
i = 0
};
elm.style.backgroundImage = 'url(' + images[i] + ')';
i += 1;
}
window.onload = setInterval(swap, 2000);
.box {
width: 200px;
height: 200px;
background-size: 0 0;
/* This will force the initial load of all the images*/
background-image:
url(https://picsum.photos/id/0/300/300),
url(https://picsum.photos/id/10/300/300),
url(https://picsum.photos/id/15/300/300);
position:relative;
z-index:0;
}
.box:before {
content:"";
position:absolute;
z-index:-1;
top:0;
left:0;
right:0;
bottom:0;
background-image:inherit;
background-size:cover;
animation:op 1s alternate linear infinite 1s;
}
@keyframes op {
to {
opacity:0;
}
}
<div class="box"></div>
推荐阅读
- javascript - HTML选择下拉菜单不更改页面数据
- oauth - 带有 SPA 的 Jira Server OAuth 1.0a 身份验证
- python - Scikit fit_transform、ColumnTransformer 和 OneHotEncoder 的目的不就是对分类数据进行编码,那为什么还要用在数值上呢?
- github - 尝试使用 API 调用提交到 GitHub
- azure - 无法访问 onedrive
- nestjs - 如何从处理请求的服务中获取模块的名称?
- node.js - SQS 队列集成架构
- r - 基于小数点后最大整数值的子集稳定 ID
- javascript - JS/ES 如何重置/重用 Promise
- snowflake-cloud-data-platform - 查看来自 Snowflake 外部的查询