当前位置:网站首页>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
}
}
边栏推荐
- 昨天阿里学长写了一个责任链模式,竟然出现了无数个bug
- R语言dplyr包na_if函数把向量数值中的控制转化为缺失值NA、按照映射规则把指定内容转化为缺失值NA
- Looking for innocence in New York -- a beautiful day at the discovery center of Legoland, New Jersey
- iptable端口重定向 MASQUERADE[通俗易懂]
- Eliminate the yellow alarm light on IBM p750 small computer [easy to understand]
- What are the links of the problem
- 一款简约PHP个人发卡程序V4.0版本
- R语言ggplot2可视化分面图(facet):gganimate包基于transition_time函数创建动态散点图动画(gif)
- Google's official response: we have not given up tensorflow and will develop side by side with Jax in the future
- Comprendre complètement le tutoriel de traitement de Point Cloud basé sur open3d!
猜你喜欢

Leetcode(81)——搜索旋转排序数组 II

Esp32-c3 introductory tutorial question ⑩ - error: implicit declaration of function 'ESP_ blufi_ close‘;

Implementation shadow introduction

揭秘得物客服IM全链路通信过程

Web版3D可视化工具,程序员应该知道的97件事,AI前沿论文 | 资讯日报 #2022.07.01

新加坡暑假旅遊攻略:一天玩轉新加坡聖淘沙島

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

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

Exness in-depth good article: dynamic series - Case Analysis of gold liquidity (V)

任职 22 年,PowerShell 之父将从微软离职:曾因开发 PowerShell 被微软降级过
随机推荐
新加坡暑假旅游攻略:一天玩转新加坡圣淘沙岛
Eliminate the yellow alarm light on IBM p750 small computer [easy to understand]
How to write controller layer code gracefully?
Redis (6) -- object and data structure
LightGroupButton* sender = static_ cast<LightGroupButton*>(QObject::sender());
鸿蒙第四次学习
SAP S/4HANA OData Mock Service 介绍
The difference between promise and observable
产品经理应具备的能力
Competence of product manager
StretchDIBits函数
Responses of different people in technology companies to bugs | daily anecdotes
徹底搞懂基於Open3D的點雲處理教程!
Chain game system development (unity3d chain game development details) - chain game development mature technology source code
Ali was wildly asked by the interviewer on three sides. Redis dared not write 'proficient' on his resume anymore
阿里三面被面试官狂问Redis,简历上再也不敢写'精通'了
Implementation shadow introduction
哪个券商公司网上开户佣金低又安全又可靠
呆错图床系统源码图片CDN加速与破J防盗链功能
Leetcode 面试题 16.15. 珠玑妙算