css-50 Projects in 50 Days(2)

html

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>步骤条</title>
    <link rel="stylesheet" href="./index.css">
</head>

<body>
    <div class="container">
        <div class="steps_wrapper ">
            <div class="step step_active">1</div>
            <div class="step">2</div>
            <div class="step">3</div>
            <div class="step">4</div>
            <div class="line transition400" id="line"></div>
        </div>
        <div class="btn_wrapper transition400">
            <button class="btn " disabled id="pre">上一步</button>
            <button class="btn " id="next">下一步</button>

        </div>
    </div>
    <script src="./index.js"></script>
</body>

</html>

css

css 复制代码
$primary: #24acf2;

@mixin center {
    display: flex;
    align-items: center;
    justify-content: center;
}

.transition400 {
    transition: all 400ms ease;
}

.transition500 {
    transition: all 500ms ease;
}


.container {
    @include center();
    flex-direction: column;
    height: 100vh;

    .steps_wrapper {
        display: flex;
        gap: 50px;
        position: relative;

        &::after,
        .line {
            content: '';
            position: absolute;
            left: 0;
            top: 50%;
            transform: translateY(-50%);
            width: 100%;
            height: 3px;
            background-color: #eee;
            z-index: -2;
        }

        .line {
            width: 0;
            background-color: $primary;
            z-index: -1;
        }


        .step {
            border-radius: 50%;
            border: 2px solid #e0e0e0;
            box-sizing: border-box;
            @include center();
            width: 30px;
            height: 30px;
            font-size: 14px;
            color: #999;
            background-color: #fff;
        }

        .step_active {
            background-color: $primary;
            color: #fff;
            border-color: $primary;
            transition: 0.4s 0.2s all ease;
        }
    }

    .btn_wrapper {
        display: flex;
        gap: 20px;
        margin-top: 36px;

        .btn {
            width: 90px;
            height: 32px;
            background-color: $primary;
            border: 1px solid $primary;
            border-radius: 8px;
            color: #fff;
            cursor: pointer;
        }

        .btn:active {
            transform: scale(0.98);
            opacity: 0.9;
        }

        .btn:disabled {
            cursor: not-allowed;
            background-color: #eee;
            border-color: #eee;
        }
    }
}

js

javascript 复制代码
const state = {
    pre: document.getElementById('pre'),
    next: document.getElementById('next'),
    line: document.getElementById('line'),
    steps: document.querySelectorAll(`.step`),
    len: 4,
    cur: 0,
    process: {
        pre: () => {
            if (state.cur > 0) {
                state.cur--;
            }
        },
        next: () => {
            if (state.cur < state.len) {
                state.cur++;
            }
        }
    }
}


state.pre.onclick = () => update('pre')
state.next.onclick = () => update('next')
function update(type) {
    // 增减操作
    state.process[type]()
    // 禁用上一步,下一步
    state.pre.disabled = false;
    state.next.disabled = false;
    if (state.cur == 0) {
        state.pre.disabled = true
    }
    if (state.cur + 1 == state.len) {
        state.next.disabled = true
    }
    // 设置样式
    setStyle()
}
function setStyle() {
    const step_actives = document.querySelectorAll('.step_active');
    step_actives.forEach(item => item.classList.remove('step_active'));
    state.line.style.width = `${(state.cur) * 33}%`;
    state.steps.forEach((item, i) => {
        if (i <= state.cur) {
            item.classList.add('step_active');
        }
    })
}
相关推荐
pixle03 分钟前
前端 EventSource(SSE)实时通信使用指南(EventSource-polyfill)
前端·web·sse·eventsource·polyfill
yma166 分钟前
react_flow自定义节点、边——使用darg布局树状结构
前端·react.js·前端框架·reac_flow
bug丸7 分钟前
js数字计算
前端·javascript
Kapaseker10 分钟前
用Compose做一个视频下载软件—开篇
前端·kotlin
LuckySusu11 分钟前
【CSS篇】display: block、inline 与 inline-block 的区别详解
前端·css
沐森13 分钟前
聊聊虚拟dom和fiber
前端·面试·架构
屁__啦13 分钟前
安卓ios开发问题-安全边距
前端
Re27515 分钟前
谁懂啊!家人们,AI 帮我做出了“我的大学模拟器”网页小游戏
前端·javascript
Sun_light17 分钟前
链表 --- 高效离散存储的线性数据结构
前端·javascript·算法
北京_宏哥17 分钟前
🔥Python零基础从入门到精通详细教程5-数据类型的转换- 中篇
前端·python·面试