了解一下border-radius的实现原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoermingn/article/details/53497607

一、简述

我们都知道css 3有一个属性border-radius可以给盒子设置圆角,我当初也只是知道有这个属性,并且知道一些用法,从来没有深入了解过它的作用原理。我们知道将border-radius设置正方形边长的一半或者50%或者100%就可以实现一个原型,但你知道为什么吗?下面我们就一起来探讨一下。


二、常用场景

我一般将border-radius用于以下两种情况:

1.设置圆角让按钮/图片柔和一点
这里写图片描述

2.将头像设为圆形
这里写图片描述


三、先回顾一些基本知识

/* 只设置一个角的写法 */
border-top-left-radius: 20px; //设置左上角

border-top-right-radius: 20px; //设置右上角

border-bottom-left-radius: 20px; //设置左下角

border-bottom-right-radius: 20px; //设置左下角
/* 简写,同时设置四个角 */
/* 顺序是 左上-右上-右下-左下 */
border-radius: 20px 10px 10px 20px;

/* 四个角设置统一值可以只写一次 */
border-radius: 20px; 
/* 除了用固定值还可以用百分比 */
border-radius: 50%;

但其实,除了上面常用的写法,其实还有一种设置方法

.box3 {
  border-radius: 20px/40px;
}

这种写法表示用一个水平半径为20px,垂直半径为40px的椭圆来切割border,如果你不懂,没关系,下面通过几张图来了解一下。

四、原理

我们从上面的最后一种写法入手来剖析原理,我把这种写法理解为border-radius的原始写法

.box3 {
  border-radius: 20px/40px;
}

首先,我们有一个box,长为400px,宽为200px

.box {
  width: 400px;
  height: 200px;
  background: #f55;
}

这里写图片描述

现在,通过固定值来设置border-radius,设为100px/50px

.box {
  width: 400px;
  height: 200px;
  background: #f55;
  border-radius: 100px/50px;
}

然后,其作用原理就是下面这张图所示,用一个水平宽为200px,垂直高为100px的椭圆去贴着左上角,左上角多出来(蓝色线区域)的地方就会被切去

这里写图片描述

最后四个角都切去的效果就是

这里写图片描述

我上面说了,我把“border-radius: 100px/50px;“这种写法看做是原始写法,我们把我们常规写法改造一下:

/* 原来写法 */
border-radius: 100px;

/* 改为 */
border-radius: 100px/100px;

你会发现这两种写法的效果是一样的:

这里写图片描述

所以,不管你用那种设置border-radius的方法,原理都是一样的,只不过,一种是省略写法而已。

五、百分比设置原理

我们上面讲的都是设置固定值,这很好理解,我给多大的值,去切割的椭圆就有多大,那么如果设置的是百分比又是一种什么情况呢?

其实,简单的说大家的疑问就是:

百分比是相对谁的?

我们上面说了一种原始写法:

border-radius: 100px/50px;

现在把百分比的写法改写为原始写法:

/* 原来写法 */
border-radius: 50%;

/* 现在改为 */
border-radius: 50%/50%;

我想聪明的你一定知道了,两种写法效果是一样的,上面说到的”/”前面的一个值是椭圆的水平半径,后面的值是椭圆的垂直半径,所以前面的水平半径是相对宽度的,后面的垂直半径是相对高度的。(注意是半径)

六、一个小练习

我们大概了解了原来,下面我们来做一个小练习,完成下面的效果

这里写图片描述

要求: 分别通过固定值和百分比来实现

po一个参考代码,并不是最佳写法,只是想让大家理解百分比的用法
这里写图片描述

上面百分比写法计算公式:

这里写图片描述

宽度小于高度时,交换两个值即可,除不尽时可以四舍五入,有点小误差,但基本可忽略。可以尝试不同的系数,实现多种效果。

七、总结

1.设置border-radius的方法:

/* 单独设置一个角 */
border-top-left-radius: 20px;
border-top-right-radius: 20px;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;

/* 缩写设置 */
border-radius: 20px;/* 所有角设置相同值 */
border-radius: 20px 10px 10px 20px; /* 顺时针顺序 */

/* 百分比设置 */
border-radius: 50%;

/* 椭圆圆弧设置 */
border-radius: 25%/50%; /* 前面一个值代表水平方向,后面一个值代表垂直方向 */

border-radius: 25% 0 0 0/50% 0 0 0;/* 注意,用这种方式分开设置角时要先设置所有角的水平半径,再设置所有角的垂直半径 */

2.border-radius: 50% == border-radius: 50%/50%
前面一个值是相对宽度的百分比,后面一个值是相对高度的百分比

3.border-radius的原理就是拿一个椭圆/圆去切割一个角

4.想实现一个长方形的圆角时,使用上面的百分比公式

猜你喜欢

转载自blog.csdn.net/xiaoermingn/article/details/53497607