ProgressBar.js配置引數詳解
1,介紹
它是響應式的建立SVG元素的一個外掛。不要慌,不懂SVG也沒有關係,外掛的使用,主要是對配置引數的理解。
- 這是ProgressBar.js的網站,有動效的展示(我截的靜態的圖。。。),在如下圖所示,右擊小鉛筆,在新的頁面中開啟網頁,就可以看到小demo的全部程式碼了。
- 這是官方配置引數的文件,我會在下面的程式碼中,詳解。
- 進度條的效果,常見的就是長條形和圓形。當然也可以自定義形狀,這裡就不做討論了。
2,案例
下面的2個demo,一個是實現的長條形的,一個是圓形,因為配置引數有所不同,所以分開介紹。
2.1 長條形
<!--首先,需要引入外掛-->
<script src="https://cdn.bootcss.com/progressbar.js/1.0.1/progressbar.js"></script>
<script>
// 獲取容器節點
let container = document.querySelector('#container')
/*
* 先介紹稍微難理解的引數
* 首先,進度條的實現,要有一個準備填充的矩形作為背景被填充,還要有一個進行填充的矩形。
* 所以,兩個矩形肯定是重疊在一起的。而這些生成的矩形,就是以SVG元素的形式顯示。
* @strokeWidth 跟蹤路徑,指慢慢邊長,進行填充的那個矩形。
* @trailWidth 未填充路徑,指作為背景被填充的矩形。
* @svgStyle SVG元素(2個矩形)面積佔容器的百分比。
* */
/*
* 結論先行:一般顯示的效果,strokeWidth和trailWidth這2個的值,只需要設定strokeWidth: 1 即可。
* 原因:
* strokeWidth的值number型別,表示跟路徑的高度佔容器的百分比,
* 所以,數值為1就已經佔滿容器的高度,>1會有副作用,下面會介紹。
* trailWidth的值number型別,表示未填充路徑的高度佔容器的百分比,
* 如果不設定,預設等於strokeWidth的值,並且會被strokeWidth影響到:
* 所以它最終的值:trailWidth=(trailWidth/strokeWidth)*height(height為容器高度)
* 也就是說,strokeWidth和trailWidth的值同時設定,且不相等時,trailWidth的值可能不會如預期效果顯示。
* */
let bar = new ProgressBar.Line(container, {
strokeWidth: 1, // 跟蹤路徑的高度
easing: 'easeInOut', // 運動形式,預設是linear(勻速運動),easeInOut代表慢-快-慢,該配置項具體可以參照CSS3中transition的過渡形式
duration: 5000, // 走完整體時間(ms)
color: 'salmon', // 跟蹤路徑顏色(單詞,16進位制,rgb都可以)
trailColor: 'blue', // 未填充路徑顏色(同上)
trailWidth: 1, // 未填充路徑的高度
svgStyle: {width: '100%', height: '100%'}, // 2個路徑整體的寬高
text: { // 顯示百分比文字的樣式,最終生成放文字內容的容器是一個div
// className可以指定文字容器的class名稱,但是注意,所有在配置項style中寫的樣式都會轉為內聯樣式,
// 並且像color這種不設定,會繼承其他配置項的樣式,也會設定為內聯樣式。
className: 'text-color',
// 百分比文字的樣式
style: {
color: 'green', // 不設定的話,繼承跟蹤路徑顏色
position: 'absolute',
textAlign: 'right',
top: '0',
padding: 0,
margin: 0,
// 如果要設定transform,直接設定,親測好像不行,只能按照官網給出的寫法。
transform: {
prefix: true, // 自動加瀏覽器字首
value: 'translate(-100%, 70%)'
}
},
// 一旦上面的style選項中寫了樣式,則自動會給容器新增position: relative;
//(我覺得主要考慮的是文字的位置,一般在設定時,使用定位更方便一點,所以才會自動新增),
// 可以通過設定下面這個屬性為false,禁止自動給容器新增。
autoStyleContainer: false,
},
// 下面三個配置項是配合使用的。
// from指定進度條(根據上面所列配置項指定)開始的樣式,to指定結束的樣式。樣式的變化自動會有過渡效果。
// 這個demo中,只展示了顏色的變化,可以同時指定多個樣式,比如還可以指定width的漸變等等。
// step,第一個引數代表的就是管理from和to中樣式的狀態物件,根據state.color應該就很好理解了。
// 第二個引數,就是例項物件(JavaScript程式碼最頂部生成的那個)
from: {color: '#FFEA82'},
to: {color: '#ED6A5A'},
step: (state, bar) => {
// 下面的bar.xxx都是在官網中介紹有案例使用的屬性。
// 設定跟蹤路徑顏色變化,顏色會根據from 和to 的漸變
bar.path.setAttribute('stroke', state.color);
// 設定百分比文字可以隨著,跟隨路徑的不斷填充而實時變化。
// bar.setText(Math.round(bar.value() * 100) + ' %');
// 我為了實現當進度條走到一定距離時,在顯示文字,所以加了一個判斷
let value = Math.round(bar.value() * 100);
if (value <= 5) {
bar.setText('');
} else {
bar.setText(value+'%');
}
// 下面這個設定,主要是想實現文字的位置隨著進度條的增長,跟著變化。
bar.text.style.left = Math.round(bar.value() * 100) + '%';
}
});
// animate方法,用來啟動進度條動畫。
// 第一個引數 0.0 ~ 1.0 指定動畫結束的百分比,一般都為1,進度條就會跑完整個矩形。
// 第二個引數,配置項(這裡沒有寫,感覺有點多餘),如果配置的話,會重寫上面的配置項,
// 比如{duration: 4000} 會重寫上面的duration。
// 第三個引數,回撥函式,在動畫執行完成之後執行,也就是進度條走完。這裡放一些處理邏輯。
bar.animate(1, function () {
console.log('動畫結束,萌萌噠')
});
</script>
複製程式碼
以上就是長條形的實現。程式碼親測可行。
2.2 圓形
html
程式碼,就一個div
作為容器
<div id="container"></div>
複製程式碼
css
程式碼,設定margin
是為了進度條的開始部分不在頁面邊緣,為了顯示效果更好。設定position
為相對定位,是因為顯示進度條的百分比提示文字,預設會絕對定位!
#container {
margin: 20px;
width: 100px;
height: 100px;
position: relative;
}
複製程式碼
JavaScript
程式碼,各個配置引數,會在註釋中,詳細說明。這是官方配置引數的文件
<script src="https://cdn.bootcss.com/progressbar.js/1.0.1/progressbar.js"></script>
<script>
let container = document.querySelector('#container')
var bar = new ProgressBar.Circle(container, {
color: 'salmon',
strokeWidth: 50, // 正好是從圓心開始畫起,>50會越過圓心,<50畫出的是圓環
trailWidth: 50, // 也設定為50,就是一個未填充的圓形,而不是圓環。要麼設定為0
easing: 'easeInOut',
duration: 5000,
text: {
style: {
color: 'yellow',
display: 'inline-block',
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%,-50%)'
},
autoStyleContainer: false
},
// fill: 'salmon', // 圓形內容區域填充色,當需要畫圓環時,效果應該最好。
from: { color: '#aaa'},
to: { color: '#333'},
step: function(state, circle) {
circle.path.setAttribute('stroke', state.color);
var value = Math.round(circle.value() * 100);
circle.setText(value+'%');
}
});
bar.text.style.fontFamily = '"Raleway", Helvetica, sans-serif';
bar.text.style.fontSize = '2rem';
bar.animate(1.0, function () {
console.log('動畫執行結束')
});
</script>
複製程式碼
- 這個是width的漸變效果
strokeWidth: 5,
trailWidth: 0,
fill: 'salmon', // 圓形內容區域填充色
from: { color: '#aaa', width: 1},
to: { color: '#333', width: 5},
circle.path.setAttribute('stroke-width', state.width);
複製程式碼