Body,你背景图咋淡入哇?
李鹏坤 / 2020-04-16
缘由
今天偶然看到本站在加载页面时的一个问题。
由于本站默认是夜间模式,夜间模式是通过 CSS 的 mix-blend-mode: difference
实现的,模式切换通过异步载入的 js 控制。
这就导致背景图片(白色)加载完成后切换到夜间模式会发生闪烁,这违背了黑夜模式的初衷。
过程
对于背景图片的淡入,网上有很多种解决方法。
有说用 animation
+ opacity
的。像这样写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #background-div {
/* 加载自定义的 bgFadeIn 动画 */
animation: bgFadeIn 3s ease-in;
}
@-webkit-keyframes fadeIn {
0% {
/* opacity 属性初始值 */
opacity: 0;
}
100% {
/* 动画完成后 opacity 的值 */
opacity: 1;
}
}
|
也有说用使用 transition
+ opacity
实现的。也就是这样写:
1
2
3
4
5
6
7
8
9
10
11
| #background-div {
/* opacity 属性初始值 */
opacity: 0;
/* transition 控制 opacity 属性 */
transition: opacity 3s ease-in;
}
#background-div:hover {
opacity: 1;
}
|
我用了都没有用。为什么呢?我发现这些都是在控制元素本身,并不能控制元素的 background
,也就是元素的属性。
这种情况下,唯有 JS。
于是,我决定放弃搜索。思考了一下,只要在页面加载时,黑夜白天模式切换加载完成后,对背景进行设置其实就可以解决问题。
解决
也就是这样:
1
2
3
4
5
6
7
| // 黑夜白天模式载入
const mode = new Darkmode(options);
mode.showWidget();
// body 背景 延迟载入
document.body.style.background = 'url(http://xxx)';
document.body.style.backgroundRepeat = 'repeat';
|
这个故事告诉我们,很多时候,解决问题的方法不是我们刚开始想象的那样。
也就是可能一开始的方向可能就是错的问题都没弄清。要变通,虽然一条路是可以走到黑,但是换个角度思考问题,一定是解决问题的正确方法。