当前位置:网站首页>Progress-进度条
Progress-进度条
2022-07-02 17:23:00 【臧小川】
效果图

Main
import {
useState } from 'react';
import Progress from './Progress'
const contentStyle = {
margin: '200px auto',
width: '300px'
};
const index = () =>
{
const [count, setCount] = useState(50)
return (
<div style={
contentStyle} >
<Progress percent={
count} unSelectedColor={
'#000'} strokeColor={
{
from: 'rgb(161, 29, 102)',
to: 'rgb(83, 177, 36)',
}} />
</div>
);
};
export default index
JS
import {
useState, useRef } from 'react';
import styles from './style.less'
const index = ({
percent, unSelectedColor, strokeColor }) =>
{
// ! 百分比
const [count, setCount] = useState(percent)
const myRef = useRef(null)
const bgDown = (e) =>
{
e = e || window.event
const {
nativeEvent: {
offsetX } } = e
setCount(Math.round(offsetX / myRef.current.clientWidth * 100))
// ! 如果是当前的节点触发的话 超出该dom将无法持续触发 体验效果不好 所以 可以换成 document
myRef.current.addEventListener('mousemove', fn)
// ! 这样的话 即使超出该 DOM 依旧会触发该函数
// document.addEventListener('mousemove', fn)
function fn (e)
{
// ! offsetX 当前鼠标点击的位置
const {
offsetX } = e
// ? round 取整 不需要可以去掉这个 Math.round
let newCount = Math.round(offsetX / myRef.current.clientWidth * 100)
newCount <= 100 ? setCount(newCount) : setCount(100)
}
document.addEventListener('mouseup', (() =>
{
// ! 替换为 document 并且取消点击事件
myRef?.current?.removeEventListener('mousemove', fn);
// document.removeEventListener('mousemove', fn);
}))
}
return (
<div className={
`${
styles.progress} ${
styles.progress_line} ${
styles.progress_show_info}`}>
<div className={
styles.progress_outer}>
<div id='inner' ref={
myRef} style={
{
backgroundColor: unSelectedColor && unSelectedColor }} onMouseDown={
bgDown} className={
styles.progress_inner}>
<div style={
{
width: `${
count}%`, backgroundImage: `linear-gradient(to right, ${
strokeColor['from']}, ${
strokeColor['to']}` }} className={
styles.progress_bg}>
<span>{
count}</span>
</div>
</div>
</div>
<span className={
styles.progress_text}>{
`${
count}%`}</span>
</div>
);
};
export default index
CSS
.progress {
box-sizing: border-box;
margin: 0;
padding: 0;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5715;
list-style: none;
font-feature-settings: 'tnum', "tnum";
display: inline-block;
}
.progress_line {
position: relative;
width: 100%;
font-size: 14px;
}
.progress_outer {
display: inline-block;
width: 100%;
margin-right: 0;
padding-right: 0;
margin-right: calc(-2em - 8px);
padding-right: calc(2em + 8px);
}
.progress_inner {
position: relative;
display: inline-block;
width: 100%;
// overflow: hidden;
vertical-align: middle;
background-color: #f5f5f5;
border-radius: 100px;
// ! 这里可以加个 padding 效果
// padding: 3px;
}
.progress_bg {
position: relative;
background-color: #1890ff;
border-radius: 100px;
transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s;
height: 8px;
animation: progress-info 3s ease-out;
&::before {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: #fff;
border-radius: 10px;
opacity: 0;
animation: progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite;
content: '';
}
&::after {
content: "";
display: inline-block;
position: absolute;
right: -4px;
top: -8px;
width: 0;
height: 0;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 3px solid #fff;
}
span {
display: inline-block;
position: absolute;
right: 6px;
top: -20px;
}
.progress-status-active .ant-progress-bg::before {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: #fff;
border-radius: 10px;
opacity: 0;
animation: progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite;
content: '';
}
@keyframes progress-active {
0% {
transform: translateX(-100%) scaleX(0);
opacity: 0.1;
}
20% {
transform: translateX(-100%) scaleX(0);
opacity: 0.5;
}
100% {
transform: translateX(0) scaleX(1);
opacity: 0;
}
}
}
@keyframes progress-info {
0% {
width: 0;
}
}
.progress_text {
display: inline-block;
width: 2em;
margin-left: 8px;
color: rgba(0, 0, 0, 0.85);
font-size: 1em;
line-height: 1;
white-space: nowrap;
text-align: left;
vertical-align: middle;
word-break: normal;
}
效果图

