Skip to content
扫码开始移动端阅读
CSS实现一个蓝天白云
共
554
字 需要≈
2.77
分钟 css
奇淫技巧
在网上看到一个非常有趣的效果,使用svg实现的蓝天和白云:CodePen地址
效果预览:
改造为vue组件
vue
<script setup>
import { onMounted, ref } from 'vue'
const cloud = ref(null)
// 随机数
const rn =(from, to) => ~~(Math.random() * (to - from + 1)) + from;
// 随机选择一个值
const rs=(...arr)=> arr[rn(0, arr.length - 1)];
// 生成box-shadow
const boxShadows = (max)=>{
let ret = [];
for (let i = 0; i < max; ++i) {
ret.push(`
${ rn(1, 100) }vw ${ rn(1, 100) }vh ${ rn(20, 40) }vmin ${ rn(1, 20) }vmin
${ rs('#11cbd7', '#c6f1e7', '#f0fff3', '#96C9F4') }
`)
}
return ret.join(',');
}
// 更新页面
const update = () => {
cloud.value.style.boxShadow = boxShadows(30)
}
// 页面加载
onMounted(() => {
update()
})
</script>
<style scoped>
.bg::after {
content: '点击更新';
font-size: 1rem;
color: rgba(0, 0, 0, .3);
position: absolute;
z-index: 1;
width: 100%;
bottom: 1rem;
text-align: center;
}
.cloud {
overflow: hidden;
width: 1px;
height: 1px;
transform: translate(-100%, -100%);
border-radius: 50%;
filter: url(#filter);
}
</style>
虽然代码只有50行,但是这个效果还是非常惊艳的,因为会铺满整个页面。所以当做背景还是非常不错的。
原理分析
- 首先通过box-shadow生成一个阴影数组,大小和位置都是随机生成的。
- 然后设置到元素上,通过translate移动到页面之外。
- 最后通过filter滤镜,来生成最终的样式
- fractalNoise:生成随机噪音
- feDisplacementMap:位移映射
- 通过css 的filter滤镜,来生成最终的样式。
写到最后
如果你有好的css特效,也欢迎来分享。
转载请注明来源:LeeDaisen : 《CSS实现一个蓝天白云》