如何实现下面这个渐变的边框效果:

这个问题本身不难,实现的方法也有一些,主要是有一些细节需要注意。

border-image

border-image 是 CSS 规范 CSS Backgrounds and Borders Module Level 3 (最新一版的关于 background 和 border 的官方规范) 新增的一个属性值。

顾名思义,我们可以给 border 元素添加 image,类似于 background-image,可以是图片也可以是渐变,不再局限于纯色。

使用 border-image 实现渐变边框

有了 border-image 之后,实现渐变边框变得很方便

不过多介绍 border-image 的语法,读者需要自行了解一下。

实现如下:

.border-image {

width: 200px;

height: 100px;

border-radius: 10px;

border-image-source: linear-gradient(45deg, gold, deeppink);

border-image-slice: 1;

border-image-repeat: stretch;

}

上面关于 border-image 的三个属性可以简写为 border-image: linear-gradient(45deg, gold, deeppink) 1;

得到如下结果:

border-radius 失效

仔细看上面的 Demo,设置了 border-radius: 10px 但是实际表现没有圆角。使用 border-image 最大的问题在于,设置的 border-radius 会失效。

我们无法得到一个带圆角的渐变边框。原因,查看官方规范 W3C 解释如下:

A box's backgrounds, but not its border-image, are clipped to the appropriate curve (as determined by ‘background-clip’). Other effects that clip to the border or padding edge (such as ‘overflow’ other than ‘visible’) also must clip to the curve. The content of replaced elements is always trimmed to the content edge curve. Also, the area outside the curve of the border edge does not accept mouse events on behalf of the element.

为此,我们得另辟蹊径或者稍加改进,得到带圆角的渐变边框。

法一:background-image + 伪元素

第一种方法,我们不再使用 border-image ,而是使用 background-image + 伪元素 的方案,这也是在 border-image 规范没有出现最常用的方法。

非常简单,简单的示意图如下:

利用 background-image 实现一个渐变背景,再通过叠加一个白色背景使之形成一个渐变边框。

缺点

这个方案有两个问题,第一个是多使用了两个元素(当然在这里是 ::before 和 ::after),其次最致命的是,如果要求边框內的背景是透明的,此方案便行不通了。

法二,使用 background-clip 实现

第二种方法,使用 background-clip: content-box 以及 background-clip: border-box 配合使用。

background-clip:background-clip 设置元素的背景(背景图片或颜色)是否延伸到边框下面。它的部分取值和 box-sizing 类似。其中,

background-clip: border-box 表示设置的背景 background-image 将延伸至边框

background-clip: content-box 表示设置的背景 background-image 被裁剪至内容区(content box)外沿

这里,我们使用设置两个 background-image,设置两个 background-clip ,并且将 border 设置为透明即可:

核心 CSS:

