侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

使用CSS的border属性绘制各种几何形状的方法

前端  /  管理员 发布于 7年前   281

前言

border 边框属性可以说是我们在网页布局中最常用不过的一个属性之一。 border 它不只是边框,它还有很多非常有用的“黑魔法”哈,让我们一起来学习一下。

border绘制几何形状的原理

我们先来看一个简单的小例子:

在页面上写一个 div

<div class="border-test"><div>

给这个 div 加上以下样式

.border-test {  width: 200px;  height: 200px;  background-color: #000;  border-top: 50px solid red;  border-right: 50px solid yellow;  border-bottom: 50px solid blue;  border-left: 50px solid green;}

在浏览器预览可以看到下面的效果

接下来,我们把这个 div 的宽度跟高度都设为 0 ,看看是什么效果

是不是剩下4个不同颜色不同方向的三角形了,继续往下看,一起来见证下 border 的黑魔法。

border能绘制什么几何形状?

  • 三角形
  • 梯形
  • 平行四边形
  • 五边形
  • 六边形
  • 八边形
  • 五角星
  • 六角星
  • ...

三角形
 

向上的三角形

要得到向上的三角形,是不是只要设置 上边框 的宽度为 0 ,设置 上边框 、 左边框 、 右边框 的边框颜色设为 transparent 透明,保留 下边框 的边框颜色就可以了,看代码:

<div class="triangle triangle-up"></div>
// 公共.triangle {    width: 0;    height: 0;}// 向上的三角形.triangle-up {    border-top: 0 solid transparent; // 这句这可以省略    border-right: 50px solid transparent;    border-bottom: 50px solid blue;    border-left: 50px solid transparent;}

还可以简写成,遵循 上右下左 顺序来设置

.triangle-up {    border-width: 0 50px 50px;  // 边框大小    border-style: solid;  // 边框样式    border-color: transparent transparent blue;  // 边框颜色}

下面代码都会用简写的形式。

向右的三角形

同理,设置 右边框 的宽度为 0 ,设置 上边框 、 右边框 、 下边框 的边框颜色为透明,保留 左边框 的边框颜色就可以了

<div class="triangle triangle-right"></div>
.triangle-right {    border-width: 50px 0 50px 50px;    border-style: solid;    border-color: transparent transparent transparent green;}

向下的三角形

同理,设置 下边框 的宽度为 0 ,设置 左边框 、 右边框 、 下边框 的边框颜色为透明,保留 上边框 的边框颜色就可以了

<div class="triangle triangle-bottom"></div>
.triangle-bottom {    border-width: 50px 50px 0;    border-style: solid;    border-color: red transparent transparent;}

向左的三角形

同理,设置 左边框 的宽度为 0 ,设置 上边框 、 下边框 、 左边框 的边框颜色为透明,保留 右边框 的边框颜色就可以了

<div class="triangle triangle-left"></div>
.triangle-left {    border-width: 50px 50px 50px 0;    border-style: solid;    border-color: transparent yellow transparent transparent;}

接下来再来看下如何实现下面的三角形呢?

其实不难发现,向左上的三角形刚好是向下的三角形的右半部分,所以要得到这个图形,是不是只要把向下的三角形左半部分的边框设为0就可以了,看代码:

<div class="triangle triangle-top-left"></div>
.triangle-top-left {    border-width: 50px 50px 0 0;    border-style: solid;    border-color: red transparent transparent;}

同理,可得到其他三个不同方向三角形,代码如下:

.triangle-top-right {    border-width: 50px 0 0 50px;    border-style: solid;    border-color: red transparent transparent;}.triangle-bottom-left {    border-width: 0 50px 50px 0;    border-style: solid;    border-color: transparent transparent blue;}.triangle-bottom-right {    border-width: 0 0 50px 50px;    border-style: solid;    border-color: transparent transparent blue;}

梯形

借助上面的实现三角形的方法,我们可以很容易的实现梯形,比如下面这个:

向上的梯形:

其实只要把上面 向上的三角形 的代码加上宽度就能实现了

.trapezoid {  width: 60px;  border-bottom: 60px solid red;  border-left: 60px solid transparent;  border-right: 60px solid transparent;}

同理,可以得到 向下的梯形

.trapezoid-bottom {    width: 50px;    border-top: 50px solid red;    border-left: 50px solid transparent;    border-right: 50px solid transparent;}

如果要得到向左和向右的梯形,需要把 width 设为 0 ,然后设置相应的高度值。

.trapezoid-left {    width: 0;    height: 50px;    border-width: 50px 50px 50px 0;    border-style: solid;    border-color: transparent red transparent transparent;}.trapezoid-right {    width: 0;    height: 50px;    border-width: 50px 0 50px 50px;    border-style: solid;    border-color: transparent transparent transparent red;}

平行四边形

只要一个 向上的三角形 跟 向下的三角形 结合起来就能实现,需要配合一个伪元素。

.parallelogram {    position: relative;    width: 0;    height: 0;    border-width: 0 50px 50px;    border-style: solid;    border-color: transparent transparent red;}.parallelogram:after {    position: absolute;    top: 0;    left: 0;    border-width: 50px 50px 0;    border-style: solid;    border-color: red transparent transparent;    content: "";}

五边形

梯形加上一个三角形,很容易就能组合成一个五边形,也需要配合一个伪元素来实现。

.pentagon {    position: relative;    width: 50px;    border-bottom: 50px solid red;    border-left: 50px solid transparent;    border-right: 50px solid transparent;}.pentagon:after {    position: absolute;    top: 50px;    left: -50px;    width: 0;    height: 0;    border-width: 75px 75px 0;    border-style: solid;    border-color: red transparent transparent;    content: "";}

六边形

如果两个相反方向且底边同样大小的梯形,叠加在一起,是不是就能得到一个六边形呢?同样需要配合一个伪元素来实现。

.hexagon {    position: relative;    width: 50px;    border-bottom: 50px solid red;    border-left: 50px solid transparent;    border-right: 50px solid transparent;}.hexagon:after {    position: absolute;    top: 50px;    left: -50px;    width: 50px;    border-top: 50px solid red;    border-left: 50px solid transparent;    border-right: 50px solid transparent;    content: "";}

实战应用

聊天气泡

是不是用到了 向下的三角形 结合一个圆角矩形来实现。

下拉菜单

我们打开淘宝天猫,来看下它顶部的下拉菜单,是不是也用到 向上的三角形 和 向下的三角 形。

我们来看下它的实现代码:

再来看一个,我们打开京东秒杀

是不是就用到了我们上面分析的 平行四边形 来实现的,我们同样来看下它的实现代码:

就是通过一个矩形,然后配合两个伪元素的三角形结合起来实现的。

具体使用场景还有很多,大家可以根据自己平时项目开发中的实际需求来发挥想象。

能用CSS样式搞定的效果就不要使用图片哈,不仅有利于后期的维护,也能减少网页的请求,提高页面的加载速度。

总结

其实通过各种组合,还可以实现很多不同的形状,这里就不一一列举了。比如还可以实现 八边形 、 五角星 、 六角星 、 八角星 、 十二角星 等等, border 就是这么强大。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    浅谈CSS中盒模型的理解
    下一条:
    用CSS画一个带阴影的三角形的示例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客