当前位置: 首页 > article >正文

web实现太极八卦图、旋转动画、定位、角度、坐标、html、css、JavaScript、animation

文章目录

  • 前言
  • 1、html部分
  • 2、css部分
  • 3、JavaScript部分
  • 4、微信小程序演示


前言

哈哈


1、html部分

<div class="great_ultimate_eight_diagrams_box">
        <div class="eight_diagrams_box">
            <div class="eight_diagrams">
                <div class="eight_diagrams_item">
                    <div class="yin_yang">
                        <div class="divinatory_direction_box">
                            <div class="divinatory_name">天乾</div>
                            <div class="direction">正南</div>
                        </div>

                        <div class="yy_box">
                            <div class="yy_t">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_m">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_b">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="eight_diagrams_item">
                    <div class="yin_yang">
                        <div class="divinatory_direction_box">
                            <div class="divinatory_name">风巽</div>
                            <div class="direction">西南</div>
                        </div>

                        <div class="yy_box">
                            <div class="yy_t">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_m">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_b">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="eight_diagrams_item">
                    <div class="yin_yang">
                        <div class="divinatory_direction_box">
                            <div class="divinatory_name">水坎</div>
                            <div class="direction">正西</div>
                        </div>

                        <div class="yy_box">
                            <div class="yy_t">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_m">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_b">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="eight_diagrams_item">
                    <div class="yin_yang">
                        <div class="divinatory_direction_box">
                            <div class="divinatory_name">山艮</div>
                            <div class="direction">西北</div>
                        </div>

                        <div class="yy_box">
                            <div class="yy_t">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_m">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_b">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="eight_diagrams_item">
                    <div class="yin_yang">
                        <div class="divinatory_direction_box">
                            <div class="divinatory_name">地坤</div>
                            <div class="direction">正北</div>
                        </div>
                        <div class="yy_box">
                            <div class="yy_t">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_m">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_b">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="eight_diagrams_item">
                    <div class="yin_yang">
                        <div class="divinatory_direction_box">
                            <div class="divinatory_name">雷震</div>
                            <div class="direction">东北</div>
                        </div>

                        <div class="yy_box">
                            <div class="yy_t">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_m">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_b">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="eight_diagrams_item">
                    <div class="yin_yang">
                        <div class="divinatory_direction_box">
                            <div class="divinatory_name">火离</div>
                            <div class="direction">正东</div>
                        </div>

                        <div class="yy_box">
                            <div class="yy_t">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_m">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_b">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="eight_diagrams_item">
                    <div class="yin_yang">
                        <div class="divinatory_direction_box">
                            <div class="divinatory_name">泽兑</div>
                            <div class="direction">东南</div>
                        </div>
                        <div class="yy_box">
                            <div class="yy_t">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_m">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                            <div class="yy_b">
                                <div style="flex: 3; background-color: #333;"></div>
                                <div style="flex: 1; background-color: #333;"></div>
                                <div style="flex: 3; background-color: #333;"></div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!-- 太极 -->
        <div class="great_ultimate_box">
            <div class="great_ultimate"></div>
        </div>
    </div>

☺☺☺☺☺☺☺

关于html结构未做优化,望谅解!不过微信小程的代码已经优化好,有需要的伙伴可以私聊。对于页面结构就不做过多阐述,多看几下就明白了咋回事了。


2、css部分

.great_ultimate_eight_diagrams_box {
    display: flex;
    justify-content: center;
    align-items: center;
    animation: circularRotation linear infinite 30s;
}

/* 八卦 */
.eight_diagrams_box {
    position: relative;
}

.eight_diagrams {
    width: 410px;
    height: 410px;
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
}

.eight_diagrams_item {
    width: 100px;
    position: absolute;
}

.yin_yang {
    width: 100%;
    height: 100%;
    text-align: center;
}

.divinatory_name {
    /* 文字两端对齐 */
    text-align-last: justify;
    font-size: 20px;
    font-weight: 700;
    padding: 0 20px;
}

.direction {
    margin-top: 2px;
    text-align-last: justify;
    padding: 0 10px;
}

.yy_box {
    margin-top: 10px;
    display: flex;
    flex-direction: column;
    align-items: center;
}

.yy_t,
.yy_m,
.yy_b {
    width: 100%;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0;
    margin: 0;
}

.yy_m {
    margin-top: 8px;
}

.yy_b {
    margin-top: 8px;
}

.yy_t div,
.yy_m div,
.yy_b div {
    width: 100%;
    height: 8px;
}

/* 太极 */
.great_ultimate_box {
    position: absolute;
}

