使用CSS3实现环形进度条效果

使用CSS3可以很容易地实现环形进度条效果。下面是实现环形进度条的完整攻略:

准备工作

在实现环形进度条之前,我们需要新建一个 HTML 文件,并在文件头部引入 CSS 文件。

<!DOCTYPE html>
<html>
  <head>
    <title>CSS3 环形进度条</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <!-- 页面内容 -->
  </body>
</html>

实现方案

Step 1:创建环形的 DOM 结构

首先,我们需要创建环形的 DOM 结构。这里我们可以使用一个 div 元素,然后通过 CSS3 绘制环形的结构。

<div class="progress-container">
  <div class="progress" data-progress="50"></div>
  <span class="progress-text">50%</span>
</div>

其中,.progress-container 用于包含整个进度条,.progress 用于实现进度条的动画效果,而 .progress-text 用于显示当前进度的文本信息。

Step 2:设置样式

接下来,我们需要设置样式。为了实现环形进度条的效果,需要使用 CSS3 的旋转和动画特性。

.progress-container {
  position: relative;
  width: 150px;
  height: 150px;
  margin: 50px auto;
}

.progress {
  position: absolute;
  top: 0;
  left: 50%;
  width: 100%;
  height: 100%;
  transform-origin: 0% 50%;
  border-radius: 50%;
  clip: rect(0, 75px, 150px, 0);
}

.progress-bar {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  animation: progress 1s linear forwards;
}

.progress-text {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 24px;
  font-weight: bold;
  color: #333;
}

@keyframes progress {
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(360deg);
  }
}

在上面的样式中,我们分别设置了 .progress-container.progress.progress-bar、和 .progress-text 的样式。

其中,.progress 的样式使用了 transform-origin 属性,用于设置 CSS 变形的原点,这里设置为环形进度条的左边中心点位置。同时使用 clip 属性设置了进度条的裁剪位置,让进度条只显示右半部分。接着,我们在 .progress-bar 中又设置了一个动画效果,用于实现进度条的动画效果。最后,我们使用了 @keyframes 声明一个简单动画,实现了进度条的旋转动画效果。

Step 3:JavaScript 脚本

最后,我们需要使用 JavaScript 脚本来获取当前进度,并将其应用于进度条和文本信息中。

let progressElements = document.querySelectorAll('.progress');

progressElements.forEach((progressElement) => {
  let progress = parseFloat(progressElement.getAttribute('data-progress')) || 0;

  let progressBar = document.createElement('div');
  progressBar.classList.add('progress-bar');
  progressBar.style.transform = `rotate(${progress/100 * 360}deg)`;

  progressElement.appendChild(progressBar);

  let progressText = progressElement.querySelector('.progress-text');
  progressText.innerHTML = `${progress}%`;
});

在 JavaScript 脚本中,我们首先使用 querySelectorAll 获取所有的 .progress 元素,然后遍历每一个元素。接着,我们获取该元素上的 data-progress 属性值,就是当前进度的百分比。然后创建一个新的 .progress-bar 元素,并将其添加到 .progress 元素中。最后,还需要根据百分比设置 .progress-bar 的样式,以显示正确的进度条位置。

示例

下面我们演示两个使用 CSS3 实现环形进度条的示例:

示例一:简单的实现进度条,主要演示使用 CSS3 的变形效果

<div class="progress-container">
  <div class="progress" data-progress="50"></div>
  <span class="progress-text">50%</span>
</div>
.progress-container {
  position: relative;
  width: 150px;
  height: 150px;
  margin: 50px auto;
}

.progress {
  position: absolute;
  top: 0;
  left: 50%;
  width: 100%;
  height: 100%;
  transform-origin: 0% 50%;
  border-radius: 50%;
  clip: rect(0, 75px, 150px, 0);
  background: #efefef;
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2) inset;
}

.progress-bar {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #00bdff;
  clip: rect(0, 75px, 150px, 0);
  animation: progress 1s linear forwards;
}

.progress-text {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 24px;
  font-weight: bold;
  color: #333;
}

@keyframes progress {
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(360deg);
  }
}

示例二:增加动态进度的支持,主要演示使用 JavaScript 实现进度动画效果

<div class="progress-container">
  <div class="progress" data-progress="0"></div>
  <span class="progress-text">0%</span>
</div>

<button class="start">开始</button>
<button class="reset">重置</button>
.progress-container {
  position: relative;
  width: 150px;
  height: 150px;
  margin: 50px auto;
}

.progress {
  position: absolute;
  top: 0;
  left: 50%;
  width: 100%;
  height: 100%;
  transform-origin: 0% 50%;
  border-radius: 50%;
  clip: rect(0, 75px, 150px, 0);
  background: #efefef;
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2) inset;
}

.progress-bar {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: #00bdff;
  clip: rect(0, 75px, 150px, 0);
  animation: progress 1s linear forwards;
}

.progress-text {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 24px;
  font-weight: bold;
  color: #333;
}

@keyframes progress {
  0% {
    transform: rotate(0deg);
  }

  100% {
    transform: rotate(360deg);
  }
}

.hide {
  display: none;
}
let progressElements = document.querySelectorAll('.progress');
let startButton = document.querySelector('.start');
let resetButton = document.querySelector('.reset');

progressElements.forEach((progressElement) => {
  let progress = parseFloat(progressElement.getAttribute('data-progress')) || 0;

  let progressBar = document.createElement('div');
  progressBar.classList.add('progress-bar');
  progressBar.style.transform = `rotate(${progress/100 * 360}deg)`;

  progressElement.appendChild(progressBar);

  let progressText = progressElement.querySelector('.progress-text');
  progressText.innerHTML = `${progress}%`;
});

