巧用 CSS 实现高频出现的复杂怪状按钮 - 镂空的内凹圆角边框
在之前,我们有些过这么一篇文章 - 使用 CSS 轻松实现高频出现的各类奇形怪状按钮。
里面包含了如下这些图形:

你可以在这里看到:CodePen Demo -- CSS Various Button Shapes | CSS 各种造型按钮
接下来几篇文章中,将在上述基础上,额外补充一些在日常设计稿中,常见的,可能出现的更为复杂的几个按钮,本文,我们来尝试实现这个造型:

不镂空的内凹圆角按钮
在文章开头的贴图中,其实是有和这个按钮非常类似的造型:

此造型如果内部无需镂空,整体还是比较简单的,利用 background: radial-gradient() 径向渐变或者 mask,都能比较轻松的实现。
我们快速回顾一下,看这样一个简单的例子:
<div></div>
div {
background-image: radial-gradient(circle at 100% 100%, transparent 0, transparent 12px, #2179f5 12px);
}
可以得到这样一个图形:

所以,只需控制下 background-size,在 4 个角实现 4 个这样的图形即可:
<div class="inset-circle">inset-circle</div>
&.inset-circle {
background-size: 70% 70%;
background-image: radial-gradient(
circle at 100% 100%,
transparent 0,
transparent 12px,
#2179f5 13px
),
radial-gradient(
circle at 0 0,
transparent 0,
transparent 12px,
#2179f5 13px
),
radial-gradient(
circle at 100% 0,
transparent 0,
transparent 12px,
#2179f5 13px
),
radial-gradient(
circle at 0 100%,
transparent 0,
transparent 12px,
#2179f5 13px
);
background-repeat: no-repeat;
background-position: right bottom, left top, right top, left bottom;
}

借助 mask 实现渐变的内切圆角按钮
如果背景色要求渐变怎么办呢?
假设我们有一张矩形背景图案,我们只需要使用 mask 实现一层遮罩,利用 mask 的特性,把 4 个角给遮住即可。
mask 的代码和上述的圆角切角代码非常类似,简单改造下即可得到渐变的内切圆角按钮:
<div class="mask-inset-circle">inset-circle</div>
.mask-inset-circle {
background: linear-gradient(45deg, #2179f5, #e91e63);
mask: radial-gradient(
circle at 100% 100%,
transparent 0,
transparent 12px,
#2179f5 13px
),
radial-gradient(
circle at 0 0,
transparent 0,
transparent 12px,
#2179f5 13px
),
radial-gradient(
circle at 100% 0,
transparent 0,
transparent 12px,
#2179f5 13px
),
radial-gradient(
circle at 0 100%,
transparent 0,
transparent 12px,
#2179f5 13px
);
mask-repeat: no-repeat;
mask-position: right bottom, left top, right top, left bottom;
mask-size: 70% 70%;
}
这样,我们就得到了这样一个图形:

镂空的内凹圆角边框
但是,如果要求内部是整体镂空,只展示内凹圆角边框,整个复杂度一下就上来了。
上面的方法以及不适用了,原因在于很难利用 mask 制造一个不规则的内凹圆角形状进行裁剪,因此,我们必须另辟蹊径。
渐变偏移技巧
在 CSS 高阶小技巧 - 角向渐变的妙用! 一文中,我们介绍了渐变一个非常有意思的偏移技巧:
举个例子,下面是角向渐变 conic-gradient() 的简单介绍:
{
background: conic-gradient(deeppink, yellowgreen);
}
从渐变的圆心、渐变起始角度以及渐变方向上来说,是这样的:

划重点:
从图中可以看到,角向渐变的起始圆心点、起始角度和渐变方向为:
- 起始点是图形中心,
- 默认渐变角度 0deg 是从上方垂直于圆心的
- 渐变方向以顺时针方向绕中心实现
当然,我们也可以控制角向渐变的起始角度以及角向渐变的圆心。
稍微改一下上述代码:
{
background: conic-gradient(from 270deg at 50px 50px, deeppink, yellowgreen);
}
效果如下:

我们改变了起始角度以及角向渐变的圆心:

了解了这个之后。我们基于上述的图形,重新绘制一个图形:
div {
margin: auto;
width: 200px;
height: 200px;
background: conic-gradient(from 270deg at 50px 50px, deeppink 0%, deeppink 90deg, transparent 90deg, transparent
360deg);
border: 1px solid #000;
}
效果如下:

起始角度以及角向渐变的圆心没有改变,但是只让前 90deg 的图形为粉色,而后 270deg 的图形,设置为了透明色。
我们利用角向渐变,在图像内部,又实现了一个小的矩形!
接下来,我们再给上述图形,增加一个 background-position: -25px, -25px:
div {
margin: auto;
width: 200px;
height: 200px;
background: conic-gradient(from 270deg at 50px 50px, deeppink 0%, deeppink 90deg, transparent 90deg, transparent
360deg);
background-position: -25px -25px;
border: 1px solid #000;
}
这样,我们就神奇的得到了这样一个图形:

为什么会有这样一种现象?如果我们在代码中加入 background-repeat: no-repeat:
div {
width: 200px;
height: 200px;
background: conic-gradient(from 270deg at 50px 50px, deeppink 0%, deeppink 90deg, transparent 90deg, transparent
360deg);
background-position: -25px -25px;
background-repeat: no-repeat;
border: 1px solid #000;
}
那么就只会剩下左上角一个角:

因此,这里实际上利用了渐变图形默认会 repeat 的特性,实际上是这么个意思:

理解了这张图,也就理解了整个技巧的核心所在!
利用径向渐变实现圆环偏移
掌握了上述渐变的偏移技巧后,我们将上述的角向渐变的案例,移植到径向渐变。
首先,我们利用径向渐变,实现一个小圆环:
<div></div>
div {
width: 300px;
height: 120px;
border: 1px solid #ddd;
background: radial-gradient(30px at 30px 30px, transparent calc(98% - 5px),#000 calc(100% - 5px) 98%, transparent);
}
解释一下,上述渐变语句的含义是在 30px 30px 处,实现一个半径为 30px 的径向渐变,渐变颜色为透明到黑色到透明,因此可以得到一个圆环:

为了方便大家看清楚 div 整体大小,利用
border: 1px solid #ddd展示了整个 div 的轮廓,下图开始隐藏 border
然后,利用上述的技巧,我们让渐变图形,整体偏移 -30px -30px,也就是让径向渐变图形的圆心,处于div的左上角 0 0 坐标处。
div {
width: 300px;
height: 120px;
border: 1px solid #ddd;
background: radial-gradient(30px at 30px 30px, transparent calc(98% - 5px),#000 calc(100% - 5px) 98%, transparent);
background-position: -30px -30px;
}
此时,图形就变成了这样(下图去掉了 border):

到这,大家应该能恍然大悟了吧。剩下的工作就比较简单了,我们只需要利用多重线性渐变,把剩余的线条补充出来即可,整个图形完整的代码如下:
div {
width: 300px;
height: 120px;
background:
radial-gradient(30px at 30px 30px, transparent calc(98% - 5px),#ff2287 calc(100% - 5px) 98%, transparent),
linear-gradient(#ff2287, #ff2287),
linear-gradient(#ff2287, #ff2287),
linear-gradient(#ff2287, #ff2287),
linear-gradient(#ff2287, #ff2287);
background-position:
-30px -30px,
29px 0, 29px 100%, // 两条横边
0 29px, 100% 29px; // 两条纵边
background-size:
100% 100%,
calc(100% - 58px) 5px, calc(100% - 58px) 5px,
5px calc(100% - 58px), 5px calc(100% - 58px);
background-repeat:
repeat,
no-repeat, no-repeat,
no-repeat, no-repeat;
}
这样,我们就成功得到了我们想要的不镂空的内凹圆角边框:

当然,我们肯定是需要不同边框大小、颜色的各种不镂空的内凹圆角边框,我们利用 CSS 变量再进行一下封装:
.g-custom {
background:
radial-gradient(var(--border_radius) at var(--border_radius) var(--border_radius), transparent calc(97% - var(--border_width)),var(--color) calc(100% - var(--border_width)) 98%, transparent),
linear-gradient(var(--color), var(--color)),
linear-gradient(var(--color), var(--color)),
linear-gradient(var(--color), var(--color)),
linear-gradient(var(--color), var(--color));
background-position:
calc(-1 * var(--border_radius)) calc(-1 * var(--border_radius)),
calc(var(--border_radius) - 1px) 0, calc(var(--border_radius) - 1px) 100%, // 两条横边
0 calc(var(--border_radius) - 1px), 100% calc(var(--border_radius) - 1px); // 两条纵边
background-size:
100% 100%,
calc(100% - calc(var(--border_radius) * 2 - 2px)) var(--border_width), calc(100% - calc(var(--border_radius) * 2 - 2px)) var(--border_width),
var(--border_width) calc(100% - calc(var(--border_radius) * 2 - 2px)), var(--border_width) calc(100% - calc(var(--border_radius) * 2 - 2px));
background-repeat:
repeat,
no-repeat, no-repeat,
no-repeat, no-repeat;
}
.g-custom-1 {
width: 200px;
height: 120px;
--color: #6678ff;
--border_radius: 15px;
--border_width: 1px;
}
.g-custom-2 {
width: 240px;
height: 160px;
--color: #448800;
--border_radius: 35px;
--border_width: 3px;
}
.g-custom-3 {
width: 180px;
height: 180px;
--color: #df73a0;
--border_radius: 40px;
--border_width: 6px;
}
这样,控制三个 CSS 变量,就可以得到各种不同样式的边框了:

完整的代码,你可以戳这里:CodePen Demo -- 内凹角边框 & inner-corner-border
怎么样,一个非常有技巧性的 CSS 图形,你 Get 到了吗?
最后
好了,本文到此结束,希望本文对你有所帮助
想 Get 到最有意思的 CSS 资讯,千万不要错过我的公众号 -- iCSS前端趣闻
更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
巧用 CSS 实现高频出现的复杂怪状按钮 - 镂空的内凹圆角边框的更多相关文章
- CSS布局技巧 -- 内凹圆角
圆角,相信每一个了解CSS属性的都知道,通过border-radius实现圆角(外凸圆角),但是如果需要实现内凹圆角怎么办呢?比如四角内凹的元素,比如如下所示这样的内凹圆角 对于这种问题,很多人的反应 ...
- css边框内凹圆角,解决优惠券的边框问题
关于css边框内凹圆角,找了好久才找到的 <html <head> <title>无标题页</title> <style> body{ backg ...
- CSS实现多重边框和内凹圆角
CSS实现多重边框 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...
- HTML&CSS面试高频考点(二)
HTML&CSS面试高频考点(一) ♥ 6. W3C盒模型与怪异盒模型 标准盒模型(W3C标准) 怪异盒模型(IE标准) 怪异盒模型下盒子的大小=width(content + bord ...
- 巧用 CSS 构建渐变彩色二维码
今日,群里有个很有意思的问题,问我如何实现一个彩色的,带渐变的二维码,像是这样: 很有意思的问题,我们在百度谷歌,搜索 qrcode,能搜到非常多在线制作二维码的工具,它们其中一些也会带有制作渐变二维 ...
- css圆角边框
一.CSS3圆角的优点 传统的圆角生成方案,必须使用多张图片作为背景图案.CSS3的出现,使得我们再也不必浪费时间去制作这些图片了,而且还有其他多个优点: * 减少维护的工作量.图片文件的生成.更新. ...
- CSS第四天总结 更多的属性 圆角 边框图片 段落属性 颜色渐变 盒子阴影
圆角边框: border-radius 一个值时表示四个角用的圆半径,4个值时分别是左上角.右上角.左下角.右下角,单位可以是px和百分比,百分比是半径相对于边框长度的比例 在CSS3中我们终于 ...
- 你真的知道css三种存在样式(外联样式、内部样式、内联样式)的区别吗?
css样式在html中有三种存在形态: 内联样式:<div style="display: none"></div> 内部样式: <style> ...
- [css]《css揭秘》学习(四)-一个元素实现内圆角边框
如图所示的圆角边框有两个元素很好实现,用一个元素也可以实现. <html> <head> <meta charset="utf-8"> < ...
- 第50天学习打卡(CSS 圆角边框 盒子阴影 定位)
4.4圆角边框 圆角边框: <!DOCTYPE html> <html lang="en"> <head> <meta char ...
随机推荐
- php 安装使用 seaslog扩展
这是一个高性能的日志记录扩展,能迅速帮你格式化的写入日志文件. 首先来看安装: sudo pecl install seaslog 一句话搞定,然后更新php.ini配置文件 添加启用以及一部分配置 ...
- 从0搭建一个FIFO模块-02(系统架构)
一.异步FIFO需要注意的问题 所谓异步FIFO,指的是写时钟与读时钟可以不同步,读时钟可以比写时钟快,反之亦然.思考一下,这样会直接地造成两个问题: 由于异步FIFO的基本存储单元是双端口RAM,因 ...
- [python] Python异步编程库asyncio使用指北
Python的asyncio模块提供了基于协程(coroutines)的异步编程(asynchronous programming)模型.作为一种高效的编程范式,异步编程允许多个轻量级任务并发执行,且 ...
- Yii2之model
记录model常用方法 between: $model->andFilterWhere(['between','apply_time',$startTime,$endTime])
- manim边做边学--曲面
Surface类是Manim中专为创建和操控复杂的三维表面而打造的. 在实际应用中,无论是创建数学教学中的几何模型,还是模拟物理现象中的曲面变化,甚至是构建复杂的动画场景中的三维元素,Surface类 ...
- ZCMU-1038
其实感觉不太难,读懂题意就行,我一开始没有仔细去读感觉就很懵.其题目意思就是一段字符串含有数字和'<'或者'>',一开始从左开始遍历,遇到'>'这类东西换方向,如果有多次遇到就删之前 ...
- vue3 封装api接口
新建axiosj.ts import axios from 'axios'; import { showMessage } from "./status"; // 引入状态码文件 ...
- jumpserver 工单系统 二次开发工单管理并开源代码
介绍 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统.JumpServer 帮助企业以更安全的方式管控和登录所有类型的资产,实现事前授权.事中监察.事后审计,满 ...
- VTK 9.2 Qt 5.14 安装及错误处理
参考VTK9.1.0在Windows10+VS2019+Qt 5.15.2环境下编译安装以及VTK应用于QT_vtk-qt安装包_isongxw的博客-CSDN博客 安装注意:编译release和de ...
- 【前端】【H5 API】Web存储 Web Storage
Web存储 传统的方式是使用document.cookie来进行存储,但是由于其存储空间有限(大约4KB),并且需要复杂的操作来解析,给开发者带来了诸多不便. 为此,HTML 5规范提出了网络存储的相 ...