Рубрики
Без рубрики

CSS Paint API – Новый и глянцевый, но что это за?

Посмотрите на потенциал CSS Paint API.

Автор оригинала: Brett Jephson.

Фото Рондака родной Флок Флоклонский художник на Unsplash

Вы когда-нибудь хотели по-настоящему углубиться в то, что делает CSS? Вы когда-нибудь хотели настроить, как браузер оказывает фоном или маске-образ? Вероятно, нет, но есть веские причины, по которым вы можете захотеть.

CSS Paint API будет доступен в предстоящем выпуске Chrome 65 [1] Отказ Это первый пример спецификации, разработанного CSS-Tag Houdini Целевая группа появляясь в производственной версии основного браузера.

В этой статье я надеюсь дать краткий обзор того, что такое CSS Paint API, как мы можем использовать его, и какие проблемы он предназначен для решения.

CSS Houdini Group

CSS Houdini Group дала себе интересную цель – открыть замкнутую коробку, которая является стилей и макетом в Интернете. Другими словами, чтобы раскрыть трюки за магией, который является рендерингом браузера.

CSS Paint API является одним из нескольких API, которые они развиваются. Некоторые по-прежнему по-прежнему черновики, некоторые едва и идеи, но все они относятся к разным частям конвейера рендеринга браузера ( Houdini Specs ).

CSS Paint API

В специфицированном виде на API CSS Paint API, у нас теперь есть контекст 2D-рендеринга, который мы можем программно покрасить с JavaScript и применять к любому свойству CSS, которое принимает изображение в качестве значения, то есть фоновое изображение, пограничное изображение, маска-изображение.

Чтобы создать этот контекст рендеринга, мы создаем рабочую точку краски. Рабочая точка аналогична работнику, в котором он работает параллельно главной нити, но он имеет очень ограниченный функционал для дальнейшей оптимизации.

Давайте посмотрим, как это работает на практике.

Анатомия краской

У самой простой простейшей рабочей подлеткой краски является классом с одним методом – действие выполнится рабочая таблица. В случае CSS Paint API, единственное действие – это краску.

Так, например, чтобы нарисовать красный фон наполнить элемент, у нас будет файл краски-красного файла.

/**
 * The Paint Worklet is a simple class that must provide a paint method. 
 * This is the action the worklet does.
 **/
class RedFillPaintWorklet {
    /**
     * @param ctx - 2D Rendering Context
     * @pararm geom - dimensions (width, height) of the element
     **/
  paint(ctx, geom) {
    	// We can draw the context using most of the Canvas context apis
        // e.g. fill, stroke, rect, arc, etc.
        ctx.fillStyle = 'red';
        ctx.fillRect(0, 0, geom.width, geom.height);
    }
}
// We then register the paint worklet. This makes it available in CSS.
registerPaint('red-fill', RedFillPaintWorklet);

2D-контекст рендеринга очень похож на CanvasrenderingContext2D , хотя это упрощенная версия этого API. Согласно Спец , Это означает, что нет Canvashitregion, canvasimagedata, canvasuserinterface, canvastext или canvastextdrawingstyles apis. Другими словами, нет текста, нет зоны попадания или прямоугольника фокусировки, а не управление PER-PIXEL.

Чтобы использовать рабочую табличку, мы загружаем его и используем Краска Функция в нашей таблице стилей:


Приведенный выше пример очень прост. Он просто заполняет полные размеры элемента с твердым красным прямоугольником. Это эквивалентно: Фон: красный; Отказ

А также 2D-контекст рендеринга и размеры элемента, вы можете пройти еще несколько аргументов функции краски.

class FillPaintWorklet {
  // Register input properties to make them available to the paint method.
  static get inputProperties() { return ['--fill-colour']; }
  paint(ctx, geom, properties) {
    	const colour = properties.get('--fill-colour');
        ctx.fillStyle = colour;
        ctx.fillRect(0, 0, geom.width, geom.height);
    }
}

registerPaint('colour-fill', ColourFillPaintWorklet);

Интересно, что у вас есть контекст холста, который вы можете нарисовать любые 2D-изображения, в котором вы хотите, именно интегрировано с CSS.

Например, у вас может быть одна рабочая подставка для краски и изменение переменных CSS, чтобы отрегулировать ее. Вы также можете использовать несколько рабочих элементов краски и несколько фоновых изображений для создания чего-то более сложного. Мы можем использовать предыдущую рабочую поддоном краски несколькими способами:

 

Сценарии использования