startButton.addEventListener('click', () => {
  progressElements.forEach((progressElement) => {
    let progress = parseFloat(progressElement.getAttribute('data-progress')) || 0;
    let progressBar = progressElement.querySelector('.progress-bar');

    progressBar.style.animation = '';
    progressBar.offsetHeight;
    progressBar.style.animation = `progress ${1 + progress / 100}s linear forwards`;

    progressElement.setAttribute('data-progress', '100');
    progressBar.style.transform = `rotate(360deg)`;
    progressElement.querySelector('.progress-text').innerHTML = '100%';
  });
});

resetButton.addEventListener('click', () => {
  progressElements.forEach((progressElement) => {
    let progressBar = progressElement.querySelector('.progress-bar');

    progressBar.style.animation = '';
    progressBar.offsetHeight;
    progressBar.style.animation = `progress 1s linear forwards`;

    progressElement.setAttribute('data-progress', '0');
    progressBar.style.transform = `rotate(0deg)`;
    progressElement.querySelector('.progress-text').innerHTML = '0%';
  });
});

在示例二中,我们增加了两个按钮,用于模拟进度的开始和重置操作。这里我们需要动态修改进度条的样式以显示进度变化。为此,我们对 JavaScript 脚本进行了修改,增加了使用动画特性的代码来实现进度条的动态效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用CSS3实现环形进度条效果 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • HTML5实现动画效果的方式汇总

    下面是关于“HTML5实现动画效果的方式汇总”完整攻略的详细讲解。 1. 基础动画技术 CSS3 动画 CSS3 动画是一种使用 CSS3 属性实现动画效果的方式,该方式几乎覆盖了所有动画效果。它的优点是简单、易实现,缺点是需要考虑浏览器兼容性。 该方式需要先定义动画关键帧,再将关键帧关联到动画对象上,最后定义动画的持续时间、速度等参数。下面是一个简单的 C…

    css 2023年6月9日
    00
  • Vue表单验证插件Vue Validator使用方法详解

    Vue表单验证插件Vue Validator使用方法详解 Vue Validator是一个基于Vue.js的表单验证插件,它提供了丰富的验证规则和自定义验证方式,可以大大简化前端表单验证的工作,下面是使用Vue Validator的详细方法。 安装Vue Validator 首先,需要安装Vue Validator,可以通过下面的命令来进行安装。 npm i…

    css 2023年6月9日
    00
  • 页面中有间隔的方格布局如何完美实现方法

    页面中有间隔的方格布局如何完美实现方法 在页面中,有时需要使用方格布局来展示内容,但是为了美观和易读性,需要在方格之间添加一定的间隔。本攻略将详细讲解如何实现页面中有间隔的方格布局,包括基本概念、实现方法、注意事项和示例说明。 1. 基本概念 在页面中,方格布局是指将内容按照一定的规律排列成方格状的布局。为了美观和易读性,需要在方格之间添加一定的间隔。 2.…

    css 2023年5月18日
    00
  • javascript实现QQ空间相册展示源码

    下面就来一步步讲解如何通过JavaScript实现QQ空间相册展示。 准备工作 为了实现QQ空间相册展示,我们需要先在QQ空间中创建一个相册,并且获取该相册的相片列表。而获取相册相片列表需要通过调用QQ空间提供的API来完成。具体的API文档可以参考 QQ互联开发平台。 在获取到相片列表之后,我们就可以使用JavaScript来进行相片的展示了。 编写代码 …

    css 2023年6月10日
    00
  • 借助得力工具五分钟快速制作CSS导航菜单

    下面是关于“借助得力工具五分钟快速制作CSS导航菜单”的完整攻略: 什么是得力工具? 得力工具是一款能够帮助用户快速制作CSS导航菜单的在线工具,无需编写CSS代码,只需要使用简单的拖拽操作,就能够创建出漂亮且实用的导航菜单。 如何使用得力工具制作CSS导航菜单? 以下是使用得力工具制作CSS导航菜单的详细步骤: 步骤一:打开得力工具网站 在浏览器中输入得力…

    css 2023年6月10日
    00
  • css 关于空白叠加

    CSS中的空白叠加(Margin Collapse)通常是指当相邻的两个元素之间存在空白(margin/padding/border)时,它们之间的空白会按照一定规则合并,而不是简单地叠加。 通常情况下,当两个同级元素上下相邻时,它们之间的垂直方向的外边距会合并,结果等于两个外边距中的较大值。但有一些情况下,外边距不会进行合并。 现在,我们来看两个不同的示例…

    css 2023年6月11日
    00
  • vue文件使用iconfont解析

    关于“vue文件使用iconfont解析”的完整攻略,以下是详细的步骤说明: 1. 在iconfont官网上创建图标库 首先需要在iconfont官网进行图标库的创建和管理,这里不再赘述。创建好图标库之后,可以在库里选择需要使用的图标,将其添加到“购物车”里面,并下载图标库相关文件。 2. 创建Vue项目 使用Vue-cli创建新项目,执行命令: vue c…

    css 2023年6月10日
    00
  • 使用css实现圆角图形绘制

    我会用Markdown格式帮你详细讲解如何使用CSS实现圆角图形绘制。 1. 了解CSS3 border-radius属性 CSS3的border-radius属性可以让我们非常简单地实现圆角的图形绘制。该属性可以为任何一个元素添加一个或多个圆角。其语法如下: border-radius: value; 其中,value可以是一个具体的长度,表示圆角的半径;…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部