明天,有个群友在群里发问,应用 CSS 是否实现下述这个图形:
emmm,两头这个酷似三次贝塞尔曲线的造型,应用 CSS 不太好实现。我的倡议是 切图实现,然而群友要求肯定要用 CSS 实现。
尽管麻烦,然而这个图形勉强也是能用 CSS 实现的。本文就将探讨一下上述图形的纯 CSS 实现形式,并且从中进行肯定的扩大延长。
尝试实现
这个图形其实与咱们的 Chrome Tab 按钮十分相似,像是这样:
不一样之处在于,Chrome 的侧边其实是垂直的竖线,而上述的需要,侧边是一条斜线。
首先,咱们疾速看看这个 Chrome Tab 的交互应该如何实现:
咱们对这个按钮形态拆解一下,这里其实是 3 块的叠加:
只须要想分明如何实现两侧的弧形三角即可。这里还是借助了突变 — 径向突变,其实他是这样,如下图所示,咱们只须要把彩色局部替换为通明即可,应用两个伪元素即可:
代码如下:
<div class="outside-circle"></div>
.outside-circle {
position: relative;
background: #e91e63;
border-radius: 10px 10px 0 0;
&::before {
content: "";
position: absolute;
width: 20px;
height: 20px;
left: -20px;
bottom: 0;
background: #000;
background:radial-gradient(circle at 0 0, transparent 20px, #e91e63 21px);
}
&::after {
content: "";
position: absolute;
width: 20px;
height: 20px;
right: -20px;
bottom: 0;
background: #000;
background:radial-gradient(circle at 100% 0, transparent 20px, #e91e63 21px);
}
}
即可失去:
上述的所有图形的残缺代码,你能够在这里看到:CodePen Demo — CSS Various Button Shapes | CSS 各种造型按钮
那么,问题来了,咱们有没有方法,通过上述图形,失去侧边两条线是斜线的成果呢?
有了左边的图形,想要失去咱们最终的成果不就手到擒来了么?像是这样:
那么,怎么实现呢?其实也十分好做,这里利用了 CSS 3D 旋转,造成了一种视觉上的景深成果,来实现侧边由竖直到斜边的转化。
看看代码,其实就两行代码,在上述 outside-circle
的图形根底上:
- 设置一个适当的
perspective
值 - 设置一个失当的旋转圆心
transform-origin
- 绕 X 轴进行旋转
代码非常简单,咱们其实只须要这样:
.outside-circle {
position: relative;
background: #e91e63;
border-radius: 10px 10px 0 0;
transform: perspective(40px) rotateX(20deg) ;
transform-origin: 50% 100%;
&::before {...}
&::after{...}
}
外围在于这两句:
transform: perspective(40px) rotateX(20deg)
transform-origin: 50% 100%
制作一个动画,会更好了解一点:
是的,再复述一次,这里利用了 CSS 3D 旋转,造成了一种视觉上的景深成果,来实现侧边由竖直到斜边的转化。
利用这个技巧实现梯形
通常,咱们能够利用这个技巧,制作梯形,像是这样:
.trapezoid{
position: relative;
width: 160px;
padding: 60px;
}
.trapezoid:before{
content:"";
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
transform:perspective(40px) scaleY(1.3) rotateX(5deg);
transform-origin: bottom;
background: deeppink;
}
成果如下:
还原题图成果
好,了解了之后,还原题图成果就很简略了。咱们只须要实现一边的成果,再将整个图形左移,利用父容器的 overflow: hidden
裁剪掉右边局部,保留左边即可。
残缺的代码如下:
<div class="g-container">
<div class="g-inner"></div>
</div>
.g-container {
position: relative;
width: 300px;
height: 100px;
background: #2cb2e0;
border: 1px solid #277f9e;
border-radius: 10px;
overflow: hidden;
}
.g-inner {
position: absolute;
width: 150px;
height: 50px;
background: #fee6e0;
bottom: 0;
border-radius: 0 20px 0 20px;
transform: perspective(40px) scaleX(1.4) scaleY(1.5) rotateX(20deg) translate(-10px, 0);
transform-origin: 50% 100%;
&::before {
content: "";
position: absolute;
right: -10px;
width: 10px;
height: 10px;
background: inherit;
mask: radial-gradient(circle at 100% 0, transparent, transparent 9.5px, #000 10px, #000);
}
}
这样,咱们就完满的实现了题目的成果:
残缺的在线示意,戳这里:CodePen Demo — Unregular Border
最初
本文的目标更多的是介绍一种可行的小技巧,理论中实现上述的成果可能有更好的办法,譬如切图?有更好的解法的,欢送补充斧正。
好了,本文到此结束,心愿本文对你有所帮忙 :)
更多精彩 CSS 技术文章汇总在我的 Github — iCSS,继续更新,欢送点个 star 订阅珍藏。
如果还有什么疑难或者倡议,能够多多交换,原创文章,文笔无限,满腹经纶,文中若有不正之处,万望告知。