Javascript 创建一个';s border递增地减少onClick并准时触发事件';0';

Javascript 创建一个';s border递增地减少onClick并准时触发事件';0';,javascript,css,reactjs,Javascript,Css,Reactjs,我发现了这个很棒的工具,但在我的项目中实施起来很尴尬: 我想创建一个可重用的按钮组件,onClick通过其边框启动类似的倒计时效果,让用户有机会“撤销”他们的决定(类似于在fb messenger中转发消息)。我可以理解react逻辑,但不知道从哪里开始使用css 提前感谢浏览了您提到的组件的代码,我注意到它使用了一个带有动画笔划的SVG元素来创建和动画循环进度条 这篇文章是我最喜欢的关于这个具体问题的文章: 下面是那篇文章中的代码,供将来参考。这不是我的代码,要感谢文章的原作者: var

我发现了这个很棒的工具,但在我的项目中实施起来很尴尬:

我想创建一个可重用的按钮组件,onClick通过其边框启动类似的倒计时效果,让用户有机会“撤销”他们的决定(类似于在fb messenger中转发消息)。我可以理解react逻辑,但不知道从哪里开始使用css


提前感谢

浏览了您提到的组件的代码,我注意到它使用了一个带有动画笔划的SVG元素来创建和动画循环进度条

这篇文章是我最喜欢的关于这个具体问题的文章:

下面是那篇文章中的代码,供将来参考。这不是我的代码,要感谢文章的原作者:

var circle=document.querySelector('circle');
var半径=圆r.baseVal.value;
var圆周=半径*2*Math.PI;
circle.style.strokeDasharray=`${percentral}${percentral}`;
circle.style.strokedashcoffset=`${percentral}`;
功能设置进度(百分比){
常数偏移=周长-百分比/100*周长;
circle.style.strokedashcoffset=偏移量;
}
常量输入=document.querySelector('input');
设置进度(输入值);
input.addEventListener('change',函数(e){
if(input.value<101&&input.value>-1){
设置进度(输入值);
}  
})
html,正文{
背景色:#2962FF;
显示器:flex;
对齐项目:居中;
证明内容:中心;
身高:100%;
位置:相对位置;
}
.进步环{
}
.进步环{
过渡:0.35s行程偏移;
//轴补偿
变换:旋转(-90度);
变换原点:50%50%;
}
输入{
位置:固定;
顶部:10px;
左:10px;
宽度:80px;
}

这是一个纯css饼图计时器,与链接中提到的计时器非常相似。 全屏观看
var时间=11;
{
var func=setInterval(函数(){
如果(时间!=0){
document.getElementsByClassName('time')[0].innerHTML=time;
时间--;
如果(时间<5){
document.getElementsByClassName('warning')[0].style.display=“block”;
}
}否则{
document.getElementsByClassName('time')[0].innerHTML=“0”;
document.getElementsByClassName('warning')[0].style.display=“无”;
清除间隔(func);
}
}, 1000);
}
.timer{
高度:200px;
宽度:200px;
边界半径:50%;
背景色:黑色;
动画:时间无限;
左边距:570px;
利润上限:200px;
}
.酒吧{
位置:绝对位置;
}
.左图进展{
位置:绝对位置;
高度:200px;
宽度:200px;
背景:线性梯度(90度,#00d2ff 0%,#3a47d5 100%);
边界半径:50%;
剪辑:rect(0px 100px 200px 0px);
动画:向右旋转6s 6s线性两个;
}
@关键帧向右旋转{
100% {
变换:旋转(180度);
}
}
.左进度条{
位置:绝对位置;
高度:200px;
宽度:200px;
背景色:#E9E9E9;
边界半径:50%;
剪辑:rect(0px 100px 200px 0px);
z指数:1;
动画:中段4s线性二者;
}
.正确的进展{
位置:绝对位置;
高度:200px;
宽度:200px;
背景色:#E9E9E9;
边界半径:50%;
剪辑:rect(0px 100px 200px 0px);
变换:旋转(180度);
动画:向左旋转6秒,同时线性旋转;
}
@关键帧向左旋转{
100% {
变换:旋转(360度);
}
}
.右(进度)(进度){
位置:绝对位置;
高度:200px;
宽度:200px;
背景:线性梯度(90度,#00d2ff 0%,#3a47d5 100%);
边界半径:50%;
剪辑:rect(0px 100px 200px 0px);
变换:旋转(180度);
z指数:1;
}
.主要内容{
位置:绝对位置;
高度:180像素;
宽度:180px;
边界半径:50%;
背景色:白色;
z指数:4;
边缘顶部:10px;
左边距:10px;
字体系列:“arial”;
文本对齐:居中;
}
.计时器内容{
位置:绝对位置;
边缘顶端:40px;
左边距:45像素;
}
.内容{
字体大小:15px;
边际:0px;
颜色:#6B6C6D;
}
.时间{
字体大小:55px;
边际:0px;
背景:-webkit线性梯度(90度,#00d2ff 0%,#3a47d5 100%);
-webkit背景剪辑:文本;
-webkit文本填充颜色:透明;
}
.警告{
位置:绝对位置;
高度:180像素;
宽度:180px;
边界半径:50%;
背景色:#dbdb;
动画:警告铃1无限;
显示:无;
}
@关键帧警告铃{
从{
变换:比例(0);
不透明度:1;
}
到{
变换:比例(1);
不透明度:0;
}
}

您可以在

12