zoukankan      html  css  js  c++  java
  • 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 {
                0;
                height:0;
                border-top-color: red;
                border-left-color: transparent;
                border-right-color: transparent;
                border-top- 78.86px;
                border-left- 108.54px;
                border-right- 108.54px;
                border-style:solid;
            }
    

      

    采用伪元素的方式在父元素的位置绘制等大小的三角形,需要在父元素设置相对定位。

         .pentagram {
              position:relative;
    }
    

    采用伪元素的方式实现代码:

          .pentagram::before {
                border-0; 
                content: '';
                display: block;
                 0;
                height: 0;
                border-top-color: red;
                border-left-color: transparent;
                border-right-color: transparent;
                border-top- 78.86px;
                border-left- 108.54px;
                border-right- 108.54px;
                border-style: solid;   
                position:absolute;
                top:-78.86px;
                left:-108.54px;
            }
            .pentagram::after{
                border-0; 
                content: '';
                display: block;
                 0;
                height: 0;
                border-top-color: red;
                border-left-color: transparent;
                border-right-color: transparent;
                border-top- 78.86px;
                border-left- 108.54px;
                border-right- 108.54px;
                border-style: solid;        
                position:absolute;
                top:-78.86px;
                left:-108.54px;
            }
    

      

    确定旋转中心点位置数据:108.54px  35.26px元素旋转是以元素的border-box盒模型来确定相关数值的,左上角为0 0。

    所以最终完整的代码如下:

         * {
                border: none;
                border-0; 
                margin:0;
            }
    
            .pentagram {
                margin:100px;
                 0;
                height: 0;
                border-top-color: red;
                border-left-color: transparent;
                border-right-color: transparent;
                border-top- 78.86px;
                border-left- 108.54px;
                border-right- 108.54px;
                border-style: solid;
                /* 相对定位是与绘制三角形无关 */
                position: relative;
            }
    
            .pentagram::before {
                border-0; 
                content: '';
                display: block;
                 0;
                height: 0;
                border-top-color: red;
                border-left-color: transparent;
                border-right-color: transparent;
                border-top- 78.86px;
                border-left- 108.54px;
                border-right- 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-0; 
                content: '';
                display: block;
                 0;
                height: 0;
                border-top-color: red;
                border-left-color: transparent;
                border-right-color: transparent;
                border-top- 78.86px;
                border-left- 108.54px;
                border-right- 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-0; 在chorme和UC浏览器中测试会导致伪元素中出现默认的3px宽黑色边框,似乎是一个 bug。

  • 相关阅读:
    万亿级大数据平台的建设实践
    Java开发中的23种设计模式
    FileZilla更新服务器文件后浏览器没有刷新的一种常见情况
    Docker PHP7官方镜像安装Redies扩展
    Docker PHP7官方镜像安装Redies扩展
    Docker PHP7官方镜像安装Redies扩展
    Docker PHP7官方镜像安装Redies扩展
    iOS9.2.1 App从AppStore上下载闪退问题
    iOS9.2.1 App从AppStore上下载闪退问题
    iOS9.2.1 App从AppStore上下载闪退问题
  • 原文地址:https://www.cnblogs.com/f6056/p/14113520.html
Copyright © 2011-2022 走看看