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

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

分析:

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

在这里插入图片描述

疑问:

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°

完整实现代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .app {
            position: relative;
            width: 100px;
            height: 173.2px;
            margin: 0 auto;
        }
        .item {
            position: absolute;
            top: 0;
            left: 0;
            width: 100px;
            height: 173.2px;
            border-top: 1px solid black;
            border-bottom: 1px solid black;
        }
        .item_1 {
            transform: rotate(60deg);
        }
        .item_3 {
            transform: rotate(-60deg);
        }
    </style>
</head>
<body>
    <div class="app">
        <div class="item_1 item"></div>
        <div class="item_2 item"></div>
        <div class="item_3 item"></div>
    </div>
</body>
</html>

方案二:基于伪元素 + border生成三角形原理

前言:由下图观察可知,正六边形可以通过2个三角形 + 1个长方形拼装出来。故左右两个三角则使用伪元素生成。
在这里插入图片描述

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

border生成三角形原理

当我们将盒子的宽高设置为0之后,再设置border,我们会发现他会生成一个矩形,并且是由四个三角形组合而成。
代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 0;
            height: 0;
            border: 100px solid;
            border-color: aqua rebeccapurple red blue;
        }
    </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

效果:在这里插入图片描述
从上图观察得知:

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

正六边形的实现:

正六边形中三角形的生成原理(以生成左侧的三角形为例)
  1. 我们将上、下、左边的border填充颜色设置为透明,右边的三角形设置为红色,这样我们就可以得到一个三角形了。
  2. 通过border生成的三角形的高,是通过border的厚度决定的,由方案一可知,三角形的高是50,所以我们设置右侧的border厚度为50。
  3. 由于【右边三角形的底边长,是由上下两个三角形的厚度相加决定的】,我们在方案一中可以知道,底边长是173.2,所以上下两个三角形的border设置为173.2 / 2 =86.6。
  4. 生成三角形之后,通过定位向左移动100,这样就生成了。

正六边形实现代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .div {
            position: relative;
            width: 100px;
            height: 173.2px;
            margin: 0 auto;
            background-color: red;
        }
        .div::before {
            position: absolute;
            display: block;
            content: '';
            width: 0;
            height: 0;
            border: 50px solid transparent;
            border-right-color: red;
            border-top-width: 86.6px;
            border-bottom-width: 86.6px;
            right: 100px;
        }
        .div::after {
            position: absolute;
            display: block;
            content: '';
            width: 0;
            height: 0;
            border: 50px solid transparent;
            border-left-color: red;
            border-top-width: 86.6px;
            border-bottom-width: 86.6px;
            right: -100px;
        }

    </style>
</head>
<body>
    <div class="div"></div>
</body>
</html>

方案四:使用clip-path生成

实现比较简洁,但对于一些低版本的浏览器会有兼容性问题,慎用。
polygon是生成多边形的方法,通过提供坐标来生成。
如:polygon(x1 y1, x2 y2, x3 y3)这样子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .div {
            width: 100px;
            height: 100px;
            clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="div">

    </div>
</body>
</html>
使用CSS创建六边形有多种方法,以下为你介绍几种常见的方式: ### 利用三个div组合 采取制作六边形的方式是将3个div组合在一起,上下为120度的等腰三角形,中间为长方形,其中`border-top`/`border-bottom`决定三角形的高。示例代码如下: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> .top-triangle { width: 0; height: 0; border-bottom: 50px solid red; border-left: 86px solid transparent; border-right: 86px solid transparent; } .center { width: 172px; height: 100px; background: red; } .bottom-triangle { width: 0; height: 0; border-top: 50px solid red; border-left: 86px solid transparent; border-right: 86px solid transparent; } </style> </head> <body> <div class="top-triangle"></div> <div class="center"></div> <div class="bottom-triangle"></div> </body> </html> ``` 这种方法的原理是利用CSS的边框属性创建三角形,然后与长方形组合成六边形[^5]。 ### 利用伪元素和clip - path 为矩形添加前后伪元素,宽度为自定义变量`--w`,高度为宽度的40%,用`clip-path`实现六边形。示例代码如下: ```css .bar::before, .bar::after { content: ""; position: absolute; width: var(--w); height: calc(var(--w) / 2.5); clip-path: var(--path); left: 0; } ``` 设置前伪元素的背景色,`top`为0,层级为2,置于最上方。这里通过`clip-path`属性裁剪元素形状为六边形,伪元素可以辅助构建完整的六边形形状[^4]。 ### 利用旋转和位移 先设置每个六边形的宽度、高度以及背景颜色,使用`float: left;`让六边形左右排列,再通过CSS变换属性将六边形进行适当的旋转和位移。示例代码如下: ```css .hexagon { /* 设置宽度、高度和背景颜色 */ width: 100px; height: 100px; background-color: blue; float: left; } .hexagon:nth-child(odd) { transform: rotate(30deg); margin-top: -75px; } .hexagon:nth-child(even) { transform: rotate(-30deg); margin-top: 25px; } ``` 这种方法是先创建基本的元素,再通过旋转和位移来调整元素的位置和角度,形成六边形布局[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值