手把手教你:如何实现日月交替
前言
在中秋节那天,我用纯 css 做了一个月亮给大家来赏。然后这几天有人给我留言评论说:“既然月亮都做出来了,再来做个太阳吧。” 于是乎,在经过《一天的深思熟虑》后,太阳也用纯 css 实现出来了。
然后在为太阳撰文时,发现写出来的内容很单调,仅仅只是实现一个太阳而已。所以又经过《一天的深思熟虑》后,我决定将月亮和太阳结合起来,来实现一个日月交替效果。
效果展示
- 代码块
实现过程
整个实现过程可以分为两部分:css 实现太阳和月亮,js 实现手动交替。
太阳和月亮
在前面已经实现过月亮的制作,因此在这里依旧使用月亮的模板。对于太阳的实现,也是借鉴了月亮中的关键代码部分,有着异曲同工之妙。这里将主要介绍太阳的实现。
- 主体部分
<div id="container" class="dark">
<div class="bg"></div>
<div class="moon-box">
<div class="moon"></div>
</div>
<div class="sun-box">
<div class="sun"></div>
</div>
<div class="sea"></div>
</div>
- css 部分
.sun{
margin: 0;
padding: 0;
/* 绝对定位 水平垂直居中 */
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
width: 300px;
height: 300px;
background: orange;
box-shadow: 0 0 60px orange;
border-radius: 50%;
}
对 sun 盒子设置border-radius:50%
使其变成圆形,添加背景颜色,设置box-shadow: 0 0 60px orange
添加外围的一层光晕,让太阳更加逼真。
.sea{
position: absolute;
bottom: 0;
width: 100%;
height: 30%;
/* 背景模糊制造大海的感觉 */
backdrop-filter: blur(100px);
-webkit-backdrop-filter: blur(100px);
z-index: 100;
}
对 sea 盒子设置以上属性,这样可以看到一幅太阳从海上升起并落下的画面。使用 backdrop-filter: blur(100px)
让背景模糊,制造出大海的感觉。
- 效果如下
手动交替
这里是实现交替效果的关键部分,以 js 为主导,css 配合 js 一起使用。
- 主体部分
<div class="btn-box">
<div onclick="change('light')">羊了个羊</div>
<div onclick="change('dark')">狼了个狼</div>
</div>
- js 部分
<script>
function change(type){
document.getElementById('container')
.setAttribute('class',type);
}
</script>
做两个按钮,设置onclick
点击事件,并添加自定义change
函数。change
函数的作用是,获取id ='container'
的元素,将 class 定义的类名改变成 type(type为自己定义的类名)。简单点理解就是,点击按钮后,通过改变类名来改变相应的样式。
在按钮处的点击事件,点击羊了个羊
会将样式类名变为light
,点击狼了个狼
会将样式类名变为dark
- css 部分
/* 白天 */
.light .sun-box{
height: 100%;
}
.light .moon-box{
height: 0;
}
.light .bg{
background: #ffeea2;
}
/* 夜晚 */
.dark .sun-box{
height: 0;
}
.dark .moon-box{
height: 100%;
}
.dark .bg{
background: #040720;
}
.sun,
.moon,
.sun-box,
.moon-box,
.bg{
/* 添加动画过渡 */
transition: all 2s ease-in-out;
}
此处 css 部分即点击按钮将最初的样式做出改变,白天和黑夜自然是不同的。并且对月亮和太阳在产生交替的过程中进行过渡效果处理。
最后,完成剩下的样式编写,比如按钮的样式设计。这样,一个可手动进行的日月交替就可以实现了。
- 效果展示
- 代码块
总结
对于日月交替,除了使用 js 来达到交互效果,也可以使用动画来实现。对月亮和太阳设置动画,经过多少时间后太阳落下,月亮升起;经过多少时间后月亮消失,太阳升起。对这种方式感兴趣的小伙伴们可以去尝试一下。
转载自:https://juejin.cn/post/7144269797973295111