JS
import {
useState, useEffect } from 'react';
import styles from './style.less'
const index = () =>
{
const [count, setCount] = useState(0)
useEffect(() =>
{
setTimeout(() =>
{
setCount(80)
}, 1000);
}, [])
return (
<div className={
styles.container}>
<div className={
styles.progress}>
<div style={
{
width: `${
count}%` }} className={
styles.progress_bg}></div>
<span>我套你猴子</span>
</div>
</div>
);
};
export default index
CSS
body {
margin: 300px;
background-color: pink;
width: 300px;
}
.progress {
display: inline-block;
width: 200px;
height: 3px;
background-color: hsla(0, 0%, 100%, .2);
vertical-align: middle;
.progress_bg {
position: relative;
background-color: #fff;
height: 3px;
// ! 线展开的过度效果
transition: all 3s;
// ! 线的宽度
width: 30%;
&::after {
content: "";
display: inline-block;
position: absolute;
right: -4px;
top: -8px;
width: 0;
height: 0;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 3px solid #fff;
}
}
span {
font-size: 12px;
color: hsla(0, 0%, 100%, .4);
opacity: 0;
position: relative;
top: -5px;
letter-spacing: .5em;
transition: all .3s
}
&:hover span {
opacity: 1;
top: 0
}
}
边栏推荐
- Is it safe to buy funds on Alipay account
- Leetcode(154)——寻找旋转排序数组中的最小值 II
- [Northwestern Polytechnic University] information sharing of the first and second postgraduate examinations
- options should NOT have additional properties
- 链游系统开发(Unity3D链游开发详情)丨链游开发成熟技术源码
- QQmlApplicationEngine
- R语言dplyr包rowwise函数、mutate函数计算dataframe数据中多个数据列在每行的最大值、并生成行最大值对应的数据列(row maximum)
- 深度神经网络总结
- Rte11 interrupt decoupling function
- 问题包含哪些环节
猜你喜欢

呆错图床系统源码图片CDN加速与破J防盗链功能

In early summer, Kaiyuan magic changed an electric mosquito racket with killing sound effect!

How to clean up discarded PVs and their corresponding folders

Hongmeng's fourth learning

Troubleshooting: kubectl reports an error validationerror: unknown field \u00a0

Leetcode 面试题 16.17. 连续数列

阿里三面被面试官狂问Redis,简历上再也不敢写'精通'了

工业软件讲堂-三维CAD设计软件的核心技术解析----讲坛第二次讲座

Redis(6)----对象与数据结构

任职 22 年,PowerShell 之父将从微软离职:曾因开发 PowerShell 被微软降级过
随机推荐
The difference between SLC, MLC, TLC and QLC NAND SSD: which is better?
The text editor hopes to mark the wrong sentences in red, and the text editor uses markdown
MySQL 关于 only_full_group_by 限制
在Tensorflow2中使用mnist_784数据集进行手写数字识别
Leetcode 面试题 16.15. 珠玑妙算
After 22 years in office, the father of PowerShell will leave Microsoft: he was demoted by Microsoft for developing PowerShell
开源物联网平台ThingsBoard的安装
如何优雅的写 Controller 层代码?
Uncover the whole link communication process of dewu customer service im
Web version 3D visualization tool, 97 things programmers should know, AI frontier paper | information daily # 2022.07.01
新加坡暑假旅游攻略:一天玩转新加坡圣淘沙岛
科技公司不同人对Bug的反应 | 每日趣闻
27:第三章:开发通行证服务:10:【注册/登录】接口:注册/登录OK后,把用户会话信息(uid,utoken)保存到redis和cookie中;(一个主要的点:设置cookie)
Singapore summer tourism strategy: play Singapore Sentosa Island in one day
Esp32-c3 introductory tutorial question ⑩ - error: implicit declaration of function 'ESP_ blufi_ close‘;
IPtable port redirection masquerade[easy to understand]
【愚公系列】2022年07月 Go教学课程 001-Go语言前提简介
How to enable the run dashboard function of idea
Use MNIST in tensorflow 2_ 784 data set for handwritten digit recognition
NM01-独立于总线协议的NM模块功能概述与API定义