Lecaw

Учимся создавать Web-сайты

Радиальный HTML градиент

October 18, 2012 502hits

Как-то раз, один из наших читателей спросил меня – а что если сгенерировать радиальный html градиент вместо того, чтобы использовать готовые изображения. Это не так трудно и это было бы полезно для всех. Основная идея состоит в том, чтобы разделить круг на многократные секторы и заполнить эти секторы радиальным цветом (который зависит от угла).

Исходные файлы ДЕМО

 

Шаг 1. HTML градиент

Как обычно (для всех демонстрационных примеров, основанных на canvas) у нас есть простая HTML структура (с единственным объектом canvas):

<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="utf-8" />
<meta name="author" content="Script Tutorials" />
<title>HTML5 Radial Gradient | Script Tutorials</title> <!-- добавление стилей -->
<link href="/css/main.css" rel="stylesheet" type="text/css" /> <!-- добавление сценариев -->
<script src="/js/script.js"></script>
</head>
<body>
<div class="container">
<canvas id="gradient" width="500" height="500" tabindex="1"></canvas>
</div>
</body>
</html>

Шаг 2. JS

Теперь, создайте пустой файл 'script.js' (в папке 'js') и вставьте этот код (это весь JS код нашего Радиального HTML Градиента).

js/script.js

// получение угловой функции
function getAngleColor(angle) {
    var color, d;
    if (angle < Math.PI * 2 / 5) { // angle: 0-72
        d = 255 / (Math.PI * 2 / 5) * angle;
        color = '255,' + Math.round(d) + ',0'; // color: 255,0,0 - 255,255,0
    } else if (angle < Math.PI * 4 / 5) { // angle: 72-144
        d = 255 / (Math.PI * 2 / 5) * (angle - Math.PI * 2 / 5);
        color = (255 - Math.round(d)) + ',255,0'; // color: 255,255,0 - 0,255,0
    } else if (angle < Math.PI * 6 / 5) { // angle: 144-216
        d = 255 / (Math.PI * 2 / 5) * (angle - Math.PI * 4 / 5);
        color = '0,255,' + Math.round(d); // color: 0,255,0 - 0,255,255
    } else if (angle < Math.PI * 8 / 5) { // angle: 216-288
        d = 255 / (Math.PI * 2 / 5) * (angle - Math.PI * 6 / 5);
        color = '0,'+(255 - Math.round(d)) + ',255'; // color: 0,255,255 - 0,0,255
    } else { // angle: 288-360
        d = 255 / (Math.PI * 2 / 5) * (angle - Math.PI * 8 / 5);
        color = Math.round(d) + ',0,' + (255 - Math.round(d)) ; // color: 0,0,255 - 255,0,0
    }
    return color;
}
// внутренние переменные
var iSectors = 360;
var iSectorAngle = (360 / iSectors) / 180 * Math.PI; // в радианах
// функция градиента
function drawGradient() {
    // подготовка canvas 
    var canvas = document.getElementById('gradient');
    var ctx = canvas.getContext('2d');
    // очистка canvas
    ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
    // сохранение текущего контекста
    ctx.save();
    // перемещение в центр
    ctx.translate(canvas.width / 2, canvas.height / 2);
    // все селекторы
    for (var i = 0; i < iSectors; i++) {
        // начало и конец угла (в радианах)
        var startAngle = 0;
        var endAngle = startAngle + iSectorAngle;
        // радиус сектора
        var radius = (canvas.width / 2) - 1;
        // получение цвета угла
        var color = getAngleColor(iSectorAngle * i);
        // сектор
        ctx.beginPath();
        ctx.moveTo(0, 0);
        ctx.arc(0, 0, radius, startAngle, endAngle, false);
        ctx.closePath();
        
        ctx.strokeStyle = 'rgb('+color+')';
        ctx.stroke();
        // заливка сектора
        ctx.fillStyle = 'rgb('+color+')';
        ctx.fill();
        // вращение к следующему сектору
        ctx.rotate(iSectorAngle);
    }
    // восстановление контекста
    ctx.restore();
}
// инициализация
if(window.attachEvent) {
    window.attachEvent('onload', drawGradient);
} else {
    if(window.onload) {
        var curronload = window.onload;
        var newonload = function() {
            curronload();
            drawGradient();
        };
        window.onload = newonload;
    } else {
        window.onload = drawGradient;
    }
}

Как только наше окно загрузилось (событие onload), мы запускаем радиальный html градиент (функция drawGradient). Вначале мы подготавливаем canvas и объекты контекста, далее, мы переходим к разделению целого круга (360 градусов) на сектора (я решил использовать 360 секторов для более гладкого градиента). Чтобы использовать каждый сектор, мы должны переместить его к центру, повернуть к соседнему сектору и заполнить эту область (сектор) определенным цветом. Чтобы сгенерировать радиальный цвет, мы должны возвратить определенный цвет в зависимости от угла. Для этой цели я определил функцию 'getAngleColor'. Как только мы загрузили сектор – мы загружаем следующий сектор.

Исходные файлы ДЕМО

 

Дополнительная информация

Влерий Аликин - веб-разработчик & дизайнер. Соучредитель и член команды Lecaw.

Эл. почта
RATTING:
(1 Голосовать)

Оставить комментарий