从酷炫的果冻菜单谈起 CSS3 filter 属性
今天中午刷掘金沸点时,看到一个 Jerry Menu,看着效果不错,就像学(抄)习(袭)一下。效果图见下:
这里我要学(抄)习(袭)的就是这个菜单效果,这个 dom 结构还是很简单的。
div.blobs
div.circle.main
div.circle.sub.first
div.circle.sub.second
div.circle.sub.last
用CSS美化一下:
.blobs {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
.circle {
position: absolute;
width: 90px;
height: 90px;
transform: translate(0, -48px);
background: hsl(337, 70%, 58%);
clip-path: circle(42px at center);
}
.circle.main {
z-index: 2;
}
为了更直接到达目标效果,先不做动画,先把各个菜单的位置写好:
.first {
transform: translate(-100px, -120px);
background: hsl(307, 70%, 58%);
}
.second {
transform: translate(0px, -150px);
background: hsl(277, 70%, 58%);
}
.last {
transform: translate(100px, -120px);
background: hsl(247, 70%, 58%);
}
这时候效果就出来了,大致长这样:
最开始的效果是有交互的,那我们就用JS加一点交互:
const button = document.querySelector(".circle.main");
const circles = document.querySelectorAll(".circle.sub");
button.addEventListener("click", function() {
circles.forEach(element => {
element.classList.toggle("show");
});
});
相应地,CSS也要作出变更:
.first {
transition: transform 0.5s 100ms ease-out;
background: hsl(307, 70%, 58%);
}
.second {
transition: transform 0.5s 300ms ease-out;
background: hsl(277, 70%, 58%);
}
.last {
transition: transform 0.5s 500ms ease-out;
background: hsl(247, 70%, 58%);
}
.first.show {
transform: translate(-100px, -120px);
}
.second.show {
transform: translate(0px, -150px);
}
.last.show {
transform: translate(100px, -120px);
}
这时候效果就差不多了:
但是总感觉差了点什么,粘连效果没了,看一下原作者的效果:
赶紧回头看下了作者的源代码,发现作者加了 .blobs { filter: url(#goo); }
这样的滤镜效果,翻看文档看了下:
CSS滤镜属性,可以在元素呈现之前,为元素的渲染提供一些效果,如模糊、颜色转移之类的。滤镜常用于调整图像、背景、边框的渲染。SVG滤镜资源(SVG Filter Sources)是指以xml文件格式定义的svg滤镜效果集,可以通过URL引入并且通过锚点(#element-id)指定具体的一个滤镜元素。
再设置 filter
滤镜并加上相应的 svg 代码之后,整个 Jerry Menu 的效果就学(抄)习(袭)完了,效果如下:
这里附上 MDN上关于 filter 的文档。
来自山西太原的用户 4天前
学习了
来自浙江杭州的用户 10天前
老哥,写得很不错
来自湖南长沙的用户 15天前
涨知识了
来自湖北武汉的用户 19天前
感谢您的文章,又学到了不少东西
来自安徽合肥的用户 20天前
老衲喜欢这篇文章
来自江苏玄武的用户 26天前
,明明可以靠脸吃饭,可是你偏要靠才华,鼓励师都被你撩了我们怎么办
大神 听说你又有才 人又帅
来自北京朝阳的用户 30天前
满满的干货,受益匪浅!如果排版再弄好看点,可能点赞数更高
来自北京朝阳的用户 30天前
小白我没有看懂hhh