1 回答

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
問(wèn)題在于漸變填充樣式實(shí)際應(yīng)用于甜甜圈的方式。你和我最初的假設(shè)是,chart.js 將負(fù)責(zé)定位漸變并將其縮放到適當(dāng)?shù)拇笮∫蕴畛涮鹛鹑Α`?,事?shí)并非如此。相反,它使用畫(huà)布上漸變的大小和位置。
為了更好地理解,讓我們看一下其中一個(gè)漸變的代碼:
const red = "hsla(1, 73.7%, 38.8%, 1)"
const gradient = ctx.createRadialGradient(100,100,31, 100,100,70);
const innerColor = "hsla(1, 60%, 30%, 1)"
const mainColor = red
const outerColor = "hsla(1, 73.7%, 48%, 1)"
gradient.addColorStop(0, innerColor);
gradient.addColorStop(.04, innerColor);
gradient.addColorStop(.05, mainColor);
gradient.addColorStop(1, outerColor);
這將在 x=100 和 y=100 處產(chǎn)生直徑為 140 像素的漸變,如下所示:
現(xiàn)在,如果我們進(jìn)一步挖掘并假設(shè)您繪制的實(shí)際畫(huà)布的大小是 797 x 419 像素,我們可以看到問(wèn)題:
漸變完全脫離了甜甜圈的形狀!
為了解決這個(gè)問(wèn)題,漸變需要位于甜甜圈的中心,并且具有適當(dāng)?shù)拇笮∫酝耆畛渌?。有點(diǎn)像這樣:
這說(shuō)起來(lái)容易做起來(lái)難,因?yàn)樽畛跷覀儾恢喇?huà)布的確切大小,因?yàn)?Chart.js 會(huì)自動(dòng)拉伸它以填充瀏覽器窗口。
因此,我們可以采取以下解決方法:
使用 Chart.js 創(chuàng)建甜甜圈,但先不要填充它
等到 Chart.js 觸發(fā)調(diào)整大小事件以獲取畫(huà)布的實(shí)際大小
根據(jù)畫(huà)布的大小計(jì)算漸變的尺寸并將其繪制在中心
最后用漸變填充甜甜圈的背景顏色
這是一個(gè)示例(請(qǐng)以“全頁(yè)”運(yùn)行,因?yàn)槲覀冊(cè)?stackoverflow 的迷你預(yù)覽框架中沒(méi)有獲得正確的窗口大?。?/p>
const canvas = document.querySelector('.d-goal--canvas');
const ctx = canvas.getContext('2d')
const red = "hsla(1, 73.7%, 38.8%, 1)"
let gradient1;
let gradient2;
function createGradient1(ctx) {
const gradient = ctx.createRadialGradient(canvas.width / 2, canvas.height / 2, canvas.height / 4, canvas.width / 2, canvas.height / 2, canvas.height / 2);
const innerColor = "hsla(1, 60%, 30%, 1)"
const mainColor = red
const outerColor = "hsla(1, 73.7%, 48%, 1)"
gradient.addColorStop(0, innerColor);
gradient.addColorStop(.12, innerColor);
gradient.addColorStop(.121, mainColor);
gradient.addColorStop(1, outerColor);
return gradient;
}
function createGradient2(ctx) {
const gradient = ctx.createRadialGradient(canvas.width / 2, canvas.height / 2, canvas.height / 4, canvas.width / 2, canvas.height / 2, canvas.height / 2);
const innerColor = "hsla(1, 90%, 10%, 1)"
const mainColor = "hsla(1, 73.7%, 20%, 1)"
const outerColor = "transparent"
gradient.addColorStop(0, innerColor);
gradient.addColorStop(.12, innerColor);
gradient.addColorStop(.121, mainColor);
gradient.addColorStop(.99, mainColor);
gradient.addColorStop(1, outerColor);
return gradient;
}
function resized() {
gradient1 = createGradient1(ctx);
gradient2 = createGradient2(ctx);
config.data.datasets[0].backgroundColor = [gradient1, gradient2];
donut.update();
}
var config = {
type: 'doughnut',
data: {
labels: [
"Pledged",
"Missing"
],
datasets: [{
label: "Donations",
data: [420, 80],
cubicInterpolationMode: "monotone"
}]
},
options: {
onResize: resized,
legend: {
display: false
}
}
};
const donut = new Chart(ctx, config);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js"></script>
<canvas class="d-goal--canvas"></canvas>
添加回答
舉報(bào)