服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

由小见大!不规则造型按钮解决方案

日期: 来源:脚本之家收集编辑:SbCo
 关注
“脚本之家
”,与百万开发者在一起

出品 | iCSS前端趣闻 (ID:cocoicss)

已获得原公众号的授权转载

今天,有个群友在群里提问,使用 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 各种造型按钮[1]

那么,问题来了,我们有没有办法,通过上述图形,得到侧边两条线是斜线的效果呢?

有了右边的图形,想要得到我们最终的效果不就手到擒来了么?像是这样:

那么,怎么实现呢?其实也非常好做,这里利用了 CSS 3D 旋转,形成了一种视觉上的景深效果,来实现侧边由竖直到斜边的转化。

看看代码,其实就两行代码,在上述 outside-circle 的图形基础上:

  1. 设置一个适当的 perspective
  2. 设置一个恰当的旋转圆心 transform-origin
  3. 绕 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[2]

最后

本文的目的更多的是介绍一种可行的小技巧,实际中实现上述的效果可能有更好的方法,譬如切图?有更好的解法的,欢迎补充指正。

好了,本文到此结束,希望本文对你有所帮助 :)

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

参考资料

[1]

CodePen Demo -- CSS Various Button Shapes | CSS 各种造型按钮: https://codepen.io/Chokcoco/pen/QWMoBGO?editors=1100

[2]

CodePen Demo -- Unregular Border: https://codepen.io/Chokcoco/pen/mdGdejG


  推荐阅读:
2023年最新最全 VSCode 插件推荐!
重大进展!开源鸿蒙成功适配PC
字节面试:连接一个不存在的 IP 地址,会发生什么?
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
Office 2019/2021专业增强版,正版终身授权!
<END>

大家注意:因为微信最近又改了推送机制,经常有小伙伴说错过了之前的文章,比如一些送书的限时福利,错过了就是错过了。


所以建议大家加个星标,就能第一时间收到推送。

相关阅读

  • Linus再发飙:这就是一堆垃圾!

  • 关注“脚本之家”,与百万开发者在一起出品 | OSC开源社区(ID:oschina2013)Linux 6.3 内核的合并窗口已开启,Linus Torvalds 也收到了大量的 PR,目前总体看来正在有序进行。但 Li
  • 偷偷盘点面试官才知道的事

  • 关注“脚本之家”,与百万开发者在一起文 | 小林coding出品 | 小林coding(ID:CodingLin )已获得原公众号的授权转载春招来临之际,很多同学对于面试都充满各种各样的疑问。比如,第
  • 效率提升神器!看看时间都去哪了?

  • 关注“脚本之家”,与百万开发者在一起原创:开源小分队(微信公众号ID:sourceteam)已获得原公众号授权转载大叔说春节假期回来之后,我工作就一直心不在焉的,严重怀疑我每天上班都在
  • Linux 中 CPU 利用率是如何算出来的?

  • 关注“脚本之家”,与百万开发者在一起来源公众号:开发内功修炼 ID:kfngxl已获得原公众号的授权转载在线上服务器观察线上服务运行状态的时候,绝大多数人都是喜欢先用 top 命令
  • 贴心为民 | 回暖,势不可挡

  • 转眼间二月已经临近尾声了虽然早晚还是冷但午后却越来越有春天的样子了明天我们就要走进新的一周了天气仍以多云到晴为主气温迈进了升温的“快车道”最高气温15°C左右最低
  • 惠民活动 | 2023年一季度惠民生促消费活动来啦!

  • 晋州市2023年一季度惠民生促消费活动方案按照石家庄市商务局《关于做好汽车消费促进月活动筹备工作的通知》要求,为充分激发汽车消费潜力,稳定和扩大居民消费,繁荣经济市场,经市

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 由小见大!不规则造型按钮解决方案

  • 关注“脚本之家”,与百万开发者在一起出品 | iCSS前端趣闻 (ID:cocoicss)已获得原公众号的授权转载今天,有个群友在群里提问,使用 CSS 能否实现下述这个图形:emmm,中间这个酷似三次
  • Linus再发飙:这就是一堆垃圾!

  • 关注“脚本之家”,与百万开发者在一起出品 | OSC开源社区(ID:oschina2013)Linux 6.3 内核的合并窗口已开启,Linus Torvalds 也收到了大量的 PR,目前总体看来正在有序进行。但 Li
  • 偷偷盘点面试官才知道的事

  • 关注“脚本之家”,与百万开发者在一起文 | 小林coding出品 | 小林coding(ID:CodingLin )已获得原公众号的授权转载春招来临之际,很多同学对于面试都充满各种各样的疑问。比如,第
  • “C# 不停止膨胀,必将走向灭亡”

  • 关注“脚本之家”,与百万开发者在一起编程语言更新的频率是越快越好,还是越慢越好,不断增加的功能是否真的就是开发者想要的?原文链接:https://medium.com/codex/c-is-dying-fa2
  • 社区搭台,他们的老年生活越唱越“有戏”

  • 日前,记者走进位于营口市西市区通惠社区三楼的文化活动室,京胡的高亢、月琴的潺潺、三弦的清脆伴着声声戏腔不绝于耳。春节过后,通惠社区惠友京剧社开启了首轮社团活动,近20名老