纯js实现”罗盘”时钟

纯js实现”罗盘”时钟步骤一:首先需要将多个文字元素呈圆形排放; 步骤二:按一定角度进行旋转。 创建外围框架 实现外围秒 根据不同的元素(月、日、时、分、秒)设置外围盒子的宽高,即设置circle盒子的

Snipaste_2021-06-30_17-06-56.png

纯js实现”罗盘”时钟

步骤一:首先需要将多个文字元素呈圆形排放; 步骤二:按一定角度进行旋转。

创建外围框架

`<div class="home">
    <!--年-->
    <div class="year"></div>
    <!--月-->
    <div class="wrapper">
        <div class="circle month"></div>
    </div>
    <!--日-->
    <div class="wrapper">
        <div class="circle days"></div>
    </div>
    <!--时-->
    <div class="wrapper">
        <div class="circle hours"></div>
    </div>
    <!--分-->
    <div class="wrapper">
        <div class="circle minutes"></div>
    </div>
    <!--秒-->
    <div class="wrapper">
        <div class="circle seconds"></div>
    </div>
.home {
    width: 100%;
    height: 100%;
    min-height: 660px;
    min-width: 800px;
    background-color: #000000;
    position: relative;
    color: #666666;
    padding: 20px 0;
    overflow: hidden;
}

.wrapper, .year {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

.circle {
    position: relative;
    /*// 添加动画效果*/
    transition: transform 0.4s ease-in-out;
}

.circle span {
    position: absolute;
    white-space: nowrap;
    font-size: 14px;
}

/*// 激活时文字颜色为白色*/
.circle span.active {
    color: #f60;
    font-weight: 700;
}

实现外围秒

根据不同的元素(月、日、时、分、秒)设置外围盒子的宽高,即设置circle盒子的大小,通过函数获取节点,并设置宽高

let boxSize = {
        seconds: 580,
        minutes: 440,
        hours: 320,
        days: 180,
        month: 80
},
// 设置父盒子大小
function divStyle(node, key, deg) {
    node.style.width = data.boxSize[key] + 'px';
    node.style.height = data.boxSize[key] + 'px';
    node.style.transform = `rotate(-${deg}deg)`
}

创建子节点span,有多少个元素,则创建多少个span标签,将其append到div盒子中

function createSpanNode(texts, node, nodeSize, childNode) {
    //texts对应当前的元素,node为父节点对象, nodeSize为父盒子大小
    //创建碎片节点
    let fragment = document.createDocumentFragment();
    for (let i = 0; i < texts.length; i++) {
        //创建span节点
        let spanNode = document.createElement('span');
        spanNode.innerText = texts[i];
        //添加公共class
        spanNode.className = childNode;
        //添加样式
        spanStyle(spanNode, nodeSize, texts, i);
        //添加节点
        fragment.appendChild(spanNode);
    }
    //添加节点
    node.appendChild(fragment);
}

设置span盒子对应的旋转角度、样式等

// span盒子样式
function spanStyle(node, size, texts, index) {
    // node:节点,size:盒子大小,texts:盒子渲染数据,index:对应span个数
    const r = size / 2; //半径
    const deg = getPerDeg(texts); //元素平均间隔度数
    const angle = deg * index;//夹角
    const {a, b} = getHypotenuse(r, angle);
    node.style.top = a + r + 'px';
    node.style.left = b + r + 'px';
    node.style.transform = `rotate(${angle}deg)`;
    node.style.transformOrigin = '0 0';
}

抽离的公共方法

// 元素平均间隔度数
function getPerDeg(texts) {
    return 360 / texts.length;
}

// 已知角度和斜边,获取直角边
function getHypotenuse(long, angle) {
    // 获得弧度
    let radian = 2 * Math.PI / 360 * angle;
    return {
        a: Math.sin(radian) * long, // 邻边
        b: Math.cos(radian) * long // 对边
    }
}

间隔一秒调用runClock方法

// 间隔1秒运行
let currentSeconds = 0, secondsDeg = 0;
let secondsTexts = ['零零',......,'五十九秒'];
function runClock() {
    const d = new Date();
    const seconds = d.getSeconds(); // 秒
    currentSeconds = seconds;
    secondsDeg += getPerDeg(secondsTexts);
    divStyle(secondsNode, 'seconds', secondsDeg);
    spanDynamicStyle(secondsNode, currentSeconds);
}
// 获取节点
function getDivNode(classname) {
    return document.getElementsByClassName(classname)[0];
}
// 设置class类(动态)
function spanDynamicStyle(node, currentIndex) {
    if (currentIndex === 0 && node.childNodes[node.childNodes.length - 1].className.includes('active')) {
        node.childNodes[node.childNodes.length - 1].classList.remove('active');
    }
    if (currentIndex > 0 && node.childNodes[currentIndex - 1].className.includes('active')) {
        node.childNodes[currentIndex - 1].classList.remove('active');
    }
    node.childNodes[currentIndex].classList.add('active');
}

月、日、时、分同理实现

实现年显示

// 设置年
(function setYear() {
    let num = {0: '零', 1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '七', 8: '八', 9: '九'}
    document.getElementsByClassName('year')[0].innerText = new Date().getFullYear().toString().split('').map(item => num[item]).join('')
})();

源码地址:Github

今天的文章纯js实现”罗盘”时钟分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14455.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注