- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于页面上尽可能多的进度圈,我需要等量的计时器来更新它们的进度百分比数字和颜色。它们都从 0 开始,并逐步达到它们的 data-current-progress
值。
选择颜色
我有一组特定的 100 种颜色,从红色到橙色,最后是绿色,在一个数组中;
var ProgressColourTween = [
"#ff4400", "#ff4900", "#ff4a00", "#ff4c00", "#ff4d00",
... ... ... ... ...
"#8cc400", "#8ac500", "#87c600", "#85c700", "#82c800"
];
每种颜色都是百分比的实体表示,因此在 1% 时它看起来会很红,大约 50% 橙色和 100% 绿色。
更新进度数值
在循环中,从 0 到它们的 data-current-progress
值,例如 i++
,我将更新该值。
<div class="numbers">
<span>0%</span>
</div>
如果这是我正在处理的单个进度循环,只需命名一个计时器然后稍后结束它,事情就会容易得多,但是与多个一起工作时,我发现启动几个并停止是相当困难的他们完成时他们,而不是其他人完成时。
我如何动态创建、启动和停止多个间隔循环以达到预期目的?
最佳答案
为每个 .circle
设置计时器并计算每个计时器执行的百分比。
var ProgressColourTween = [
"#ff4400", "#ff4900", "#ff4a00", "#ff4c00", "#ff4d00", "#ff4f00", "#ff5000", "#ff5100", "#ff5200", "#ff5400",
"#ff5600", "#ff5700", "#ff5900", "#ff5a00", "#ff5c00", "#ff5c00", "#ff5e00", "#ff5f00", "#ff6100", "#ff6300",
"#ff6400", "#ff6600", "#ff6700", "#ff6800", "#ff6900", "#ff6b00", "#ff6c00", "#ff6e00", "#ff6f00", "#ff7100",
"#ff7200", "#ff7300", "#ff7500", "#ff7600", "#ff7800", "#ff7900", "#ff7a00", "#ff7c00", "#ff7d00", "#ff7f00",
"#ff8700", "#ff8800", "#ff8a00", "#ff8b00", "#ff8c00", "#ff8e00", "#ff8f00", "#ff9100", "#ff9200", "#ff9400",
"#ff9400", "#fc9500", "#fa9600", "#f79700", "#f59800", "#f29900", "#f09a00", "#ed9c00", "#eb9c00", "#e89e00",
"#e69e00", "#e3a000", "#e0a100", "#dea200", "#dba300", "#d9a400", "#d6a500", "#d4a600", "#d1a700", "#cfa800",
"#cca900", "#c9ab00", "#c7ab00", "#c4ad00", "#c2ae00", "#bfaf00", "#bdb000", "#bab100", "#b8b200", "#b5b300",
"#b3b400", "#b0b500", "#adb600", "#abb700", "#a8b900", "#a6b900", "#a3bb00", "#a1bb00", "#9ebd00", "#9cbe00",
"#99bf00", "#96c000", "#94c100", "#91c200", "#8fc300", "#8cc400", "#8ac500", "#87c600", "#85c700", "#82c800"
];
var transitionTime = 2; // second
!(function($) {
"use strict";
$(function() {
$('.radial-progress').TCHQProgCirc();
});
$.fn.TCHQProgCirc = function() {
return this.each(function() {
var $this = $(this)
$this.find(".circle .mask, .circle .fill").css({
'transition': "transform " + transitionTime + "s"
});
var rotateTo = $this.data("current-progress");
$this.css({
'--pf': (rotateTo * 1.8) + "deg",
'--pff': (rotateTo * 3.6) + "deg",
'--pfwid': (rotateTo * 57) + "px"
})
colorTween($this);
});
};
})(jQuery);
function colorTween($this) {
$this.timer = setInterval(function() {
$this.step = $this.step || 1;
var c = $this.step++;
var totalPercentage = $this.data("current-progress");
var colorIndex = Math.floor(c * totalPercentage/100)
var color = ProgressColourTween[colorIndex];
$this.find('.fill').css('background-color', color)
var percentage = Math.floor(totalPercentage * c / 100); // current percentage
$this.find('.numbers span').text(`${percentage}%`)
c++;
if (c > 100) {
clearTimeout($this.timer)
}
}, transitionTime * 1000 / 100);
}
.clear {
clear: both;
}
.radial-progress {
float: left;
margin: 50px;
width: 120px;
height: 120px;
border-radius: 50%;
--pf: 0deg;
--pff: 0deg;
--pfwid: 0;
}
.radial-progress .circle .mask,
.radial-progress .circle .fill,
.radial-progress .circle .shadow {
width: 120px;
height: 120px;
position: absolute;
border-radius: 50%;
}
.radial-progress .circle .shadow {
box-shadow: 6px 6px 10px rgba(0, 0, 0, 0.2) inset;
}
.radial-progress .circle .mask,
.radial-progress .circle .fill {
-webkit-backface-visibility: hidden;
transition: transform 1s;
border-radius: 50%;
}
.radial-progress .circle .mask {
clip: rect(0px, 120px, 120px, 60px);
}
.radial-progress .circle .mask .fill {
clip: rect(0px, 60px, 120px, 0px);
background-color: #97a71d;
}
@keyframes move-in-steps {
0% {
background: red;
}
50% {
background: yellow;
}
100% {
background: #97a71d;
}
}
.radial-progress.coloring .circle .mask .fill {
animation: move-in-steps 1s;
}
.radial-progress .inset {
width: 90px;
height: 90px;
position: absolute;
margin-left: 15px;
margin-top: 15px;
background-color: #fbfbfb;
border-radius: 50%;
box-shadow: 6px 6px 10px rgba(0, 0, 0, 0.2);
}
.radial-progress .inset .percentage {
height: 22px;
width: 57px;
overflow: hidden;
position: absolute;
top: 34px;
left: 16.5px;
line-height: 1;
}
.radial-progress .inset .percentage .numbers span {
width: 57px;
display: inline-block;
vertical-align: top;
text-align: center;
font-weight: 800;
font-size: 22px;
/*font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif;*/
color: #97a71d;
}
.radial-progress .circle .mask.full,
.radial-progress .circle .fill {
transform: rotate( var(--pf));
}
.radial-progress .circle .fill.fix {
transform: rotate( var(--pff));
}
.radial-progress .inset .percentage .numbers {
width: var(--pfwid);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="radial-progress" data-current-progress="25">
<div class="circle">
<div class="mask full">
<div class="fill"></div>
</div>
<div class="mask half">
<div class="fill"></div>
<div class="fill fix"></div>
</div>
<div class="shadow"></div>
</div>
<div class="inset">
<div class="percentage">
<div class="numbers">
<span>0%</span>
</div>
</div>
</div>
</div>
<div class="radial-progress" data-current-progress="50">
<div class="circle">
<div class="mask full">
<div class="fill"></div>
</div>
<div class="mask half">
<div class="fill"></div>
<div class="fill fix"></div>
</div>
<div class="shadow"></div>
</div>
<div class="inset">
<div class="percentage">
<div class="numbers">
<span>0%</span>
</div>
</div>
</div>
</div>
<div class="clear"></div>
<div class="radial-progress" data-current-progress="75">
<div class="circle">
<div class="mask full">
<div class="fill"></div>
</div>
<div class="mask half">
<div class="fill"></div>
<div class="fill fix"></div>
</div>
<div class="shadow"></div>
</div>
<div class="inset">
<div class="percentage">
<div class="numbers">
<span>0%</span>
</div>
</div>
</div>
</div>
<div class="radial-progress" data-current-progress="100">
<div class="circle">
<div class="mask full">
<div class="fill"></div>
</div>
<div class="mask half">
<div class="fill"></div>
<div class="fill fix"></div>
</div>
<div class="shadow"></div>
</div>
<div class="inset">
<div class="percentage">
<div class="numbers">
<span>0%</span>
</div>
</div>
</div>
</div>
编辑:根据评论,我添加了一个可以暂停和恢复的新版本。代码的详细解释在代码注释中。
var ProgressColourTween = [
"#ff4400", "#ff4900", "#ff4a00", "#ff4c00", "#ff4d00", "#ff4f00", "#ff5000", "#ff5100", "#ff5200", "#ff5400",
"#ff5600", "#ff5700", "#ff5900", "#ff5a00", "#ff5c00", "#ff5c00", "#ff5e00", "#ff5f00", "#ff6100", "#ff6300",
"#ff6400", "#ff6600", "#ff6700", "#ff6800", "#ff6900", "#ff6b00", "#ff6c00", "#ff6e00", "#ff6f00", "#ff7100",
"#ff7200", "#ff7300", "#ff7500", "#ff7600", "#ff7800", "#ff7900", "#ff7a00", "#ff7c00", "#ff7d00", "#ff7f00",
"#ff8700", "#ff8800", "#ff8a00", "#ff8b00", "#ff8c00", "#ff8e00", "#ff8f00", "#ff9100", "#ff9200", "#ff9400",
"#ff9400", "#fc9500", "#fa9600", "#f79700", "#f59800", "#f29900", "#f09a00", "#ed9c00", "#eb9c00", "#e89e00",
"#e69e00", "#e3a000", "#e0a100", "#dea200", "#dba300", "#d9a400", "#d6a500", "#d4a600", "#d1a700", "#cfa800",
"#cca900", "#c9ab00", "#c7ab00", "#c4ad00", "#c2ae00", "#bfaf00", "#bdb000", "#bab100", "#b8b200", "#b5b300",
"#b3b400", "#b0b500", "#adb600", "#abb700", "#a8b900", "#a6b900", "#a3bb00", "#a1bb00", "#9ebd00", "#9cbe00",
"#99bf00", "#96c000", "#94c100", "#91c200", "#8fc300", "#8cc400", "#8ac500", "#87c600", "#85c700", "#82c800"
];
var transitionTime = 2; // second
!(function($) {
"use strict";
$(function() {
$('.radial-progress').TCHQProgCirc();
});
$.fn.TCHQProgCirc = function() {
return this.each(function() {
var $this = $(this)
// set trasitionTime
$this.find(".circle .mask, .circle .fill").css({
'transition': "transform " + transitionTime / 20 + "s"
});
colorTween($this);
});
};
})(jQuery);
var timerFlag = true;
function colorTween($this) {
$this.timer = setInterval(function() {
if (!timerFlag) {
// if click "Pause" button, stop the function
return;
}
// set the number of this function execute times, if $this.step is undefined at first, set it to 1
$this.step = $this.step || 1;
// assing c equals to $this.step, and makes $this.step = $this.step + 1 after assignment
var c = $this.step++;
// get the total percentage of this circle would be
var totalPercentage = $this.data("current-progress");
// calculate the current percentage
// e.g. if the totalPercentage is 25%, in the first loop of the setInterval,
// percentage would be (25 * 1 / 100) = 0.25
// then get the largest integer less than or equal to 0.25 which is 0
// if the totalPercentage is 25%, in the end of the setInterval loop,
// percentage would be (25 * 100 / 100) = 25
// then get the largest integer less than or equal to 25 which is 25
// This makes us to select the right color
var percentage = Math.floor(totalPercentage * c / 100);
var color = ProgressColourTween[percentage];
// calculate the variables to right values, you should know these better than I do since this is from your code ;)
var pf = (1.8 * percentage)
var pff = (3.6 * percentage)
$this.css({
'--pf': pf + "deg",
'--pff': pff + "deg",
})
// change the color of fill bar
$this.find('.fill').css('background-color', color)
// change the percentage
$this.find('.numbers span').text(`${percentage}%`)
if (c >= 100) {
// if current step is 100, clear timers
clearTimeout($this.timer)
}
}, transitionTime * 1000 / 100); // convert transitionTime to milisecond and divide it into 100
}
$('button').on('click', function() {
var paused = $(this).text() == "Pause"
if (paused) {
// if click "Pause" button, set flag to false, makes the timer stop from increasing the percentage
timerFlag = false
} else {
// if click "Continue" button, set flag to true
timerFlag = true
}
$(this).text(paused ? "Continue" : "Pause")
})
.clear {
clear: both;
}
.radial-progress {
float: left;
margin: 50px;
width: 120px;
height: 120px;
border-radius: 50%;
--pf: 0deg;
--pff: 0deg;
--pfwid: 0;
}
.radial-progress .circle .mask,
.radial-progress .circle .fill,
.radial-progress .circle .shadow {
width: 120px;
height: 120px;
position: absolute;
border-radius: 50%;
}
.radial-progress .circle .shadow {
box-shadow: 6px 6px 10px rgba(0, 0, 0, 0.2) inset;
}
.radial-progress .circle .mask,
.radial-progress .circle .fill {
-webkit-backface-visibility: hidden;
transition: transform 1s;
border-radius: 50%;
}
.radial-progress .circle .mask {
clip: rect(0px, 120px, 120px, 60px);
}
.radial-progress .circle .mask .fill {
clip: rect(0px, 60px, 120px, 0px);
background-color: #97a71d;
}
@keyframes move-in-steps {
0% {
background: red;
}
50% {
background: yellow;
}
100% {
background: #97a71d;
}
}
.radial-progress.coloring .circle .mask .fill {
animation: move-in-steps 1s;
}
.radial-progress .inset {
width: 90px;
height: 90px;
position: absolute;
margin-left: 15px;
margin-top: 15px;
background-color: #fbfbfb;
border-radius: 50%;
box-shadow: 6px 6px 10px rgba(0, 0, 0, 0.2);
}
.radial-progress .inset .percentage {
height: 22px;
width: 57px;
overflow: hidden;
position: absolute;
top: 34px;
left: 16.5px;
line-height: 1;
}
.radial-progress .inset .percentage .numbers span {
width: 57px;
display: inline-block;
vertical-align: top;
text-align: center;
font-weight: 800;
font-size: 22px;
/*font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif;*/
color: #97a71d;
}
.radial-progress .circle .mask.full,
.radial-progress .circle .fill {
transform: rotate( var(--pf));
}
.radial-progress .circle .fill.fix {
transform: rotate( var(--pff));
}
.radial-progress .inset .percentage .numbers {
width: var(--pfwid);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button>Pause</button>
<div class="radial-progress" data-current-progress="25">
<div class="circle">
<div class="mask full">
<div class="fill"></div>
</div>
<div class="mask half">
<div class="fill"></div>
<div class="fill fix"></div>
</div>
<div class="shadow"></div>
</div>
<div class="inset">
<div class="percentage">
<div class="numbers">
<span>0%</span>
</div>
</div>
</div>
</div>
<div class="radial-progress" data-current-progress="50">
<div class="circle">
<div class="mask full">
<div class="fill"></div>
</div>
<div class="mask half">
<div class="fill"></div>
<div class="fill fix"></div>
</div>
<div class="shadow"></div>
</div>
<div class="inset">
<div class="percentage">
<div class="numbers">
<span>0%</span>
</div>
</div>
</div>
</div>
<div class="clear"></div>
<div class="radial-progress" data-current-progress="75">
<div class="circle">
<div class="mask full">
<div class="fill"></div>
</div>
<div class="mask half">
<div class="fill"></div>
<div class="fill fix"></div>
</div>
<div class="shadow"></div>
</div>
<div class="inset">
<div class="percentage">
<div class="numbers">
<span>0%</span>
</div>
</div>
</div>
</div>
<div class="radial-progress" data-current-progress="100">
<div class="circle">
<div class="mask full">
<div class="fill"></div>
</div>
<div class="mask half">
<div class="fill"></div>
<div class="fill fix"></div>
</div>
<div class="shadow"></div>
</div>
<div class="inset">
<div class="percentage">
<div class="numbers">
<span>0%</span>
</div>
</div>
</div>
</div>
关于javascript - 动态启动和停止多个间隔循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49972095/
我是 PHP 新手。我一直在脚本中使用 for 循环、while 循环、foreach 循环。我想知道 哪个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要
我在高中的编程课上,我的作业是制作一个基本的小计和顶级计算器,但我在一家餐馆工作,所以制作一个只能让你在一种食物中读到。因此,我尝试让它能够接收多种食品并将它们添加到一个价格变量中。抱歉,如果某些代码
这是我正在学习的一本教科书。 var ingredients = ["eggs", "milk", "flour", "sugar", "baking soda", "baking powder",
我正在从字符串中提取数字并将其传递给函数。我想给它加 1,然后返回字符串,同时保留前导零。我可以使用 while 循环来完成此操作,但不能使用 for 循环。 for 循环只是跳过零。 var add
编辑:我已经在程序的输出中进行了编辑。 该程序要求估计给定值 mu。用户给出一个值 mu,同时还提供了四个不等于 1 的不同数字(称为 w、x、y、z)。然后,程序尝试使用 de Jaeger 公式找
我正在编写一个算法,该算法对一个整数数组从末尾到开头执行一个大循环,其中包含一个 if 条件。第一次条件为假时,循环可以终止。 因此,对于 for 循环,如果条件为假,它会继续迭代并进行简单的变量更改
现在我已经习惯了在内存非常有限的情况下进行编程,但我没有答案的一个问题是:哪个内存效率更高;- for(;;) 或 while() ?还是它们可以平等互换?如果有的话,还要对效率问题发表评论! 最佳答
这个问题已经有答案了: How do I compare strings in Java? (23 个回答) 已关闭 8 年前。 我正在尝试创建一个小程序,我可以在其中读取该程序的单词。如果单词有 6
这个问题在这里已经有了答案: python : list index out of range error while iteratively popping elements (12 个答案) 关
我正在尝试向用户请求 4 到 10 之间的整数。如果他们回答超出该范围,它将进入循环。当用户第一次正确输入数字时,它不会中断并继续执行 else 语句。如果用户在 else 语句中正确输入数字,它将正
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我想要做的事情是使用循环创建一个数组,然后在另一个类中调用该数组,这不会做,也可能永远不会做。解决这个问题最好的方法是什么?我已经寻找了所有解决方案,但它们无法编译。感谢您的帮助。 import ja
我尝试创建一个带有嵌套 foreach 循环的列表。第一个循环是循环一些数字,第二个循环是循环日期。我想给一个日期写一个数字。所以还有另一个功能来检查它。但结果是数字多次写入日期。 Out 是这样的:
我正在模拟一家快餐店三个多小时。这三个小时分为 18 个间隔,每个间隔 600 秒。每个间隔都会输出有关这 600 秒内发生的情况的统计信息。 我原来的结构是这样的: int i; for (i=0;
这个问题已经有答案了: IE8 for...in enumerator (3 个回答) How do I check if an object has a specific property in J
哪个对性能更好?这可能与其他编程语言不一致,所以如果它们不同,或者如果你能用你对特定语言的知识回答我的问题,请解释。 我将使用 c++ 作为示例,但我想知道它在 java、c 或任何其他主流语言中的工
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 C 编程和编写代码的新手,以确定 M 测试用例的质因数分解。如果我一次只扫描一次,该功能本身就可以工作,但是当我尝试执行 M 次时却惨遭失败。 我不知道为什么 scanf() 循环有问题。 in
这个问题已经有答案了: JavaScript by reference vs. by value [duplicate] (4 个回答) 已关闭 3 年前。 我在使用 TSlint 时遇到问题,并且理
我尝试在下面的代码中添加 foreach 或 for 循环,以便为 Charts.js 创建多个数据集。这将允许我在此折线图上创建多条线。 我有一个 PHP 对象,我可以对其进行编码以稍后填充变量,但
我是一名优秀的程序员,十分优秀!