Как добавить градиент к холсту strokeStyle в javascript - PullRequest
0 голосов
/ 09 апреля 2020

Как добавить цвет градиента к холсту strokeStyle в javascript. Пожалуйста, помогите мне, мой код работает отлично, но проблема только в том, что я пытался добавить градиентный цвет к стилю обводки, но он просто нарушает мой код.

Любой, кто может помочь в этом Цвет градиента штрих-стиль
HTML

      <div class="countItem minutes">
        <canvas id="minutes-canvas" width="200" height="200"></canvas>
        <svg width="100%" height="100%">
            <circle id="outer" cx="50%" cy="50%" r="45%" fill="transparent" stroke-width="1%" stroke="#fff" />
        </svg>
        <h3>
            <span id="minutes-value"></span><br>
            <small>minutes</small>
        </h3>
    </div>

JAVASCRIPT

// Set Launch Date (ms)
const launchDate = new Date("May 7, 2020 00:00").getTime();

// Context object
const c = {
    context: {},
    values: {},
    times: {}
};

// Convert radians to degrees
function deg(d) {
    return (Math.PI / 180) * d - (Math.PI / 180) * 90;
}

function render() {
    c.context.minutes.clearRect(0, 0, 200, 200);
    c.context.minutes.beginPath();
    c.context.minutes.strokeStyle = "#bbee2b";
    c.context.minutes.arc(100, 100, 90, deg(0), deg(6 * (c.times.minutes - 60)));
    c.context.minutes.lineWidth = 12;
    c.context.minutes.lineCap = "round";
    c.context.minutes.stroke();

}

function init() {
    // Get 2D contexts
    c.context.minutes = document.getElementById('minutes-canvas').getContext('2d');

    // Get displayed values
    c.values.minutes = document.getElementById('minutes-value');

    setInterval(function () {
        // Get todays date and time (ms)
        const now = new Date().getTime();

        // Get distance from now to launchDate
        const distance = launchDate - now;

        // Time calculations
        c.times.minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
        c.values.minutes.innerText = c.times.minutes;

        render(); // Draw!
    }, 1000);
}

init();

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вы можете создать CanvasGradient, вызвав методы createLinearGradient или createRadialGradient вашего CanvasRenderingContext2D. После создания градиента вы добавляете цветовые остановки к нему, вызывая метод addColorStop(offset, color).

В вашем коде вы храните CanvasRenderingContext2D в c.context.minutes, поэтому вы можете сделать что-то вроде этого:

function render() {
    c.context.minutes.clearRect(0, 0, 200, 200);
    c.context.minutes.beginPath();

    const gradient = c.context.minutes.createLinearGradient(0,0, 200,200);
    gradient.addColorStop(0, 'red');
    gradient.addColorStop(.5, 'blue');
    gradient.addColorStop(1, 'green');
    c.context.minutes.strokeStyle = gradient;

    c.context.minutes.arc(100, 100, 90, deg(0), deg(6 * (c.times.minutes - 60)));
    c.context.minutes.lineWidth = 12;
    c.context.minutes.lineCap = "round";
    c.context.minutes.stroke();
}

Ссылки: https://developer.mozilla.org/en-US/docs/Web/API/CanvasGradient

1 голос
/ 09 апреля 2020

Вы можете создать градиент и назначить его штриху

var gradient = document.getElementById('minutes-canvas').getContext('2d').createLinearGradient(0, 0, 0, 170); gradient.addColorStop(0, '#05a'); gradient.addColorStop(1, '#0a5');

// Set Launch Date (ms)
const launchDate = new Date("May 7, 2020 00:00").getTime();

// Context object
const c = {
  context: {},
  values: {},
  times: {}
};

// Convert radians to degrees
function deg(d) {
  return (Math.PI / 180) * d - (Math.PI / 180) * 90;
}

function render() {
  var gradient = document.getElementById('minutes-canvas').getContext('2d').createLinearGradient(0, 0, 0, 170);
  gradient.addColorStop(0, '#05a');
  gradient.addColorStop(1, '#0a5');


  c.context.minutes.clearRect(0, 0, 200, 200);
  c.context.minutes.beginPath();
  c.context.minutes.strokeStyle = gradient;
  c.context.minutes.arc(100, 100, 90, deg(0), deg(6 * (c.times.minutes - 60)));
  c.context.minutes.lineWidth = 12;
  c.context.minutes.lineCap = "round";
  c.context.minutes.stroke();

}

function init() {
  // Get 2D contexts
  c.context.minutes = document.getElementById('minutes-canvas').getContext('2d');

  // Get displayed values
  c.values.minutes = document.getElementById('minutes-value');

  setInterval(function() {
    // Get todays date and time (ms)
    const now = new Date().getTime();

    // Get distance from now to launchDate
    const distance = launchDate - now;

    // Time calculations
    c.times.minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
    c.values.minutes.innerText = c.times.minutes;

    render(); // Draw!
  }, 1000);
}

init();
<div class="countItem minutes">
  <canvas id="minutes-canvas" width="200" height="200"></canvas>
  <svg width="100%" height="100%">
            <circle id="outer" cx="50%" cy="50%" r="45%" fill="transparent" stroke-width="1%" stroke="#fff" />
        </svg>
  <h3>
    <span id="minutes-value"></span><br>
    <small>minutes</small>
  </h3>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...