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
获取一个元素类数组。
通过querySelector
和clientWidth
获取外层容器的宽度并除以2
得到半径。
通过querySelectorAll
获取内层元素的类数组,并使用yin_yang
变量保存。
定义itemLen
变量保存类数组长度。
通过类数组长度计算元素角度的平均值,并保存到pieceDeg
变量中。
使用for
循环计算出每个元素的x
和y
坐标,i * pieceDeg
得到角度值;(Math.PI / 180) * t
得到弧度值,因为编程中的sin
和cos
需要通过弧度才能计算出坐标值。
yin_yang[i].style.transform = 'rotate(' + t + 'deg)'
;
elItem[i].style.transform = 'translate(' + x + 'px', y + 'px)'
;
第一句代码设置元素的旋转角度;第二句话设置元素的坐标位置。以上两句话可以有更好的方式实现,但是在这里暂时不优化。