应用 CSS Paint API 动态性建立与辨别率不相干的可

日期:2021-03-23 类型:科技新闻 

关键词:凡科自助建站,企业网站怎么建设,智能建站系统,自己建个网站,搭建网站基本步骤

来源于:https://medium.com/better-programming,创作者:Ferenc Almasi

当代Web运用对图象的要求量非常大,他们占有互联网免费下载的大部分分字节数。根据提升他们,你可以以更强地利人和用他们的特性。假如你恰巧应用几何图形图型做为情况图象,有一个取代计划方案:你可以令其用 CSS Paint API [1] 以程序编写方法转化成情况。

在本实例教程中,大家将讨论其作用,并讨论怎样应用它来动态性建立与辨别率不相干的动态性情况。这将是本实例教程的輸出:

参照阅读文章:CSS届的制图板CSS Paint API介绍

设定新项目

最先,建立一个新的 index.html 文档,并撰写以下编码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>:art: CSS Paint API</title>
    <link rel="stylesheet" href="styles.css" />
  </head>
  <body>
    <textarea class="pattern"></textarea>
    <script>
      if ('paintWorklet' in CSS) {
        CSS.paintWorklet.addModule('pattern.js');
      }
    </script>
  </body>
</html>

有几个事要留意:

  • 在第一3行,大家载入了一个新的Paint worklet。现阶段,全世界适用率约为63%。因而,大家务必最先查验是不是适用 paintWorklet
  • 我已经应用 textarea 开展演试,因而大家能看到调节画布的尺寸将怎样重制图案。
  • 最终,你必须建立一个 pattern.js (用以申请注册美术绘画工作中区)及其一个 styles.css ,大家能够在这其中界定好多个款式。

什么叫worklet?

Paint worklet是一个界定了应当画在画布上的內容的类。他们的工作中基本原理与 canvas 原素相近。假如你之前有这些方面的专业知识,编码会看上去很了解。但是,他们其实不是100%同样的。比如,在worklet中还不兼容文字3D渲染方式。

在这里里,大家也要界定CSS款式。它是大家要应用worklet的地区:

.pattern {
  width: 250px;
  height: 250px;
  border: 1px solid #000;

  background-image: paint(pattern);
}

我加上了一个灰黑色的外框,那样大家能够更强地见到 textarea 。要引入一个paint worklet,你必须把 paint(worklet-name) 做为一个值传送给 background-image 特性。可是 pattern 是以哪儿来的呢?大家还没有有界定它,因此要我们把它做为大家的下一步。

界定Worklet

开启 pattern.js 并加上下列內容:

class Pattern {
  paint(context, canvas, properties) {

  }
}

registerPaint('pattern', Pattern);

在这里里可使用 registerPaint 方式申请注册 paintWorklet 。你可以以在这里界定的CSS中引入第一个主要参数。第二个主要参数是界定应在canvas上美术绘画的类。它具备一个包括三个主要参数的 paint 方式:

context
PaintRenderingContext2D
CanvasRenderingContext2D API

canvas :它是大家的canvas,一个 PaintSize 目标,仅有2个特性:width和height。

properties :这将回到一个 StylePropertyMapReadOnly 目标,大家可使用该目标根据JavaScript载入CSS特性以及值。

绘图矩形框

下一步是显示信息一些物品,因此要我们绘图矩形框。将下列內容加上到 paint 方式中:

paint(context, canvas, properties) {
  for (let x = 0; x < canvas.height / 20; x++) {
    for (let y = 0; y < canvas.width / 20; y++) {
      const bgColor = (x + y) % 2 === 0 ? '#FFF' : '#FFCC00';

      context.shadowColor = '#212121';
      context.shadowBlur = 10;
      context.shadowOffsetX = 10;
      context.shadowOffsetY = 1;

      context.beginPath();
      context.fillStyle = bgColor;
      context.rect(x * 20, y * 20, 20, 20);
      context.fill();
    }
  }
}

大家在这里里所做的便是建立一个嵌套循环循环系统,以循环系统解析xml画布的总宽和高宽比。因为矩形框的尺寸为20,因而大家要将矩形框的高宽比和总宽除以20。

在第四行,大家可使用模数计算符在二种色调中间转换。我都为深层加上了一些黑影。最终,大家在画布上绘图矩形框。假如在访问器中开启它,则应具备下列內容:

使情况动态性化

缺憾的是,除开调节 textarea 的尺寸和一窥Paint API是怎样重绘一切的,这大部分分還是静态数据的。因此,要我们根据加上大家能够更改的自定CSS特性来让事儿越来越更为动态性。

开启你的 styles.css 并在这其中加上下列几行:

.pattern {
     width: 250px;
     height: 250px;
     border: 1px solid #000;

     background-image: paint(pattern);
+    --pattern-color: #FFCC00;
+    --pattern-size: 23;
+    --pattern-spacing: 0;
+    --pattern-shadow-blur: 10;
+    --pattern-shadow-x: 10;
+    --pattern-shadow-y: 1;
 }

你可以以根据在CSS特性前面上 而定义自定CSS特性。这种特性能够被 var() 涵数应用。但在大家的实例中,大家将在大家的paint worklet中应用它。

在CSS中查验适用