div {

width: 200px;

height: 100px;

border: solid 10px transparent;

border-radius: 10px;

background-image: linear-gradient(#fee, #fee),

linear-gradient(to right, green, gold);

background-origin: border-box;

background-clip: content-box, border-box;

}

因为用到了 background-clip: border-box,所以还需要 background-origin: border-box 使图案完整显示,可以尝试下关掉这个属性,即可明白为什么需要这样做。

缺点

与第一种方法类似,如果要求边框內的背景是透明的,此方案便行不通了。

法三:border-image + overflow: hidden

这个方法也很好理解,既然设置了 background-image 的元素的 border-radius 失效。那么,我们只需要给它加一个父容器,父容器设置 overflow: hidden + border-radius 即可:

.border-image-pesudo {

position: relative;

width: 200px;

height: 100px;

border-radius: 10px;

overflow: hidden;

}

.border-image-pesudo::before {

content: "";

position: absolute;

width: 200px;

height: 100px;

top: 50%;

left: 50%;

transform: translate(-50%, -50%);

border: 10px solid;

border-image: linear-gradient(45deg, gold, deeppink) 1;

}

效果如下:

当然,这里还是多借助了一个元素实现。还有一种方法,可以不使用多余元素实现:

法四:border-image + clip-path

设置了 background-image 的元素的 border-radius 失效。但是在 CSS 中,还有其它方法可以产生带圆角的容器,那就是借助 clip-path。

[clip-path](https://developer.mozilla.org/zh-CN/docs/Web/CSS/clip-path),一个非常有意思的 CSS 属性。

clip-path CSS 属性可以创建一个只有元素的部分区域可以显示的剪切区域。区域内的部分显示,区域外的隐藏。剪切区域是被引用内嵌的URL定义的路径或者外部 SVG 的路径。

简而言之,这里,我们只需要在 border-image 的基础上,再利用 clip-path 裁剪出一个带圆角的矩形容器即可:

.border-image-clip-path {

position: relative;

width: 200px;

height: 100px;

border: 10px solid;

border-image: linear-gradient(45deg, gold, deeppink) 1;

clip-path: inset(0 round 10px);

}

解释一下:clip-path: inset(0 round 10px) 。

clip-path: inset() 是矩形裁剪

inset() 的用法有多种,在这里 inset(0 round 10px) 可以理解为,实现一个父容器大小(完全贴合,垂直水平居中于父容器)且 border-radius: 10px 的容器,将这个元素之外的所有东西裁剪掉(即不可见)。

非常完美,效果如下:

当然,还可以利用 filter: hue-rotate()顺手再加个渐变动画:

最后

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

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

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

java 渐变圆_巧妙实现带圆角的渐变边框相关推荐

  1. java如何设置圆角边框_巧妙实现带圆角的渐变边框

    如何实现下面这个渐变的边框效果: 这个问题本身不难,实现的方法也有一些,主要是有一些细节需要注意. border-image border-image 是 CSS 规范 CSS Backgrounds ...

  2. border-image巧妙实现带圆角的渐变边框

    如何实现下面这个渐变的边框效果: 这个问题本身不难,实现的方法也有一些,主要是有一些细节需要注意. border-image border-image 是 CSS 规范 CSS Backgrounds ...

  3. java基本数据类型_老杜带你学Java【第六课】

    上期链接:老杜带你学Java[第五课] 01 写在前面 欢迎来到杜老师的「零基础学Java」课堂~今后,我们就是Java软件工程师了.(此处应该有掌声

  4. java 管理系统 注释_员工管理系统--带注释--oracle系统--java项目

    [实例简介] 员工管理系统--带注释--oracle系统--java项目 [实例截图] [核心代码] 31a0847e-5da9-43d6-b402-f60390d0396d └── person_M ...

  5. lambda表达式java项目常用_一文带你彻底搞懂Lambda表达式

    1. 为什么使用Lambda表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  6. java lambda表达式_凯哥带你从零学大数据系列之Java篇---第二十二章:Lambda表达式...

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  7. java基数排序 数组_万字长文带你掌握Java数组与排序,代码实现原理都帮你搞明白!...

    查找元素索引位置 基本查找 根据数组元素找出该元素第一次在数组中出现的索引 public class TestArray1 { public static void main(String[] arg ...

  8. java etl工具_一文带你入门ETL工具-datax的简单使用

    什么是ETL? ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库或数据集市中,成为联机分析处理.数据挖掘的基础. ETL是数据 ...

  9. 互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

    1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...

最新文章

  1. python 爬虫抓站
  2. 俄罗斯最大搜索引擎Yandex开源了一款梯度提升机器学习库CatBoost
  3. php tcp封包,tcp调试神器:wireshark
  4. Nginx中ngx_http_upstream_module模块
  5. OpenCV曼德布罗特平行线Mandelbrot Parallel的实例(附完整代码)
  6. SetConsoleCursorPosition光标的位置控制
  7. java明文发送_使用java MD5加密网络明文
  8. 通过命令在navicat中创建数据库及表结构
  9. 思科路由器的基本配置1
  10. 组态王bitset用法_组态王使用问题解答6
  11. 美国大学 计算机,U.S.News美国大学计算机专业排名
  12. 中国重汽:香港上市在十月
  13. becon帧 wifi_beacon帧
  14. 你不知道的电脑36个小技巧(纪念2011教师节)
  15. 你想学习吗?你会学习吗?你知道该如何学习吗?学习之道-读书笔记
  16. 电子不停车收费系统(ETC)专题(5)——最新动态
  17. 【附加作业】沈航软件工程期末附加作业
  18. 机房收费系统_刷卡充值功能的实现
  19. 华为R5和linux版什么区别,荣耀MagicBook 15锐龙版r5第三方Linux版怎么样?上手跑分评测...
  20. 业务逻辑漏洞挖掘-某网站绕过下载付费机制进行下载文件

热门文章

  1. 几款视频剪辑软件 轻松完成视频编辑
  2. 解决Winform程序在不同分辨率系统下界面混乱
  3. matlab 图像转视频教程,Matlab制作视频并转换成gif动态图的两种方法
  4. 高通camera OTP与EEPROM
  5. 计蒜客难题题库之一 泥塑课 python解答
  6. 编码的奥秘: ASCII码和字符映射
  7. 2019招聘计算机,2019兴业银行招聘计算机模拟试题及答案
  8. Unity 3D数学\图形学基础-游戏开发(向量)
  9. Java -- 软件开发整体流程;项目环境dev,test,staging,prod
  10. oracle同义词和分区表