常见需求:CSS 实现弧形卡片的 3 种方式

公众号:程序员白特,欢迎一起交流学习~

原文作者:前端侦探

在平时开发中,有时候会碰到下面这种“弧形”样式,主要分为“内凹”和“外凸”两种类型,如下

图片

该如何实现呢?或者想一下,有哪些 CSS 属性和“弧形”有关?下面介绍 3 种方式,一起看看吧

一、border-radius

通常情况下,我们用border-radius都是这样

div{
border-radius: 20px;
}

这样表示 4 个角都是圆角,并且是标准的正圆

图片

其实,border-radius还支持斜杠的写法,比如

div{
border-radius: 20px / 10px;
}

这表示,圆角是一个x半径为20pxy半径为10px的椭圆,如下

图片

放大来看,其实是这样的

图片

进一步,我们将x半径设置成50%,这样就能得到一个完整的弧形了

div{
border-radius: 50% / 20px;
}

效果如下

图片

这样就得到了“外凸”的弧形了,是不是很容易?

至于“内凹”弧形,单纯的border-radius表示无能为力,可以看接下来的方式

二、伪元素+border-radius

这个其实大多数同学都能想到的方式,一个矩形和一个椭圆组合起来,不就是一个弧形卡片了吗?原理非常简单

图片

用代码实现就是

div{
position: relative;
}
div::after{
content: '';
position: absolute;
width: 100%;
height: 20px;
border-radius: 100%;
background: inherit; /* 继承父级背景 */
bottom: 0;
left: 50%;
transform: translate(-50%,50%);
}

效果如下(虚线表示伪元素的边缘)

图片

用伪元素的好处是,可以随意控制弧度的「大小」「位置」,这个是border-radius所不能比的

通过overflow:hidden裁剪多余部分,可以得到一个边缘比较“锋利”的弧形,如下所示

图片

另外,用伪元素还能实现“内凹”的效果,不过这需要反过来思考,什么意思呢?之前是给伪元素加的背景,现在需要加在伪元素的外围,这里用box-shadow实现,原理如下

图片

用代码实现就是

div{
background: none;
overflow: hidden;
}
div::after{
content: '';
background: none;
box-shadow: 0 0 0 9999vh #FFE8A3; /*足够大的阴影*/
z-index: -1;
}

效果如下(虚线表示伪元素的边缘)

图片

三、径向渐变

提到圆弧,还可以想到径向渐变,没错,这里通过径向渐变也能轻易实现弧形卡片效果。

先来看“外凸”的,其实思路和伪元素一样,先拆分,一个椭圆和一个矩形,对应的就是径向渐变(radial-gradient)和线性渐变(linear-gradient),如下

图片

用代码实现就是

div{
background:
radial-gradient(closest-side, #9747FF 100%,transparent 0) center bottom/100% 20px no-repeat,
linear-gradient(#FFE8A3, #FFE8A3) 0 0/100% calc(100% - 10px) no-repeat;
}

效果如下(紫色部分是径向渐变)

图片

再来看“内凹”的弧形,其实也和伪元素思路类似,只不过这里需要绘制一个足够大的渐变,从透明到纯色的径向渐变,示意如下

图片

调整好渐变中心点,用代码实现就是

div{
background: radial-gradient(50% 10px at center bottom, transparent 100%,#FFE8A3 0) center bottom;
}

效果如下(全部都是径向渐变绘制)

图片

当然你也可以随意改变径向的弧度和大小,来实现各种不同的效果。

以上所有demo都可以查看以下在线链接

  • CSS radius layout (juejin.cn)[1]

  • CSS radius layout (codepen.io)[2]

四、优缺点总结

以上就是本文的全部内容了,共介绍了 3 种不同的方式,下面总结一下各自优缺点

  1. border-radius 支持斜杠语法,可以单独控制圆弧的x、y半径,实现“外凸”圆弧最简单,缺点是圆弧不能自定义弧度,也不能实现“内凹”效果

  2. 伪元素最符合常规思维,可以解决以上问题,缺点是需要占用伪元素,略微麻烦

  3. 渐变实现和伪元素拼接思路类似,缺点是语法复杂,需要熟练掌握渐变语法

大家可以根据自己的实际场景自行选择适当的方式,当然最好都能够掌握,这样碰到类似需求时才能游刃有余,如果你有其他的思路,欢迎留言讨论。最后,如果觉得还不错,对你有帮助的话,欢迎点赞、收藏、转发 ❤❤❤

[1]CSS radius layout (juejin.cn): https://code.juejin.cn/pen/7307633420241534985

[2]CSS radius layout (codepen.io): https://codepen.io/xboxyan/pen/RwveByx

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解关于CSS3弧形跑道效果和飞机弧形飞行动画的相关内容,是吗?以下是相关的介绍和实现方法: 1. CSS3弧形跑道效果 CSS3可以用border-radius属性实现圆角效果,如果把四个角都设置为50%,就能实现圆形效果。而如果只把左上角和左下角设置为50%,右上角和右下角设置为0%,就能实现左半圆的效果。用同样的方法,可以实现右半圆、上半圆、下半圆的效果。因此,可以通过组合这些半圆形来实现弧形效果。具体实现方法如下: ``` <div class="path"> <div class="semi-circle-left"></div> <div class="semi-circle-right"></div> </div> .path { position: relative; width: 200px; height: 100px; } .semi-circle-left, .semi-circle-right { position: absolute; width: 100px; height: 100px; border-radius: 50%; } .semi-circle-left { top: 0; left: 0; border-top-right-radius: 0; border-bottom-right-radius: 0; transform: rotate(-90deg); background-color: #f00; } .semi-circle-right { top: 0; right: 0; border-top-left-radius: 0; border-bottom-left-radius: 0; transform: rotate(90deg); background-color: #00f; } ``` 其中,.path表示弧形路径,.semi-circle-left和.semi-circle-right表示左半圆和右半圆。通过设置它们的位置、大小和旋转角度,就能实现弧形路径的效果。 2. CSS3飞机弧形飞行动画 CSS3可以通过animation属性实现动画效果。对于飞机弧形飞行动画,可以将飞机用一个div表示,然后通过关键帧动画来实现飞行效果。具体实现方法如下: ``` <div class="plane"></div> .plane { position: absolute; width: 50px; height: 50px; background-color: #000; border-radius: 50% 50% 0 0; transform: rotate(45deg); animation: fly 5s linear infinite; } @keyframes fly { 0% { top: 0; left: 0; transform: rotate(45deg); } 25% { top: 100px; left: 100px; transform: rotate(135deg); } 50% { top: 200px; left: 200px; transform: rotate(225deg); } 75% { top: 100px; left: 300px; transform: rotate(315deg); } 100% { top: 0; left: 400px; transform: rotate(405deg); } } ``` 其中,.plane表示飞机,通过设置它的大小、颜色、圆角和旋转角度,就能实现飞机的效果。通过设置关键帧,就能实现飞机沿着弧形路径飞行的效果。通过设置animation属性,就能让动画无限循环播放。 希望以上内容能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值