CSS3的常见边框汇总

一、简述

我们都知道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一个参考代码,并不是最佳写法,只是想让大家理解百分比的用法
这里写图片描述

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

这里写图片描述

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

#使用

完整用法:border-radius: tl1 tr1 br1 bl1 / tl2 tr2 br2 bl2;

如 border-radius: 1px 2px 3px 4px / 5px 6px 7px 8px;

其中,各个值分别代表:

  • tl1:border-top-left-radius 横轴半径(左上角圆角横轴半径)

  • tr1:border-top-right-radius 横轴半径(右上角圆角横轴半径)

  • br1:border-bottom-right-radius 横轴半径(右下角圆角横轴半径)

  • bl1:border-bottom-left-radius 横轴半径(左下角圆角横轴半径)

  • tl2:border-top-left-radius 纵轴半径(左上角圆角纵轴半径)

  • tr2:border-top-right-radius 纵轴半径(右上角圆角纵轴半径)

  • br2:border-bottom-right-radius 纵轴半径(右下角圆角纵轴半径)

  • bl2:border-bottom-left-radius 纵轴半径(左下角圆角纵轴半径)

也就是说 / 左边的代表的是横坐标半径,右边代表的是纵轴半径,顺序是从左上角顺时针到左下角。

/ 左右可以看成两个不同的部分,他们并不会互相影响。但是当出现缩写的时候,每个部分之间就会出现影响。

#缩写

border-radius 是一个缩写,当它的值没有 / 时,其四个值先后分别代表了四个属性的值:

  • border-top-left-radius:左上角圆角

  • border-top-right-radius:右上角圆角

  • border-bottom-right-radius:右下角圆角

  • border-bottom-left-radius:左下角圆角

当有 / 时,相当于分别把上面四个属性的长轴半径放到了 / 左边,短轴半径放到了 / 右边。

缩写时被省略的属性会取对角的属性的值,如果缩写后只有一个值,那么所有属性都是这个值。

例如:border-radius: 1px 2px 3px; 等同于 border-radius: 1px 2px 3px
2px;(省略了左下,因此左下的值会取右上的值,即 2px)。

再比如:border-radius: 2em 1em 4em / 0.5em 3em; 等同于 border-radius:
2em 1em 4em 1em / 0.5em 3em 0.5em
3em;(以 / 为届分成两部分来看。左边:2em 1em
4em 缺少左下,取右上的值 1em;右边:0.5em
3em,省略了右下,取左上 0.5em,省略了左下,取右上 3em)。

如果只有一个值 border-radius: 1px /
2px;,那么所有属性都会是这个值,即等同于 border-radius: 1px 1px 1px 1px
/ 2px 2px 2px 2px;

下面的表格列举了缩写的所有基本情况及其对应的各个半径:


缩写 tl1 tl2 tr1 tr2 br1 br2 bl1 bl2


border-radius: 1; 1 1 1 1 1 1 1 1

border-radius: 1 1 1 2 2 1 1 2 2
2;

border-radius: 1 1 1 2 2 3 3 2 2
2 3;

border-radius: 1 1 1 2 2 3 3 4 4
2 3 4;

border-radius: 11 11 21 11 21 11 21 11 21
/ 21;

border-radius: 11 11 21 12 21 11 21 12 21
12 / 21;

border-radius: 11 11 21 12 21 13 21 12 22
12 13 / 21 22;

border-radius: 11 11 21 12 22 13 23 14 24
12 13 14 / 21 22
23 24;


说明:

  • 省略了单位

  • 各列的含义:

    • tl1:左上角圆角横轴半径

    • tl2:左上角圆角纵轴半径

    • tr1:右上角圆角横轴半径

    • tr2:右上角圆角纵轴半径

    • br1:右下角圆角横轴半径

    • br2:右下角圆角纵轴半径

    • bl1:左下角圆角横轴半径

    • bl2:左下角圆角纵轴半径

七、border-radius的水平、垂直半径

1、四方都是1/4圆的圆角半径,说明水平和垂直的半径是一样的。

CSS

.br4{

border-radius:10px 20px 30px 40px;}

只要水平和垂直的半径是相等的,产生的就是四分之一圆。

而且,圆角具有外半径内半径之分。

当radius半径值小于border的值时,没有内半径,所以内角是直角,当radius半径值大于border的值时,才有内半径,也才有内圆角。内半径的值等于外半径的值减去border的值。

如果我们需要的是标准的椭圆呢?

CSS