Taskforce Houdini предложил несколько случаев использования для своих API, в том числе:

  • CSS Polyfills.
  • Режущий край/эксперименты.
  • Повышение производительности и упрощение DOM.

Примеры

Уже есть несколько действительно хороших примеров в сети того, что CSS Paint API может и сможет сделать.

  • Конический градиент Polyfill – Хороший пример того, где API может заменить JavaScript Polyfills неподдерживаемых функций CSS. Показав главной поток, производительность должна быть значительно улучшена.

  • Пульсация кнопки – хороший пример упрощения DOM. Там, где этот эффект обычно создается с элементами DOM Mutliple или, по меньшей мере, некоторых псевдоэлементов, эффект теперь может быть достигнут в одном элементе DOM и, снова отображаемый в рабочей таблице и от основной нити.

  • Кнопка PARALLAX – аналогична эффекту кнопки пульсации, используя некоторые простые эффекты холста и интеграцию их с переменными CSS для взаимодействия пользователя, мы можем создать некоторые интересные эффекты в одном элементе DOM.

class ParallaxPainter {
    static get inputProperties() { return ['--x-position']; }

    constructor() {
        this.layers = [
            {x: -0.1, y: 0.5, size: 0.3, speed: 0.15, colour: '#838C8D'},
            {x: 0.1, y: 0.5, size: 0.25, speed: 0.20, colour: '#9EA5A7'},
            {x: 0.8, y: 0.5, size: 0.3, speed: 0.15, colour: '#838C8D'},
            {x: 0.1, y: 1.0, size: 0.6, speed: 0.95, colour: '#DEE1E3'}
        ];
    }

    paint(ctx, geom, properties) {
        const gradient = ctx.createLinearGradient(0, 0, 0, geom.height);
        gradient.addColorStop(0, '#444B4D');
        gradient.addColorStop(0.5, '#545B5D');
        gradient.addColorStop(0.501, '#838C8D');
        gradient.addColorStop(0.75, 'white');

        ctx.fillStyle = gradient;
        ctx.fillRect(0, 0, geom.width, geom.height);

        const xPosition = parseInt(properties.get('--x-position').toString());
        this.layers.forEach(item => this.drawMountain(ctx, geom, xPosition, item));
    }

    drawMountain(ctx, geom, xPosition, {x, y, size, speed, colour}) {
        const xModifier = xPosition * speed;
        x = x * geom.width;
        y = y * geom.height;
        size = size * geom.width;

        ctx.fillStyle = colour;
        ctx.beginPath();
        ctx.moveTo(x + xModifier, y - size);
        ctx.lineTo(x + xModifier + size, y);
        ctx.lineTo(x + xModifier - size, y);
        ctx.lineTo(x + xModifier, y - size);
        ctx.closePath();
        ctx.fill();
    }
}

registerPaint('parallax-paint', ParallaxPainter);

Этот эффект параллакса может использоваться с кнопкой и параллаксом, управляемым из движения мыши, обновляя --x-Position Переменная.

 
    
    

И вот конечный результат:

parallax.gif.gif.

Ограничения

По мере того, как эта статья о потенциале API, которая не совсем достигла производства в одном крупном браузере, вы можете представить, что поддержка браузера ограничена.

Вы можете следить за прогрессом поддержки браузера для API CSS Paint API и остальной части семейства API Houdini в HTTPS://ishoudinireadyyet.com/.

Команда Chrome определенно, кажется, ведет путь, но какое-то развитие происходит в Firefox, и есть намерение от Safari, Chrome и Firefox для разработки нескольких API, в том числе: CSS набрал OM , Макет API и Анимационные рабочие места Отказ

Свойства CSS и значения API будет действительно дополнить и улучшать API CSS Paint. Это позволит набрать напечатанные аргументы (изображение, цвет, длину и т. Д.), которые будут переданы функции краски, что означает, что можно сделать намного больше.

Заключение

CSS Paint API находится в первые дни. Чем больше мы видим увеличение поддержки браузера, и тем более другие спецификации Houdini начинают появляться в современных браузерах, тем больше мы увидим потенциал этих API для ускорения разработки CSS и улучшения производительности CSS, и чем больше будет больше доступа и управлять по трубопроводом рендеринга браузера для экспериментальных и творческих целей.

Это начало захватывающего путешествия для тех, кто заинтересован в том, как браузеры оказывают веб-страницы, которые они разрабатывают и разрабатывают.

дальнейшее чтение

  1. В то время была написана статья, в середине февраля 2018 года Chrome 65 был в бета-версии и должен выйти в марте. ↩︎.