CSS实现步骤进度条——前端每日一练

news2025/7/7 23:49:49

CSS实现步骤进度条

  • 效果展示
  • HTML布局文件
  • CSS样式
  • JavaScript操作逻辑
    • 补充:JavaScript的this关键字


效果展示

在这里插入图片描述


HTML布局文件

总体布局,一个大div盒子包裹所有内容,里面划分为div + button,六个⭕分别对应着六个子div;⭕下方就是两个button组件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>步骤条实现</title>
    <link rel="stylesheet" href="./style.css" />
</head>
<body>
    <div class="container">
        <div class="progress-container">
            <div id="progress" class="progress"></div>
            <div class="circle active">1</div>
            <div class="circle">2</div>
            <div class="circle">3</div>
            <div class="circle">4</div>
            <div class="circle">5</div>
            <div class="circle">6</div>
        </div>
        <button type="button" class="prev disabled" id="prev">上一步</button>
        <button type="button" class="next active" id="next">下一步</button>
    </div>
    <script src="./index.js"></script>
</body>
</html>

CSS样式

主要涉及内容:伪元素、flex弹性布局、:root自定义全局属性

* {
    margin: 0;
    padding: 0;
    /* border-box:当定义width和height时,
    border和padding的参数值被包含在width和height之内。*/
    box-sizing: border-box;
}

:root {
    /* 在: root选择器中定义自定义属性意味着它们可以作用于全局文档中所有元素。 */
    --color--: #dededf;
    --color_active--: #2396ef;
    --font_color--: #535455;
    --default_color--: #fff;
}

body,
html {
    /* 给一个元素中设置overflow: hidden,
    那么该元素的内容若超出了给定的宽度和高度属性,那么超出的部分将会被隐藏 */
    overflow: hidden;
    display: flex;
    justify-content: center;
    /* 将弹性 <div>元素的所有项目的居中对齐: */
    align-items: center;
    height: 100%;
}

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

.progress-container {
    width: 100%;
    width: 350px;
    display: flex;
    /* 均匀排列每个元素
    首个元素放置于起点,末尾元素放置于终点 */
    justify-content: space-between;
    position: relative;
    margin-bottom: 30px;
}

.progress-container::before {
    content: '';
    width: 100%;
    background-color: var(--color--);
}

.progress-container>.progress,
.progress-container::before {
    height: 5px;
    border-radius: 2px;
    position: absolute;
    left: 0;
    /* top: 50%——向上间隔50%的高度。由于自身的高度,单纯使用此属性并不会居中。 */
    top: 50%;
    /* transform: translateY(-50%)——向上移动自身高度的50%,与上个属性结合便可以实现垂直居中。 */
    transform: translateY(-50%);
    /* z-index 属性设置元素的堆叠顺序。
    拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面。 */
    z-index: -1;
}

