中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

JS實現環形進度條(從0到100%)效果
來源:易賢網 閱讀:4110 次 日期:2016-07-26 14:15:37
溫馨提示:易賢網小編為您整理了“JS實現環形進度條(從0到100%)效果”,方便廣大網友查閱!

這篇文章主要介紹了JS實現環形進度條(從0到100%)效果的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

最近公司項目中要用到這種類似環形進度條的效果,初始就從0開始動畫到100%結束。動畫結果始終會停留在100%上,并不會到因為數據的關系停留在一半。

如圖

名單

代碼如下:

demo.html

<!doctype html>

<html lang="zh">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>demo</title>

<style>

.rad-prg{

position: relative;

}

.rad-con{

position: absolute;

z-index: 1;

top:0;

left: 0;

text-align: center;

width:90px;

height: 90px;

padding: 10px;

font-family: "microsoft yahei";

}

</style>

</head>

<body>

<div class="prg-cont rad-prg" id="indicatorContainer">

<div class="rad-con">

<p>¥4999</p>

<p>賬戶總覽</p>

</div>

</div>

<script type="text/javascript" src="js/jquery.min.js"></script>

<script src="js/radialIndicator.js"></script>

<script>

$('#indicatorContainer').radialIndicator({

barColor: '#007aff',

barWidth: 5,

initValue: 0,

roundCorner : true,

percentage: true,

displayNumber: false,

radius: 50

});

setTimeout(function(){

var radObj = $('#indicatorContainer2').data('radialIndicator');

radObj.animate(100);

},300);

</script>

</body>

</html>

radialIndicator.js 這是jquery的插件

/*

radialIndicator.js v 1.0.0

Author: Sudhanshu Yadav

Copyright (c) 2015 Sudhanshu Yadav - ignitersworld.com , released under the MIT license.

Demo on: ignitersworld.com/lab/radialIndicator.html

*/

