CSS绘制正五角星原理(数学模型)
尽管网上有很多CSS绘制五角星的代码案例,但是对于初学者来说可以拿来移植使用,但是在不明白其原理的情况下,进行修改移植就比较困难了。譬如想要将五角星尺寸进行缩小或者放大等设计,就需要对原代码相关数据进行修改。如果不清楚代码实现时的原理,就无法对代码的各项数据进行正确的改动维护。和CSS绘制三角形的原理一样,CSS绘制五角星同样也是从数学模型上着手才能明白各项参数的作用,以及各项参数之间的关联关系。

基于三个特殊角度的全等三角形旋转构建正五角星

根据正五角星的数学特性,正五角星可以由特殊角度的三角形绕五角星外接圆圆心经过旋转72°与-72°而实现。满足正五角星的特征的特殊三角形△aEB的角度为36°、36°、108°。该三角形在三个位置的图案即组成满足要求的正五角星。
数学模型:过五角星ABCDE外接圆圆心O做BE的垂线,垂足为L。假设BE长度为t,五角星外接圆半径为R。用R表示t与线段OL的长度。
根据正五角星的数学特性,∠EOL=72°,∠0EL=18°,L为BE的中点,那么简单的三角函数关系:
OL/(t/2)=tan18°
即:
OL=R·sin18°
t=2R·cos18°
OL的值为三角形旋转基点的垂直数值。
tan18°=(√5-1)/√(10+2√5)≈0.32491969623291
cos18°=√(10+2√5)/4≈0.95105651629515
正五角星外接圆R=60px与正五角星边长则为:114.126px,根据几何关系△aEB的边长为217.08px、134.16px、134.16px。
根据CSS绘制三角形原理,可以获得绘制三角形的重要数据:78.86、108.54、108.54。参见CSS绘制三角形原理查看获取三个参数的计算过程。
HTML代码:
<div class='pentagram'>
</div>
CSS代码:
.pentagram {
width:0;
height:0;
border-top-color: red;
border-left-color: transparent;
border-right-color: transparent;
border-top-width: 78.86px;
border-left-width: 108.54px;
border-right-width: 108.54px;
border-style:solid;
}
采用伪元素的方式在父元素的位置绘制等大小的三角形,需要在父元素设置相对定位。
.pentagram {
position:relative;
}
采用伪元素的方式实现代码:
.pentagram::before {
border-width:0;
content: '';
display: block;
width: 0;
height: 0;
border-top-color: red;
border-left-color: transparent;
border-right-color: transparent;
border-top-width: 78.86px;
border-left-width: 108.54px;
border-right-width: 108.54px;
border-style: solid;
position:absolute;
top:-78.86px;
left:-108.54px;
}
.pentagram::after{
border-width:0;
content: '';
display: block;
width: 0;
height: 0;
border-top-color: red;
border-left-color: transparent;
border-right-color: transparent;
border-top-width: 78.86px;
border-left-width: 108.54px;
border-right-width: 108.54px;
border-style: solid;
position:absolute;
top:-78.86px;
left:-108.54px;
}
确定旋转中心点位置数据:108.54px 35.26px元素旋转是以元素的border-box盒模型来确定相关数值的,左上角为0 0。
所以最终完整的代码如下:
* {
border: none;
border-width:0;
margin:0;
}
.pentagram {
margin:100px;
width: 0;
height: 0;
border-top-color: red;
border-left-color: transparent;
border-right-color: transparent;
border-top-width: 78.86px;
border-left-width: 108.54px;
border-right-width: 108.54px;
border-style: solid;
/* 相对定位是与绘制三角形无关 */
position: relative;
}
.pentagram::before {
border-width:0;
content: '';
display: block;
width: 0;
height: 0;
border-top-color: red;
border-left-color: transparent;
border-right-color: transparent;
border-top-width: 78.86px;
border-left-width: 108.54px;
border-right-width: 108.54px;
border-style: solid;
position:absolute;
top:-78.86px;
left:-108.54px;
transform:rotate(72deg);
transform-origin:108.54px 35.26px;
}
.pentagram::after{
border-width:0;
content: '';
display: block;
width: 0;
height: 0;
border-top-color: red;
border-left-color: transparent;
border-right-color: transparent;
border-top-width: 78.86px;
border-left-width: 108.54px;
border-right-width: 108.54px;
border-style: solid;
position:absolute;
top:-78.86px;
left:-108.54px;
transform:rotate(-72deg);
transform-origin:108.54px 35.26px;
}
注意:虽然在CSS通配符中设置了border-width值为0,但是伪元素中若不设置border-width:0; 在chorme和UC浏览器中测试会导致伪元素中出现默认的3px宽黑色边框,似乎是一个 bug。
CSS绘制正五角星原理(数学模型)的更多相关文章
- CSS绘制三角形的原理剖析
今天学习Bootstrap时候,看到按钮的向下三角形源码: .caret { display: inline-block; ; ; margin-left: 2px; vertical-align: ...
- css绘制三角形原理
1.新建一个元素,将它的宽高都设置为0:然后通过设置border属性来实现三角形效果,下面是css绘制三角形的原理: <!DOCTYPE html> <html> <he ...
- 通过CSS绘制五星红旗
任务要求: 1.创建一个div作为红旗旗面,用CSS控制其比例宽高比为3:2,背景为红色. 2.再创建五个小的div,用CSS控制其大小和位置. 3.用CSS同时控制每个小div的大小.边框和位置,同 ...
- 摘记 史上最强大的40多个纯CSS绘制的图形(一)
今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和网站小图标,真的非常强大,分享给大家. Square(正方 ...
- 史上最强大的40多个纯CSS绘制的图形
Square(正方形) #square { width: 100px; height: 100px; background: red; } Rectangle(矩形) #rectangle { wid ...
- 40多个纯CSS绘制的图形
本文由码农网 – 陈少华原创,转载请看清文末的转载要求. 今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和 ...
- CSS 魔法系列:纯 CSS 绘制图形(心形、六边形等)
<CSS 魔法系列>继续给大家带来 CSS 在网页中以及图形绘制中的使用.这篇文章给大家带来的是纯 CSS 绘制五角星.六角形.五边形.六边形.心形等等. 我们的网页因为 CSS 而呈现千 ...
- css绘制六边形
CSS id选择器实现 正六边形 用css绘制六边形需要使用到三个容器,分别用于绘制六边形的三个部分,如下图所示: HTML代码: <div id="box1">< ...
- CSS绘制简单图形
究竟该用字体图标.图片图标.还是CSS画一个图标?我也不知道.各有千秋吧.本文将介绍如何用css绘制简单的图形,所有测试在chrome58.0完成,如果你不能得到正确结果请到caniuse查一查看看是 ...
随机推荐
- tp6.0.x 反序列化漏洞
tp6 反序列化漏洞复现 环境 tp6.0 apache php7.3 漏洞分析 反序列化漏洞需要存在 unserialize() 作为触发条件,修改入口文件 app/controller/Index ...
- ESP8266 鼓捣记 - 入门(环境搭建)
一.前言 以前没怎么接触过硬件开发,ESP8266 这个名字还是从朋友处得知,用它做了许多好玩的东西,便想着自己也来玩一玩.定了一个小目标,做一个温度计.本文介绍从0到 "Hello Wor ...
- 删除ceph集群mds
ceph集群新搭建以后是只有一个默认的存储池rbd的池 ## 创建文件接口集群 1.创建一个元数据池 [root@mytest ~]# ceph osd pool create metadata 20 ...
- 11.java设计模式之享元模式
基本需求: 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同 每个客户要求发布的方式不一样,A要求以新闻的方式发布,B要求以博客的方 ...
- Python_自动化测试_项目
<论坛自动化测试项目> 1.自行选择合适的社区 2.功能要求 5个以上,不包含登录页 3.多手动测试 多用selenium IDE 4.生成测试报告,发送邮件 5.计划任务定时完成 6 ...
- Oracle表和表空间查询
用户查询 查询和用户相关的数据 创建用户 CREATE USER user IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] [TEMPOR ...
- spring boot和spring cloud版本选择
SpringBoot版本介绍 官网链接:https://spring.io/projects/spring-boot#learn Spring Boot的版本以数字表示.例如:Spring Boot ...
- 详细!Mybatis-plus常用API全套教程,我就不信你看完还不懂!
前言 官网:Mybatis-plus官方文档 简化 MyBatis ! 创建数据库 数据库名为mybatis_plus 创建表 创建user表 DROP TABLE IF EXISTS user; C ...
- Java中的位掩码BitMask
目录 JDK源码的使用 日常工作中的使用 JDK源码的使用 最近在JDK源码中闲逛,无意中看到了java.lang.reflect.Modifier这个类,这个类很简单,都是些常量定义和判断方法,于是 ...
- php进阶学习-单例设计模式
什么是单例模式(singleton)? 在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点. 单例模式的特点 一个类只有一个实例 私有克隆 ...