.progress-container>.progress {
    background-color: var(--color_active--);
    transition: all .3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.progress-container>.circle {
    display: flex;
    justify-content: center;
    align-items: center;
    border: 4px solid var(--color--);
    width: 40px;
    height: 40px;
    color: var(--font_color--);
    border-radius: 50%;
    background-color: var(--default_color--);
    transition: all .35s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.progress-container>.circle.active {
    border-color: var(--color_active--);
}

.prev,
.next {
    /* CSS outline: none; */
    /* 表示使outline属性无效,使绘制于元素周围的一条线无效。 */
    outline: none;
    /* 标签元素不设置边框属性或者取消边框属性 */
    /* 设置0浏览器依然会渲染,占用内存,设置none就不会渲染 */
    border: none;
    /* display: inline-block不设置宽度时,内容撑开宽度;
    不会独占一行,支持宽高,代码换行被解析成空格 */
    display: inline-block;
    background-color: var(--color--);
    padding: 8px 16px;
    border-radius: 5px;
    color: var(--font_color--);
    transition: all .3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
    cursor: pointer;
}

/* a.active 是对class=active的a标签生效 */
/* a:active 是对按下的a标签生效 */
.prev:active,
.next:active {
    transform: scale(.9);
}

.prev.disabled,
.next.disabled {
    cursor: not-allowed;
    background-color: var(--color--);
    color: var(--font_color--);
}

.prev.active,
.next.active {
    background-color: var(--color_active--);
    color: var(--default_color--);
}

.next {
    margin-left: 15px;
}

relative:生成相对定位的元素,相对于其正常位置进行定位
absolute:生成绝对定位的元素,相对于static定位以外的第一个父元素进行定位

top: 50%;向上间隔50%的高度,由于存在自身的高度,到哪都使用该属性并不会显示居中。
transform: translateY(-50%);向上移动相对自身高度的50%,和上一个属性结合可以实现垂直居中显示。


JavaScript操作逻辑

const $ = v => document.querySelector(v);
const $$ = v => document.querySelectorAll(v);
const prevBtn = $("#prev");
const nextBtn = $("#next");
const progress = $("#progress");
const circleElements = $$(".circle");
const min = 0, max = circleElements.length - 1;
let currentActive = 0;

nextBtn.addEventListener("click", () => {
    if (nextBtn.classList.contains('disabled')) return;
    if (currentActive >= max - 1) {
        // currentActive = min;
        handleClass(nextBtn).addClass("disabled").removeClass("active");
    }
    if (currentActive <= max - 1) {
        currentActive++;
    }
    if (currentActive > 0) {
        handleClass(prevBtn).addClass("active").removeClass("disabled");
    }
    update();
});

prevBtn.addEventListener("click", () => {
    if (prevBtn.classList.contains('disabled')) return;
    if (currentActive <= 1) {
        // currentActive = max -  1;
        handleClass(prevBtn).addClass("disabled").removeClass("active");
    }
    if (currentActive > 0) {
        currentActive--;
    }
    if (currentActive <= max - 1) {
        handleClass(nextBtn).addClass("active").removeClass("disabled");
    }
    update();
});

function handleClass(el) {
    let methods = {
        addClass,
        removeClass
    };
    function addClass(c) {
        el.classList.add(c);
        return methods;
    };
    function removeClass(c) {
        el.classList.remove(c);
        return methods;
    }
    return methods
}

function update() {
    circleElements.forEach((item, index) => {
        if (index <= currentActive) {
            // classLIst属性返回元素的类名,作为DOMTokenList对象
            item.classList.add('active');
        } else {
            item.classList.remove('active');
        }
    });
    // toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
    progress.style.width = (100 / max * currentActive).toFixed(4) + '%';
}

关键点如下:

  • toFixed:该方法可以把Number四舍五入为指定小数数位的数字;
  • 语法:number.toFixed(x)

  • classList对象:HTML5给每一个元素新增加了一个classList对象,该对象保存有控制当前元素类名的各个方法和属性。
  • Element.classList是一个只读属性,返回一个元素的类属性的DOMTokenList集合。
var oBtn = document.getElementById("btn");
var oCon = document.getElementById("con");
oBtn.onclick = function () {
    
    // oCon.className = "red";
    console.log(oCon.className); //red

    oCon.className = "con show red";

    //这个red类已经存在于元素的属性中,那么它将被忽略
    oCon.className += " red";
    console.log(oCon.classList.length); //3

    //在原有的类名基础上添加一个类名
    oCon.classList.add("red");

    // 在原有的类名基础上 移出某一个类名
    oCon.classList.remove("con");

    // 如果有这个类名 则删除这个类名,如果没有 则添加减去
    oCon.classList.toggle("blue");

    // 判断元素是否包含某一个类名
    console.log(oCon.classList.contains("con"));

    // 根据索引 获取类名
    console.log(oCon.classList.item(0)); //con
}
  • forEach方法:用于调用数组的每一个元素,并且把元素传递给回调函数。
  • 注意:forEach()对于空数组是不会执行回调函数的

补充:JavaScript的this关键字

面向对象语言中this指的是当前对象的一个引用

但是在JavaScript中this并不是固定不变的,而是随着执行环境的改变发生变化:

  • 在方法中,this表示这个方法所属的对象。
  • 若单独使用,则this表示全局对象。
  • 在函数中,this表示全局对象。
  • 在函数中,严格模式this是未定义的。
  • 在事件中,this表示接收事件的元素。
  • 类似call和apply方法可以把this引用到任何对象中。

在函数的内部,this的数值取决于函数被调用的方式:

由于下面的代码并不是在严格模式,并且this的数值不是由该调用设置的,因此this的默认数值指向全局对象,浏览器就是window。

function f1(){
  return this;
}
//在浏览器中:
f1() === window;   //在浏览器中,全局对象是 window

//在 Node 中:
f1() === globalThis;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

带你了解S12直播中的“黑科技”

摘要&#xff1a;让精彩更流畅、让较量更清晰、让参与更沉浸、让体验更有趣&#xff0c;幕后的舞台&#xff0c;从来都是技术的战场&#xff0c;S12背后的名场面同样场场高能。本文分享自华为云社区《用硬核方式打开S12名场面》&#xff0c;作者&#xff1a;华为公众号。 让精…

WebDAV之葫芦儿·派盘+账本(简洁记账)

账本(简洁记账) 支持webdav方式连接葫芦儿派盘。 简洁记账-轻便,记账好帮手! 便捷好用的生活记账本,适用于学生记账,学生账本,亲子账本,装修记账,旅游记账,旅行记账,生意记账,人情记账,日常记账,家庭账本,随手记账等。再也不担心钱花哪儿了,简洁的记账流程,清…

从 WinDbg 角度理解 .NET7 的AOT玩法

一&#xff1a;背景 1.讲故事 前几天 B 站上有位朋友让我从高级调试的角度来解读下 .NET7 新出来的 AOT&#xff0c;毕竟这东西是新的&#xff0c;所以这一篇我就简单摸索一下。 二&#xff1a;AOT 的几个问题 1. 如何在 .NET7 中开启 AOT 功能 在 .NET7 中开启 AOT 非常方…

Linux-环境变量

&#x1f680;每日鸡汤&#xff1a; 智者重因&#xff0c;庸者重果&#xff0c;顺道而行。 目录 一、基本概念 ⅠPATH ①把我们的可执行程序拷贝到系统 /usr/bin/中 ②配置环境变量 Ⅱ getenv函数 Ⅱ user环境变量 Ⅲ PWD环境变量 二、shell变量(本地变量)和环境变量 三…

Adobe 2023全家桶已就位,拉高你的生产力,新增功能很奈斯

按照惯例。Adobe是每年一次大版本更新&#xff0c;并且是在每年的10月份中下旬&#xff0c;现在Adobe 2023终于来啦重磅更新&#xff0c;强势来袭&#xff01;​不用怀疑&#xff0c;全家桶简直是设计师福音&#xff0c;每次的大版本更新&#xff0c;为全世界的艺术设计相关人士…

Qt 样式设置

Qt 样式设置样式语法指定控件 Selector Types盒子模型 The Box Model能自定义样式的控件Sub-Controls控件的状态 Pseudo-States属性内置图标多个设置冲突层叠样式 Cascading继承规则 Inheritance子窗口不继承父窗口样式移除控件旧样式添加 .qss 文件Qt 预置颜色QLineEdit 样式设…

创建一个中国人的类

/*** 创建一个中国人的类* 分析&#xff1a;* 1、每个中国人都有一个唯一的身份证号码&#xff0c;所以身份证号码属性需要定义成实例变量* 2、每个人的姓名也都是不一样的&#xff0c;为此姓名属性也需要定义成实例变量* 3、每个中国人的国籍…

python实现目标检测voc格式标签数据增强

文章目录前言一、显示图片&#xff08;可关闭&#xff09;二、创建图像变换的类1.增强数据代码2.图像加噪声3.调整图像亮度4.添加黑色像素块5.旋转图像6.图像裁剪7.平移图像8.图像镜像9.图像随机增强选择三、增强后图片保存与xml解析保存1.从xml文件中提取bounding box信息2.保…

数据结构:循环队列

之前已经做过队列的学习笔记&#xff0c;这一篇写的是循环队列&#xff0c;大部分代码可以继续沿用&#xff0c;某些地方需要作出更改&#xff0c;使其可以实现循环队列的功能。 通俗的总结一下队列的操作&#xff0c;我的思路是将头指针固定不动&#xff0c;然后每一次元素入…

模拟实现string

第一部分&#xff1a;构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;赋值重载&#xff0c;打印函数这几个大头写出来先 string类框架 namespace xxx { class string { public: // //private: char* _str; size_t _size; size_t _capacity;const static size_t npos -…

计算机视觉——python在一张图中画多条ROC线

在验证分类算法的好坏时&#xff0c;经常需要用到AUC曲线&#xff0c;而在做不同分类模型的对比实验时&#xff0c;需要将不同模型的AUC曲线绘制到一张图里。 计算机视觉——python在一张图中绘制多个模型的对比ROC线1. 小型分类模型对比&#xff0c;可以直接调用的2. 大型的CN…

七夕,程序员教你5个表白代码,2分钟学会,牢牢主抓她的心

七夕。一个有人欢喜有人愁的节日&#xff0c;虽然对一些单身人士不太友好&#xff0c;但还有不少人都在等这个节日进行表白。毕竟这个日子的成功率会高一些。 情人节少不了送花送礼物&#xff0c;作为一个程序员&#xff0c;当然不会在送什么礼物上给你指点一二&#xff0c;但…

适合骑车时候戴的耳机怎么选,列举五款在骑行佩戴的耳机推荐

相信大多数人在运动的过程中都会感觉到枯燥无力的感觉&#xff0c;为此也一直在寻找一些能够让我们在运动中保持最初的热诚&#xff0c;在最终的选择上&#xff0c;绝大多数都是选择了耳机&#xff0c;因为耳机能够产生美妙的音乐&#xff0c;将我们运动的枯燥做进一步的抵消&a…

【附源码】Python计算机毕业设计网络教育平台设计

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【HMS Core】定位服务无法获取街道信息问题

问题描述&#xff1a; 华为HMS-定位服务无法获取省市街道信息 背景&#xff1a;在手机上集成华为定位服务的功能运行后&#xff0c;只能获取到经纬度&#xff0c;无法得到具体地址(城市/街道/建筑)。 配置环境&#xff1a;&#xff08;1&#xff09;手机型号&#xff1a;Red…

c语言实现通讯录(用三种方法来实现一个属于你的通讯录)

前沿&#xff1a; &#xff5e;&#xff5e;在一个周前&#xff0c;我用c语言实现了一个银行账号的功能&#xff0c;在总结当中我说了要实现一个通讯录&#xff0c;来实现人员的增删插改功能&#xff0c;而现在就是我实现它的时候&#xff01;&#xff01;&#xff0c;本文呢小…

基于python命令流及代码的Plaxis自动化建模

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;您是否发现GUI界面中重复性的点击输入工作太繁琐&#xff1f;从而拖慢了设计或方案必选进程&#xff1f; 本…

SpringBoot八种bean的加载方式一学就会

目录 文章目录[toc]第一种bean的加载方式-配置文件第二种加载bean方式-注解和扫描创建第三方的bean对象第三种加载bean方式-不使用配置文件扩展-bean的加载方式扩展FactoryBean<>扩展-ImportResource导入配置文件扩展-proxyBeanMethods属性-产生代理对象第四种加载bean方…

一文读懂,python实现常用的数据编码和对称加密

相信很多使用 python 的小伙伴在工作中都遇到过&#xff0c;对数据进行相关编码或加密的需求&#xff0c;今天这篇文章主要给大家介绍对于一些常用的数据编码和数据加密的方式&#xff0c;如何使用 python 去实现。话不多说&#xff0c;接下来直接进入主题&#xff1a; 1、bas…

Windows OpenGL ES 图像灰度图

目录 一.OpenGL ES 图像灰度图 1.原始图片2.效果演示 二.OpenGL ES 图像灰度图源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 Open…