.great_ultimate {
    width: 270px;
    height: 270px;
    border-radius: 50%;
    /* 圆球上半部分为白色,下半部分为黑色 */
    background: linear-gradient(to bottom,
            #ffffff 0%,
            #ffffff 50%,
            #000000 50%,
            #000000 100%);
    position: relative;
    transform: rotate(-90deg);
}

.great_ultimate::before {
    position: absolute;
    content: "";
    width: 45.5px;
    height: 45.5px;
    border-radius: 50%;
    border: 45px solid #000000;
    /* 左侧黑球套白点  */
    background-color: #FFFFFF;
    left: 0;
    top: 50%;
    transform: translateY(-50%);
}

.great_ultimate::after {
    position: absolute;
    content: "";
    width: 45.5px;
    height: 45.5px;
    border-radius: 50%;
    border: 45px solid #FFFFFF;
    /* 右侧白球套黑点 */
    background-color: #000000;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
}

@keyframes circularRotation {
    form {
        transform: rotate(0deg);
    }

    to {
        transform: rotate(360deg);
    }
}

☺☺☺☺☺☺☺

八卦图主要就是使用定位,通过JavaScript计算每一个div的坐标,然后定位到指定位置即可。关于太极图可查看本篇文章了解详情。


3、JavaScript部分

function init() {
    let elItem = document.querySelectorAll('.eight_diagrams_item'),
        yin_yang = document.querySelectorAll('.yin_yang'),
        radius = document.querySelector('.eight_diagrams').clientWidth / 2,
        itemLen = elItem.length,
        pieceDeg = 360 / itemLen;

    for (let i = 0; i < itemLen; i++) {
        let t = i * pieceDeg,
            x = undefined,
            y = undefined;

        yin_yang[i].style.transform = `rotate(${t}deg)`;

        t = (Math.PI / 180) * t;
        x = Math.sin(t) * radius;
        y = -Math.cos(t) * radius;

        elItem[i].style.transform = `translate(${x}px, ${y}px)`;
    }
}

init();

☺☺☺☺☺☺

定义名为init的函数,用来设置旋转元素的坐标。
通过querySelectorAll获取一个元素类数组。
通过querySelectorclientWidth获取外层容器的宽度并除以2得到半径。
通过querySelectorAll获取内层元素的类数组,并使用yin_yang变量保存。
定义itemLen变量保存类数组长度。
通过类数组长度计算元素角度的平均值,并保存到pieceDeg变量中。
使用for循环计算出每个元素的xy坐标,i * pieceDeg得到角度值;(Math.PI / 180) * t得到弧度值,因为编程中的sincos需要通过弧度才能计算出坐标值。

yin_yang[i].style.transform = 'rotate(' + t + 'deg)';
elItem[i].style.transform = 'translate(' + x + 'px', y + 'px)';
第一句代码设置元素的旋转角度;第二句话设置元素的坐标位置。以上两句话可以有更好的方式实现,但是在这里暂时不优化。


4、微信小程序演示

X2_2_1


http://www.kler.cn/a/510.html

相关文章:

  • 如何使用MySQL WorkBench操作MySQL数据库
  • 论文研读:AnimateDiff—通过微调SD,用图片生成动画
  • 编码转换(实例)
  • 赛博错题本
  • Chrome被360导航篡改了怎么改回来?
  • JOGL 从入门到精通:开启 Java 3D 图形编程之旅
  • 学会这12个Python装饰器,让你的代码更上一层楼
  • Android 9.0 Launcher3双层(抽屉)高斯模糊(毛玻璃)背景功能的实现
  • Springboot——自定义Filter使用测试总结
  • 【python绘图】matplotlib+seaborn+pyecharts学习过程中遇到的好看的绘图技巧(超实用!)(持续更新中!)
  • Pandas数据分析实战练习
  • 图像修复与去噪
  • Python 基础教程【2】:条件语句和循环语句
  • 蓝桥杯刷题冲刺 | 倒计时24天
  • 【pygame游戏】Python实现蔡徐坤大战篮球游戏【附源码】
  • 17.电话号码的字母组合(深度递归遍历解决经典老题)
  • Python的30个编程技巧
  • 软测面试了一个00后,绝对能称为是内卷届的天花板
  • 数据结构One——绪论
  • ChatGPT是如何训练得到的?通俗讲解
  • 程序员必会技能—— 使用日志
  • 【IoT】嵌入式驱动开发:IIC子系统
  • Qt浏览器开发:关于QCef以及qcefview开发原理
  • 做技术,最忌讳东张西望
  • ChatGPT解答:python大批量读写ini文件时,性能很低,有什么解决方法吗,给出具体的思路和实例
  • Spring学习——MyBatisPlus入门