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

news2025/2/22 21:00:01

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

分析:

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

在这里插入图片描述

疑问:

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299220.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

18.Python实战:实现年会抽奖系统

目录结构 python/ ├── sql/ │ └── table.sql # 创建数据库及数据表 ├── config/ │ └── __init__.py # 数据库和Flask配置 ├── static/ │ ├── style.css # 样式文件 │ └── script.js # JavaScript脚本…

145,【5】 buuctf web [GWCTF 2019]mypassword

进入靶场 修改了url后才到了注册页面 注测后再登录 查看源码 都点进去看看 有个反馈页面 再查看源码 又有收获 // 检查$feedback是否为数组 if (is_array($feedback)) {// 如果是数组&#xff0c;弹出提示框提示反馈不合法echo "<script>alert(反馈不合法);<…

19.4.9 数据库方式操作Excel

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本节所说的操作Excel操作是讲如何把Excel作为数据库来操作。 通过COM来操作Excel操作&#xff0c;请参看第21.2节 在第19.3.4节【…

CAS单点登录(第7版)7.授权

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 授权 概述 授权和访问管理 可以使用以下策略实施授权策略以保护 CAS 中的应用程序和依赖方。 服务访问策略 服务访问策略允许您定义授权和访问策略&#xff0c;以控制对向 CAS 注册的…

java集合框架之Map系列

前言 首先从最常用的HashMap开始。HashMap是基于哈希表实现的&#xff0c;使用数组和链表&#xff08;或红黑树&#xff09;的结构。在Java 8之后&#xff0c;当链表长度超过阈值时会转换为红黑树&#xff0c;以提高查询效率。哈希冲突通过链地址法解决。需要明确的是&#xff…

C#windows窗体人脸识别

一、创建一个数据库&#xff0c;名为TestFaceDB 里面有一张表就OK了&#xff0c;表名Users,表里面有几个字段我说明一下&#xff1a; id--------------------bigint----------------------编号 name--------------varchar(50)-----------------用户名 phone--------------v…

53倍性能提升!TiDB 全局索引如何优化分区表查询?

作者&#xff1a; Defined2014 原文来源&#xff1a; https://tidb.net/blog/7077577f 什么是 TiDB 全局索引 在 TiDB 中&#xff0c;全局索引是一种定义在分区表上的索引类型&#xff0c;它允许索引分区与表分区之间建立一对多的映射关系&#xff0c;即一个索引分区可以对…

Neo4j集群学习

文章目录 官方指导文档Neo4j因果集群核心服务器只读副本因果一致性 Neo4j集群搭建Neo4j企业版下载集群简介虚拟机准备jdk安装实施搭建访问neo4j Web服务 集群添加Core节点 官方指导文档 Neo4j 5 ClusterNeo4j 5 Basic Cluster Neo4j因果集群 集群是Neo4企业版中所提供的功能…

try learning-git-branching

文章目录 mergerebase分离 HEAD相对引用利用父节点branch -f 撤销变更cherry-pick交互式 rebase只取一个提交记录提交的技巧rebase 在上一次提交上amendcherry-pick 在上一次提交上 amend tag多分支 rebase两个parent节点纠缠不清的分支偏离的提交历史锁定的Main learning git …

代码随想录算法【Day46】

Day46 647. 回文子串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;for (int i s.size() - 1; i > 0; i--) { // 注意遍历顺序for (int j i; j < s…

flutter本地推送 flutter_local_notifications的使用记录

flutter_local_notifications 效果 安卓配置(AndroidManifest.xml) <uses-permission android:name"com.android.alarm.permission.SET_ALARM"/> <uses-permission android:name"android.permission.SCHEDULE_EXACT_ALARM" /> <us…

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …

一个让Stable Diffusion更稳定、更易用的Github开源项目

2023除了ChatGPT大火&#xff0c;Stable Diffusion同样也是非常火热&#xff0c;Stable Diffusion是一个Github开源项目&#xff0c;很多爱好者都会本地安装&#xff0c;但面对一些初学者来说&#xff0c;在安装、配置和使用过程中还是会经常出现很多问题&#xff0c;特别不了解…

Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】

文章目录 DockerJenkins部署SpringBoot项目一.准备工作1.1安装jdk111.2安装Maven 二.Docker安装Jenkins2.1安装Docker2.2 安装Jenkins2.3进入jenkins 三.Jenkins设置3.1安装jenkins插件3.2全局工具配置全局配置jdk全局配置maven全局配置git 3.3 系统配置安装 Publish Over SSH …

.NET SixLabors.ImageSharp v1.0 图像实用程序控制台示例

使用 C# 控制台应用程序示例在 Windows、Linux 和 MacOS 机器上处理图像&#xff0c;包括创建散点图和直方图&#xff0c;以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 1.0.4&#xff09;添加到.NET Core 3.1/ …

soular基础教程-使用指南

soular是TikLab DevOps工具链的统一帐号中心&#xff0c;今天来介绍如何使用 soular 配置你的组织、工作台&#xff0c;快速入门上手。 &#xfeff; 1. 账号管理 可以对账号信息进行多方面管理&#xff0c;包括分配不同的部门、用户组等&#xff0c;从而确保账号权限和职责…

《Spring实战》(第6版)第1章 Spring起步

第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean)&#xff0c;与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…

PAT乙级真题 — 1084 外观数列(java)

外观数列是指具有以下特点的整数序列&#xff1a; d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始&#xff0c;序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d&#xff0c;所以就是 d1&#xff1b;第 2 项是 1 个 d&#xff08;对…

I.MX6ull 看门狗

一、看门狗介绍 WatchDog是为了能够防止程序跑飞而使用的一种硬件模块。如果你的程序没有跑飞&#xff0c;那么你的程序会 定时的去喂看门狗&#xff1b;如果你的程序跑飞了,那么就不会再去喂狗了&#xff0c;如果超过了喂狗的时间&#xff0c;那么狗就会 自己生成一个信号来重…

鲸鱼算法优化Transformer+KAN网络并应用于时序预测任务

&#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; 本次博客内容将聚焦于深度学习的相关知识与实践 &#x1f389;作者简介&#xff1a;⭐️⭐️⭐️主要研究方向涵盖深度学习、计算机视觉等方向。 &#x1f4dd;目前更新&#x…