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查一查看看是 ...
随机推荐
- C++之父:精通C++很难,但你一天之内就能学习使用C++
精通C++听起来好像就是一个笑话.为什么C++比别的语言难学那么多?其实这基本上是因为C++之父Bjarne Stroustrup 说过的一句话"我特别的讨厌语言的设计者把自己的喜好强加给用 ...
- epoll源码解析翻译------说使用了mmap的都是骗子
本文地址 //https://www.cnblogs.com/l2017/p/10830391.html //https://blog.csdn.net/li_haoren select poll e ...
- ptmalloc tcmalloc jemalloc 总结的总结 及覆盖原理
windows下还有 detours库可以hook
- go语言协程安全map
前言: 在go语言中 map 是很重要的数据结构.Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值.问题来了,这么安逸的 数据结构 ...
- python之路 《四》 字典
python中的字典使得python来解决问题变得更方便,顾名思义,就是当我知道关键字(key)那么我就可以通过key来找到与之对应的信息. 简单的来说字典是另一种可变容器模型,且可存储任意类型对象. ...
- 配置内网访问的TV
前言 通过内网模式访问tv远程机器 方法 云主机配置 一台云主机,云主机申请两个公网IP 云主机启动两个frps进程绑定到两个内网的ip 客户端配置 远程一台linux跳板机运行frpc,启动两个进程 ...
- Ceph对象主本损坏的修复方法
前言 问题的触发是在进行一个目录的查询的时候,osd就会挂掉,开始以为是osd操作超时了,后来发现每次访问这个对象都有问题 log [WRN] : slow request 60.793196 sec ...
- elasticsearch集群安装+安全验证+kibana安装
准备环境 启动4个centos容器, 并暴露相对应端口 (我的本机ip为172.16.1.236,以下涉及到的地方需要修改为自己的ip) node_name ip http port transpor ...
- 巧妙利用Camtasia制作网课
随着互联网的快速发展,网络学习变得非常流行.这种躺在床上就可以获取知识的方法让大家渐渐地都喜欢上了学习,那么我们是否想要了解一下网课的幕后制作呢. 今天我给大家带来的便是巧妙利用Camtasia进行网 ...
- Guitar Pro指弹入门——特殊拍号
在吉他演奏技术不断提高的同时,我们经常会遇到一些奇怪的曲谱.他们的拍号不是正常的4/4拍或者3/4拍,而是5/4或者5/8等等我们不太了解的拍号,致使我们在演奏和练习之中陷入纷乱的节奏. 那么本期文章 ...