基于css实现正六边形的三种方案

打印 上一主题 下一主题

主题 945|帖子 945|积分 2835

方案一:通过旋转三个长方形天生正六边形

分析:

  1. 如下图所示,我们可以通过旋转三个长方形来得到一个正六边形。
复制代码

疑问:

1. 长方形的宽高分别是多少?


设正六边形的边长是100,基于一些数学常识,可以得出上图得一些数据。
我们现在开始求ac的长度:由于:sin30° = 1/2,则ac/ad = 1/2。因ad=100,所以ac=50;
再根据勾股定理求cd长度:ad²-ac² = 100² - 50² = cd²。故cd约等于86.60
**所以长方形的宽是100,高则是86.6 * 2 =173.2 **
2.必要将长方形旋转多少度?


由于css的transform的rotate是以中央点举行旋转的,所以我们要求的是∠abc,就知道必要将长方形旋转多少度了
1.由于ab是垂直ad的,所以∠bad是90°。
2.由于正六边形的内角是120%,bd是中分∠adc,所以∠adb是60°。
3.由于▲abd是直角三角形,所以∠abd = 180° - ∠bad - ∠adc = 30°。
4.由于▲abd和▲bcd完全相称,所以∠abc = 2 * ∠abd = 60°。
所以我们必要将长方形旋转60°
完备实当代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7.     <style>
  8.         .app {
  9.             position: relative;
  10.             width: 100px;
  11.             height: 173.2px;
  12.             margin: 0 auto;
  13.         }
  14.         .item {
  15.             position: absolute;
  16.             top: 0;
  17.             left: 0;
  18.             width: 100px;
  19.             height: 173.2px;
  20.             border-top: 1px solid black;
  21.             border-bottom: 1px solid black;
  22.         }
  23.         .item_1 {
  24.             transform: rotate(60deg);
  25.         }
  26.         .item_3 {
  27.             transform: rotate(-60deg);
  28.         }
  29.     </style>
  30. </head>
  31. <body>
  32.     <div class="app">
  33.         <div class="item_1 item"></div>
  34.         <div class="item_2 item"></div>
  35.         <div class="item_3 item"></div>
  36.     </div>
  37. </body>
  38. </html>
复制代码
方案二:基于伪元素 + border天生三角形原理

媒介:由下图观察可知,正六边形可以通过2个三角形 + 1个长方形拼装出来。故左右两个三角则利用伪元素天生。

我们还是设正六边形的边长是100,由方案一可知道,三角形的高是50,底边是173.2。
border天生三角形原理

当我们将盒子的宽高设置为0之后,再设置border,我们会发现他会天生一个矩形,而且是由四个三角形组合而成。
代码:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7.     <style>
  8.         .box {
  9.             width: 0;
  10.             height: 0;
  11.             border: 100px solid;
  12.             border-color: aqua rebeccapurple red blue;
  13.         }
  14.     </style>
  15. </head>
  16. <body>
  17.     <div class="box"></div>
  18. </body>
  19. </html>
复制代码
结果:

从上图观察得知:


  • 右边的三角形的高,是由border的厚度决定的
  • 右边三角形的底边长,是由上下两个三角形的厚度相加决定的
正六边形的实现:

正六边形中三角形的天生原理(以天生左侧的三角形为例)


  • 我们将上、下、左边的border填充颜色设置为透明,右边的三角形设置为赤色,这样我们就可以得到一个三角形了。
  • 通过border天生的三角形的高,是通过border的厚度决定的,由方案一可知,三角形的高是50,所以我们设置右侧的border厚度为50。
  • 由于【右边三角形的底边长,是由上下两个三角形的厚度相加决定的】,我们在方案一中可以知道,底边长是173.2,所以上下两个三角形的border设置为173.2 / 2 =86.6。
  • 天生三角形之后,通过定位向左移动100,这样就天生了。
正六边形实当代码:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7.     <style>
  8.         .div {
  9.             position: relative;
  10.             width: 100px;
  11.             height: 173.2px;
  12.             margin: 0 auto;
  13.             background-color: red;
  14.         }
  15.         .div::before {
  16.             position: absolute;
  17.             display: block;
  18.             content: '';
  19.             width: 0;
  20.             height: 0;
  21.             border: 50px solid transparent;
  22.             border-right-color: red;
  23.             border-top-width: 86.6px;
  24.             border-bottom-width: 86.6px;
  25.             right: 100px;
  26.         }
  27.         .div::after {
  28.             position: absolute;
  29.             display: block;
  30.             content: '';
  31.             width: 0;
  32.             height: 0;
  33.             border: 50px solid transparent;
  34.             border-left-color: red;
  35.             border-top-width: 86.6px;
  36.             border-bottom-width: 86.6px;
  37.             right: -100px;
  38.         }
  39.     </style>
  40. </head>
  41. <body>
  42.     <div class="div"></div>
  43. </body>
  44. </html>
复制代码
方案四:利用clip-path天生

实现比较简便,但对于一些低版本的欣赏器会有兼容性问题,慎用。
polygon是天生多边形的方法,通过提供坐标来天生。
如:polygon(x1 y1, x2 y2, x3 y3)这样子
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7.     <style>
  8.         .div {
  9.             width: 100px;
  10.             height: 100px;
  11.             clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
  12.             background-color: red;
  13.         }
  14.     </style>
  15. </head>
  16. <body>
  17.     <div class="div">
  18.     </div>
  19. </body>
  20. </html>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表