;(function ($, window, document) {

"use strict";

//circumfence and quart value to start bar from top

var circ = Math.PI * 2,

quart = Math.PI / 2;

//function to convert hex to rgb

function hexToRgb(hex) {

// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")

var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;

hex = hex.replace(shorthandRegex, function (m, r, g, b) {

return r + r + g + g + b + b;

});

var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);

return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : null;

}

function getPropVal(curShift, perShift, bottomRange, topRange) {

return Math.round(bottomRange + ((topRange - bottomRange) * curShift / perShift));

}

//function to get current color in case of

function getCurrentColor(curPer, bottomVal, topVal, bottomColor, topColor) {

var rgbAryTop = topColor.indexOf('#') != -1 ? hexToRgb(topColor) : topColor.match(/\d+/g),

rgbAryBottom = bottomColor.indexOf('#') != -1 ? hexToRgb(bottomColor) : bottomColor.match(/\d+/g),

perShift = topVal - bottomVal,

curShift = curPer - bottomVal;

if (!rgbAryTop || !rgbAryBottom) return null;

return 'rgb(' + getPropVal(curShift, perShift, rgbAryBottom[0], rgbAryTop[0]) + ',' + getPropVal(curShift, perShift, rgbAryBottom[1], rgbAryTop[1]) + ',' + getPropVal(curShift, perShift, rgbAryBottom[2], rgbAryTop[2]) + ')';

}

//to merge object

function merge() {

var arg = arguments,

target = arg[0];

for (var i = 1, ln = arg.length; i < ln; i++) {

var obj = arg[i];

for (var k in obj) {

if (obj.hasOwnProperty(k)) {

target[k] = obj[k];

}

}

}

return target;

}

//function to apply formatting on number depending on parameter

function formatter(pattern) {

return function (num) {

if(!pattern) return num.toString();

num = num || 0

var numRev = num.toString().split('').reverse(),

output = pattern.split("").reverse(),

i = 0,

lastHashReplaced = 0;

//changes hash with numbers

for (var ln = output.length; i < ln; i++) {

if (!numRev.length) break;

if (output[i] == "#") {

lastHashReplaced = i;

output[i] = numRev.shift();

}

}

//add overflowing numbers before prefix

output.splice(lastHashReplaced+1, output.lastIndexOf('#') - lastHashReplaced, numRev.reverse().join(""));

return output.reverse().join('');

}

}

//circle bar class

function Indicator(container, indOption) {

indOption = indOption || {};

indOption = merge({}, radialIndicator.defaults, indOption);

this.indOption = indOption;

//create a queryselector if a selector string is passed in container

if (typeof container == "string")

container = document.querySelector(container);

//get the first element if container is a node list

if (container.length)

container = container[0];

this.container = container;

//create a canvas element

var canElm = document.createElement("canvas");

container.appendChild(canElm);

this.canElm = canElm; // dom object where drawing will happen

this.ctx = canElm.getContext('2d'); //get 2d canvas context

//add intial value

this.current_value = indOption.initValue || indOption.minValue || 0;

}

Indicator.prototype = {

constructor: radialIndicator,

init: function () {

var indOption = this.indOption,

canElm = this.canElm,

ctx = this.ctx,

dim = (indOption.radius + indOption.barWidth) * 2, //elm width and height

center = dim / 2; //center point in both x and y axis

//create a formatter function

this.formatter = typeof indOption.format == "function" ? indOption.format : formatter(indOption.format);

//maximum text length;

this.maxLength = indOption.percentage ? 4 : this.formatter(indOption.maxValue).length;

canElm.width = dim;

canElm.height = dim;

//draw a grey circle

ctx.strokeStyle = indOption.barBgColor; //background circle color

ctx.lineWidth = indOption.barWidth;

ctx.beginPath();

ctx.arc(center, center, indOption.radius, 0, 2 * Math.PI);

ctx.stroke();

//store the image data after grey circle draw

this.imgData = ctx.getImageData(0, 0, dim, dim);

//put the initial value if defined

this.value(this.current_value);

return this;

},

//update the value of indicator without animation

value: function (val) {

//return the val if val is not provided

if (val === undefined || isNaN(val)) {

return this.current_value;

}

val = parseInt(val);

var ctx = this.ctx,

indOption = this.indOption,

curColor = indOption.barColor,

dim = (indOption.radius + indOption.barWidth) * 2,

minVal = indOption.minValue,

maxVal = indOption.maxValue,

center = dim / 2;

//limit the val in range of 0 to 100

val = val < minVal ? minVal : val > maxVal ? maxVal : val;

var perVal = Math.round(((val - minVal) * 100 / (maxVal - minVal)) * 100) / 100, //percentage value tp two decimal precision

dispVal = indOption.percentage ? perVal + '%' : this.formatter(val); //formatted value

//save val on object

this.current_value = val;

//draw the bg circle

ctx.putImageData(this.imgData, 0, 0);

//get current color if color range is set

if (typeof curColor == "object") {

var range = Object.keys(curColor);

for (var i = 1, ln = range.length; i < ln; i++) {

var bottomVal = range[i - 1],

topVal = range[i],

bottomColor = curColor[bottomVal],

topColor = curColor[topVal],

newColor = val == bottomVal ? bottomColor : val == topVal ? topColor : val > bottomVal && val < topVal ? indOption.interpolate ? getCurrentColor(val, bottomVal, topVal, bottomColor, topColor) : topColor : false;

if (newColor != false) {

curColor = newColor;

break;

}

}

}

//draw th circle value

ctx.strokeStyle = curColor;

//add linecap if value setted on options

if (indOption.roundCorner) ctx.lineCap = "round";

ctx.beginPath();

ctx.arc(center, center, indOption.radius, -(quart), ((circ) * perVal / 100) - quart, false);

ctx.stroke();

//add percentage text

if (indOption.displayNumber) {

var cFont = ctx.font.split(' '),

weight = indOption.fontWeight,

fontSize = indOption.fontSize || (dim / (this.maxLength - (Math.floor(this.maxLength*1.4/4)-1)));

cFont = indOption.fontFamily || cFont[cFont.length - 1];

ctx.fillStyle = indOption.fontColor || curColor;

ctx.font = weight +" "+ fontSize + "px " + cFont;

ctx.textAlign = "center";

ctx.textBaseline = 'middle';

ctx.fillText(dispVal, center, center);

}

return this;

},

//animate progressbar to the value

animate: function (val) {

var indOption = this.indOption,

counter = this.current_value || indOption.minValue,

self = this,

incBy = Math.ceil((indOption.maxValue - indOption.minValue) / (indOption.frameNum || (indOption.percentage ? 100 : 500))), //increment by .2% on every tick and 1% if showing as percentage

back = val < counter;

//clear interval function if already started

if (this.intvFunc) clearInterval(this.intvFunc);

this.intvFunc = setInterval(function () {

if ((!back && counter >= val) || (back && counter <= val)) {

if (self.current_value == counter) {

clearInterval(self.intvFunc);

return;

} else {

counter = val;

}

}

self.value(counter); //dispaly the value

if (counter != val) {

counter = counter + (back ? -incBy : incBy)

}; //increment or decrement till counter does not reach to value

}, indOption.frameTime);

return this;

},

//method to update options

option: function (key, val) {

if (val === undefined) return this.option[key];

if (['radius', 'barWidth', 'barBgColor', 'format', 'maxValue', 'percentage'].indexOf(key) != -1) {

this.indOption[key] = val;

this.init().value(this.current_value);

}

this.indOption[key] = val;

}

};

/** Initializer function **/

function radialIndicator(container, options) {

var progObj = new Indicator(container, options);

progObj.init();

return progObj;

}

//radial indicator defaults

radialIndicator.defaults = {

radius: 50, //inner radius of indicator

barWidth: 5, //bar width

barBgColor: '#eeeeee', //unfilled bar color

barColor: '#99CC33', //filled bar color , can be a range also having different colors on different value like {0 : "#ccc", 50 : '#333', 100: '#000'}

format: null, //format indicator numbers, can be a # formator ex (##,###.##) or a function

frameTime: 10, //miliseconds to move from one frame to another

frameNum: null, //Defines numbers of frame in indicator, defaults to 100 when showing percentage and 500 for other values

fontColor: null, //font color

fontFamily: null, //defines font family

fontWeight: 'bold', //defines font weight

fontSize : null, //define the font size of indicator number

interpolate: true, //interpolate color between ranges

percentage: false, //show percentage of value

displayNumber: true, //display indicator number

roundCorner: false, //have round corner in filled bar

minValue: 0, //minimum value

maxValue: 100, //maximum value

initValue: 0 //define initial value of indicator

};

window.radialIndicator = radialIndicator;

//add as a jquery plugin

if ($) {

$.fn.radialIndicator = function (options) {

return this.each(function () {

var newPCObj = radialIndicator(this, options);

$.data(this, 'radialIndicator', newPCObj);

});

};

}

}(window.jQuery, window, document, void 0));

