使用CSS绘制三角形

今天有个同学询问了我关于使用CSS制作三角形的问题,我也没有怎么想考虑,直接给了源码。然后她询问了一系列的问题,我才意识到,这类代码网上一般都有,缺的是制作的原理,于是就有了编写博客的想法。

      下面我们先来看一下效果:


接下来我们看一下源代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<style>
	div{
		width: 0;
		height: 0;
		border-left: 110px solid red;
		border-right: 110px solid yellow;
		border-top: 110px solid black;
		border-bottom: 110px solid black;
		display: inline-block;
	}
	.triangle{
		border-right: 0;
		border-top: 110px solid transparent;
		border-bottom: 110px solid transparent;
	}
</style>
<body>
	<div></div>
	<div class="triangle"></div>
</body>
</html>

下面我们来分析绘制三角形的原理:

首先我们知道css是采用盒子模型:所谓盒子模型,就是元素的内容(content)外层包裹补丁(padding),边框(border),再加上一层边距(margin)。你可以想象成有一个纸盒子,里面存放的东西就是元素的内容(content),而盒子的纸板就是边框(border),补丁(padding)就是纸板和东西之间的空隙,如果有多个盒子,那么盒子与盒子之间的空隙就是margin。当然,css的盒子模型并不是那么简单,有兴趣的读者可以查询的其他资料。

话归正题,我们来解释三角形的绘制原理:

当一个div的外层包裹了一层border,我们不妨将它的border宽度设置为一个极大的数,如110px(虽然我们平时并不经常这样做),并且把它上下左右边框设置为不同的颜色,另外我们将div的宽高设置成一个较小的数,如50px,见下面代码:

div{
		width: 50px;
		height: 50px;
		border-left: 110px solid red;
		border-right: 110px solid yellow;
		border-top: 110px solid black;
		border-bottom: 110px solid black;
		display: inline-block;
	}

现在我们再来看效果:


同时,我们发现,border-right的绘制范围,图中梯形abcd的部分。其中ab是border最外围的顶点,cd是content以及padding(图中padding为0)组成的矩形的顶点。事实上,border也是这样绘制的。

我们可以想象,随着div的高度不断减小,cd的长度也将不断减少,当div的高度变为0时,这时,cd也成了一个点,这时border-right成了一个三角形,如下图所示:


如果,div此时的width也变为0px,我们可以想象,这个div将会变成一个由4个三角形组成的矩形。这个时候,如果我们把border-top以及border-bottom,border-letf颜色设置为透明,将会看到什么?不错,一个向左朝向的三角形,至此,我们绘制三角形的原理讲完。

下面是利用border的每一边绘制绘制范围的原理,绘制一些其他的图形。


	.arc{
		width: 0px;
		height:0px;
		border-left: 110px solid yellow;
		border-right: 0;
		border-top: 110px solid transparent;
		border-bottom: 110px solid transparent;
		display: inline-block;
		border-radius: 50%
	}
	.trapezoid{
		width: 0px;
		height:50px;
		border-left: 110px solid yellow;
		border-right: 0;
		border-top: 110px solid transparent;
		border-bottom: 110px solid transparent;
		display: inline-block;
	}
	.circle {
    width: 50px;
    height: 50px;
    border-left: 110px solid yellow;
    border-right: 110px solid yellow;
    border-top: 110px solid red;
    border-bottom: 110px solid black;
    display: inline-block;
    border-radius: 50%;
	}
	.ellipse{
		width: 0px;
		height:50px;
		border-left: 110px solid yellow;
		border-right: 110px solid yellow;
		border-top: 110px solid yellow;
		border-bottom: 110px solid yellow;
		display: inline-block;
		border-radius: 50%
	}
	.label{
		width: 0px;
		height:50px;
		border-left: 20px solid #f67a81;
		border-right: 20px solid #f67a81;
		border-top: 20px solid #f67a81;
		border-bottom: 20px solid transparent;
		display: inline-block;
	}
图形:



最后,由于这是本人第一次写博客,经验有限,而且本人网页知识有限,理解不深,如果有错误,请不吝赐教。谢谢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值