拖拽进度条react的实现

先来看看效果图

在这里插入图片描述

/*

  • @Author: hongbin
  • @Date: 2022-04-16 13:26:39
  • @LastEditors: hongbin
  • @LastEditTime: 2022-04-16 21:00:02
  • @Description:拖动进度条组件
    */

import { FC, ReactElement, useRef } from “react”;
import styled from “styled-components”;
import { flexCenter } from “…/…/styled”;

interface IProps {
/**

  • 0-1
    /
    value: number;
    /
    *
  • callback 0-1
    */
    onChange: (percent: number) => void;
    }

const ProgressBar: FC = ({ value, onChange }): ReactElement => {
const totalRef = useRef(null);

return (


<div style={{ width: value * 100 + “%” }} />

<div
onMouseDown={(e) => {
const { offsetWidth } = totalRef.current!;
const stop = e.currentTarget;
const { offsetLeft } = stop;
stop.style[“left”] = offsetLeft + “px”;
const { pageX: start } = e;
const move = (e: MouseEvent) => {
let val = offsetLeft + e.pageX - start;
if (val <= 0) val = 0;
if (val >= offsetWidth) val = offsetWidth;
// stop.style[“left”] = val + “px”;
onChange(val / offsetWidth);
};

      const clear = () => {
        document.removeEventListener("mousemove", move);
        document.removeEventListener("mouseup", clear);
        document.removeEventListener("mouseleave", clear);
      };
      document.addEventListener("mousemove", move);
      document.addEventListener("mouseup", clear);
      document.addEventListener("mouseleave", clear);
    }}
    style={{ left: value * 100 + "%" }}
  ></div>
</Container>

);
};

export default ProgressBar;

const Container = styled.div position: relative; width: 10vw; height: 1vw; ${flexCenter}; & > :first-child { width: inherit; height: 0.5vw; background-color: var(--tint-color); border-radius: 10vw; overflow: hidden; display: flex; align-items: center; padding: 0.05vw; div { width: 5vw; height: 0.4vw; background-color: var(--deep-color); border-radius: 0.4vw; } } & > :last-child { width: 1vw; height: 1vw; background-color: var(--deep-color); border-radius: 1vw; position: absolute; cursor: pointer; transform: translateX(-0.5vw); svg { width: 0.9vw; } };

export const flexCenter = css display: flex; justify-content: center; align-items: center;;
:root {
–deep-color: #978961;
–tint-color: #efe5d4;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q shen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值