.box1{

width:200px;

height:100px;

border:20px solid #F60;}

.br5{

border-radius:50%;

}

当宽高不一样的时候,半径为50%,则是标准的椭圆。

如果我们设置一个非常大的半径值,则成了橡胶跑道。

CSS

.br6{

border-radius:500px;}

这是为什么呢?

张鑫旭的博客里这篇文章解释的非常清楚:秋月何时了,CSS3
border-radius知多少?

2、当水平、垂直半径不一样的时候

CSS

.br61{

border-radius:100px 50px 60px 40px/50px 100px 30px 20px ;}

此时的语法是border-radius:水平/垂直;

水平、垂直的四个值的方位是左上、右上、右下、左下顺时针方向。

此时水平垂直的值之间是”/“隔开的。

四、边框宽度不一致

CSS

.border1{

border-width:20px 0px 30px;}

.br7{

border-radius:40px;}

边框宽度不一致的时候,圆角是从宽的边向窄的边转动过来的。其实可以理解为外半径是一样的,但是内半径在不断地变大

五、边框颜色不一致

CSS

.border2{

border-color:#FC5505 #0FA81B #0ECDE2 #F5388D;}

.br8{

border-radius:40px;}

当边框的宽度发生变化时:

CSS

.border2{

border-color:#FC5505 #0FA81B #0ECDE2 #F5388D;}

.border3{

border-width:20px 40px 20px 10px;}

.br8{

border-radius:40px;}

可以发现,两个颜色之间的间隔线条的角度与边框的宽度的比值是一样的。比如两条相邻的边框的宽度在这里都是1:2或者2:1,所以90度被分为了三份,每份30度,两倍宽的边框的夹角为60度,一倍宽度的边框的夹角是30度。

六、某个角有圆角

CSS

.br9{

border-top-right-radius:200px 100px;

}

可以单独为某个角设置圆角,此时的语法结构是:border-垂直-水平-radius:水平
垂直;

好蹊跷的语法结构呀,属性名是垂直水平,属性值是水平垂直,能不能统一一点?

还有,此处的两个值中间是空格,不是”/“呀!

七、绘制一个弯弯的月亮

CSS

.moon{

width:100px;

height:100px;

border-right:20px solid #F60;

border-radius:50%;}

八、绘制一条小鱼

CSS

.fish{

width:34px;

height:34px;

position:relative;

background-color:#2c2c2c;

border-radius:80% 0;

transform:rotate(45deg);

margin-left:50px;}

.fish:before{

content:””;

position:absolute;

border-left:10px solid #2c2c2c;

border-top:10px solid transparent;

border-bottom:10px solid transparent;

top:24px;

left:-5px;

transform:rotate(-45deg);}

.fish:after{

position:absolute;

content:””;

width:5px;

height:5px;

background-color:#fff;

border-radius:50%;

top:6px;

right:7px;

box-shadow:5px -20px 1px 1px #2c2c2c,-1px -35px 2px 2px #2c2c2c;}

九、绘制一副墨镜

CSS

.glass{

font-size:27px;

width:0.4em;

height:0.1em;

position:relative;

border-top:0.05em solid #2c2c2c;

border-radius:50% 50% 0 0/100% 100% 0 0;

box-shadow:-0.2em -0.3em 0 -0.07em #2c2c2c,0 -0.3em 0 -0.07em
#2c2c2c,0.2em -0.3em 0 -0.07em #2c2c2c;

margin:0 0 50px 50px;

}

.glass:before{

position:absolute;

content:””;

width:1em;

height:1.1em;

background-color:#2c2c2c;

border-top-left-radius:100% 75%;

border-top-right-radius:142% 100%;

border-bottom-right-radius:91% 197%;

border-bottom-left-radius:200% 200%;

top:-0.4em;

left:0.37em;

box-shadow:0.55em 0 0 -0.47em #2c2c2c;}

.glass:after{

position:absolute;

content:””;

width:1em;

height:1.1em;

background-color:#2c2c2c;

border-top-right-radius:100% 75%;

border-top-left-radius:142% 100%;

border-bottom-left-radius:91% 197%;

border-bottom-right-radius:200% 200%;

top:-0.4em;

left:-1em;

box-shadow:-0.55em 0 0 -0.47em #2c2c2c;}

点击查看具体案例

其实,这些绘制出来的图形主要利用了:before和:after伪元素,relative和absolute定位,以及box-shadow和border-radius以及transform变形等功能。

实际案例

CSS3 边框

CSS3 边框圆角

效果如下:

爱心

效果如下:

它其实是下面这两个盒子叠起来的:

改变 .heart::after 的 left值,即可叠起来。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!