以上所述是小編給大家介紹的JS實現環形進度條(從0到100%)效果 ,希望對大家有所幫助

更多信息請查看網絡編程
易賢網手機網站地址:JS實現環形進度條(從0到100%)效果
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
欧美国产日本在线| 99视频精品全部免费在线| 国产一区二区三区四区三区四| 99精品国产福利在线观看免费| 欧美激情片在线观看| 一区二区三区四区五区精品| 国产精品久久久久久久久免费| 一本久久综合| 国产精品入口福利| 欧美在线国产| 在线成人h网| 欧美精品国产精品| 亚洲图片激情小说| 国产午夜精品一区二区三区视频 | 亚洲国产电影| 欧美日韩视频免费播放| 欧美人在线视频| 在线视频精品一| 亚洲电影欧美电影有声小说| 欧美日韩黄色大片| 欧美中文在线视频| 日韩视频在线免费| 国产日本欧美一区二区三区| 欧美成人a视频| 欧美一区二区在线看| 亚洲激情一区二区三区| 国产精品久久久免费| 久久尤物电影视频在线观看| 亚洲小说春色综合另类电影| 激情欧美国产欧美| 欧美日韩一本到| 久久天堂精品| 亚洲欧美成人在线| 亚洲日本黄色| 黄色成人在线观看| 国产精品免费观看在线| 欧美国产日产韩国视频| 欧美在线免费观看亚洲| 日韩视频在线一区二区三区| 激情一区二区| 国产欧美日韩视频| 欧美色精品天天在线观看视频| 久久人人爽爽爽人久久久| 亚洲一区二区在| 亚洲视频久久| 日韩亚洲欧美精品| 亚洲国产美国国产综合一区二区| 国产欧美日韩三级| 国产精品久久999| 欧美日韩中文字幕精品| 欧美激情1区2区3区| 巨乳诱惑日韩免费av| 久久久久久9999| 欧美在线在线| 欧美影院成人| 欧美在线播放一区| 午夜在线精品偷拍| 亚洲免费视频网站| 亚洲影视中文字幕| 亚洲欧美激情视频| 亚洲综合三区| 亚洲欧美日韩在线一区| 亚洲在线视频| 亚洲综合国产| 欧美一区亚洲二区| 欧美一区二区黄| 久久国产福利国产秒拍| 欧美伊人久久大香线蕉综合69| 午夜精品久久久久久久久| 午夜精品偷拍| 性欧美精品高清| 久久精品成人一区二区三区蜜臀 | 欧美日韩精品免费| 欧美电影免费观看大全| 一区二区三区日韩欧美| 亚洲在线一区二区| 欧美一区二区三区免费在线看| 午夜欧美不卡精品aaaaa| 午夜精品久久久久久久男人的天堂| 亚洲男同1069视频| 欧美影院视频| 久久网站热最新地址| 免费在线国产精品| 欧美日本一道本在线视频| 欧美调教vk| 国产精品入口麻豆原神| 国产一区二区剧情av在线| 伊大人香蕉综合8在线视| 91久久精品美女高潮| 国产精品99久久久久久久久| 亚洲免费在线| 久久久国产精品亚洲一区 | 亚洲欧美国产高清| 欧美一区二区三区日韩视频| 久久欧美肥婆一二区| 欧美国产精品v| 国产精品久久久久久福利一牛影视 | 国产精品久久久久久久久久久久| 国产精品美女久久福利网站| 国内精品美女在线观看| 亚洲欧洲一区| 亚洲女ⅴideoshd黑人| 久久伊人免费视频| 欧美三级午夜理伦三级中视频| 国产欧美日韩专区发布| 91久久精品国产91性色tv| 亚洲欧美国产毛片在线| 欧美成人情趣视频| 国产欧美在线观看一区| 99精品视频一区| 另类春色校园亚洲| 国产伦精品一区二区三区四区免费 | 快she精品国产999| 欧美性色综合| 伊人久久av导航| 亚洲欧美综合另类中字| 欧美精品18videos性欧美| 国产日韩欧美亚洲一区| 99re66热这里只有精品4| 久久亚洲一区二区三区四区| 国产精品每日更新| 亚洲国产婷婷综合在线精品| 欧美综合二区| 国产精品一区二区女厕厕| 亚洲精品国产欧美| 久久这里只有| 国产亚洲一区二区精品| 亚洲一区二区三区在线观看视频| 男女av一区三区二区色多| 国产亚洲一区在线| 亚洲欧美日韩国产一区| 国产精品video| 日韩亚洲欧美精品| 老司机免费视频久久| 国产色综合网| 性色av香蕉一区二区| 国产精品久久久久免费a∨| 日韩午夜在线播放| 欧美寡妇偷汉性猛交| 精品成人在线视频| 欧美综合国产| 国产欧美欧美| 亚洲欧美日韩在线观看a三区| 欧美日韩另类字幕中文| 亚洲国产精品久久精品怡红院| 亚洲综合色网站| 国产精品试看| 欧美亚洲在线视频| 国产日韩欧美自拍| 久久se精品一区二区| 国产综合视频| 久久久久久久久久久久久久一区| 国产一区二区| 久久久久国色av免费观看性色| 国产一区二区丝袜高跟鞋图片| 久久精品国产清自在天天线 | 精品99一区二区| 久久久久成人精品免费播放动漫| 国内自拍亚洲| 乱码第一页成人| 亚洲电影在线看| 欧美精品一区二区三区蜜臀| 亚洲人在线视频| 欧美喷潮久久久xxxxx| 夜夜爽www精品| 国产欧美一区视频| 久久成人免费电影| 在线欧美不卡| 欧美日韩国产123| 亚洲综合色在线| 国产一区二区日韩精品| 噜噜爱69成人精品| 99这里有精品| 国产精品一香蕉国产线看观看| 久久久久久噜噜噜久久久精品| …久久精品99久久香蕉国产| 蜜臀av一级做a爰片久久| 日韩视频在线播放| 国产日韩在线不卡| 久久亚洲精品伦理| 99国产精品久久| 国产一二三精品| 欧美国产日韩a欧美在线观看| 夜夜嗨av一区二区三区中文字幕 | 韩国精品久久久999| 欧美国产日韩免费| 一区二区久久| 国模私拍视频一区| 国产精品久久久久久福利一牛影视| 另类成人小视频在线| 欧美一区二区在线看| 宅男噜噜噜66一区二区66| 在线观看国产精品网站| 国产精品狼人久久影院观看方式| 欧美高清视频在线播放| 久久精品国产亚洲精品| 午夜在线视频一区二区区别| 在线亚洲欧美专区二区| 亚洲国产精品久久久久婷婷老年 | 国产综合香蕉五月婷在线|