为保证适用Paint API,大家还能够查验CSS中的适用。因此,大家有2个挑选:

  • 应用 @supports 标准守卫标准。
  • 应用储备情况照片。
/* 第一种挑选 */
@supports (background: paint(pattern)) {
  /**
   * 假如该一部分获得评定,则寓意着Paint API 适用
   **/
}

/**
 * 第二种挑选
 * 假如适用Paint API,后一条标准将遮盖第一条标准。
 * 假如不兼容,CSS将使其失效,并将运用url()的标准。
 **/
.pattern {
  background-image: url(pattern.png);
  background-image: paint(pattern);
}

浏览美术绘画worklet中的主要参数

要载入 pattern.js 中的这种主要参数,您必须向界定paint worklet的类中加上一个新方式:

class Pattern {
  // `inputProperties`方式回到的一切物品,paint worklet都可以以浏览。
  static get inputProperties() {
    return [
      '--pattern-color',
      '--pattern-size',
      '--pattern-spacing',
      '--pattern-shadow-blur',
      '--pattern-shadow-x',
      '--pattern-shadow-y'
    ];
  }
}

要在 paint 方式內部浏览这种特性,可使用 properties.get

paint(context, canvas, properties) {
  const props = {
    color: properties.get('--pattern-color').toString().trim(),
    size: parseInt(properties.get('--pattern-size').toString()),
    spacing: parseInt(properties.get('--pattern-spacing').toString()),
    shadow: {
      blur: parseInt(properties.get('--pattern-shadow-blur').toString()),
      x: parseInt(properties.get('--pattern-shadow-x').toString()),
      y: parseInt(properties.get('--pattern-shadow-y').toString())
    }
  };
}

针对色调,大家必须将其变换为标识符串。别的全部內容都必须变换为数据。它是由于 properties.get 回到 CSSUnparsedValue

properties.get的回到值

以便使內容更具有易读性,我建立了2个新涵数来为大家解决分析:

paint(context, canvas, properties) {
  const getPropertyAsString = property => properties.get(property).toString().trim();
  const getPropertyAsNumber = property => parseInt(properties.get(property).toString());

  const props = {
    color: getPropertyAsString('--pattern-color'),
    size: getPropertyAsNumber('--pattern-size'),
    spacing: getPropertyAsNumber('--pattern-spacing'),
    shadow: {
      blur: getPropertyAsNumber('--pattern-shadow-blur'),
      x: getPropertyAsNumber('--pattern-shadow-x'),
      y: getPropertyAsNumber('--pattern-shadow-y')
    }
  };
}

如今大家要做的便是用相对的 prop 值更换for循环系统中的全部內容:

for (let x = 0; x < canvas.height / props.size; x++) {
  for (let y = 0; y < canvas.width / props.size; y++) {
    const bgColor = (x + y) % 2 === 0 ? '#FFF' : props.color;

    context.shadowColor = '#212121';
    context.shadowBlur = props.shadow.blur;
    context.shadowOffsetX = props.shadow.x;
    context.shadowOffsetY = props.shadow.y;

    context.beginPath();
    context.fillStyle = bgColor;
    context.rect(x * (props.size + props.spacing),
                 y * (props.size + props.spacing), props.size, props.size);
    context.fill();
  }
}

如今返回你的访问器,尝试更改一下。

在DevTools中编写情况 小结

为何CSS Paint API一件事们有效?有什么测试用例?

最显著的是,它减少了响应的尺寸。根据清除图象的应用,你可以以节约一个互联网恳求和好几千字节数。那样能够提升特性。

针对应用DOM原素的繁杂CSS实际效果,你要能够降低网页页面上的连接点总数。由于你可以以用Paint API建立繁杂的动漫,因此不用附加的空连接点。

我认为,较大的益处是它的可订制性远超静态数据情况照片。API还能够建立与辨别率不相干的图象,因此你没用担忧错过了单一显示屏规格。

假如你今日挑选应用CSS Paint API,请保证你出示polyfill,由于它依然沒有被普遍选用。假如你要调节进行的新项目,你可以以从这一 GitHub库房 [2] 中复制它。

绿皮书宣布版 :历经前2个版本号的累积和经历三年的全方位重新写过,这部书总算达到技术性分析和客户感受的极致切合。

广佛造就宏篇 :论深,这书细究JS往往然,世无没法出其右;论广,这书解析xml词义之细部,看罢再无机物理之惑。

超語言之观念 :万法归宗如出一辙,剥去JS机壳,这书高居处分析語言奥义的技术性大局意识观,可用于全部程序编写語言。

修练关键在于重学 :混和App|Node服务端|FaaS云原生态|前端开发智能化化时期,重归实质重修这门基本课才可以走得更长远迅速。

参照材料 [1]

CSS Paint API: https://developer.mozilla.org/en-US/docs/Web/API/CSS_Painting_API

[2]   

GitHub库房: https://github.com/flowforfrank/css-paint

到此这篇有关应用 CSS Paint API 动态性建立与辨别率不相干的可变性情况实际效果的文章内容就详细介绍到这了,大量有关CSS Paint API 可变性情况內容请检索脚本制作之家之前的文章内容或再次访问下边的有关文章内容,期待大伙儿之后多多的适用脚本制作之家!