【dart-skeleton,脚本篇】自动生成骨架屏项目

简介: 【dart-skeleton,脚本篇】自动生成骨架屏项目

前言:


承接上篇【dart-skeleton】自动生成骨架屏项目内容,这一篇主要来说一下第一块内容脚本篇,也是我们整个项目的关键部分。


解析入口参数:


  1. 下图中的opts数组就是需要传入脚本的内容,参数主要涉及类型三种,通过的string类型,function类型,object类型,这里面将对象类型的数据进行序列化成字符串,将函数类型的数据也转换为字符串进行传递。

1.png

  1. 在接收到数据后进行解析的时候,因为函数已字符串的形式进行传递,我们这块就使用eval进行包装,由于各种编译场景均不太允许直接使用eval函数,所以我们进行了重新赋值的处理,编程了_eval。对象类型进行反序列化为对象,字符串则直接接受即可。

2.png


排除无效/干扰元素:


由于页面各式各样,不合理的布局将会造成解析的结果非常糟糕,我们可以通过指定元素选项来进行过滤,由于页面也会存在一些被隐藏或透明的元素我们也将跳过。


需要隐藏的类型包括:
  1. display属性为none的节点;
  2. visibility属性为hidden的节点;
  3. opacity属性为0的节点。

需要跳过的元素的处理:

我们在入口参数提供了一个includeElement函数,这个函数可以接收一个dom节点和一个绘制函数,当接收到dom节点后通过对选项进行筛选反返回为false即可跳过对应元素。

const isCustomSkip = typeof this.includeElement === "function" && this.includeElement(node, this.drawBlock) == false;
复制代码


绘制关键元素:



说了不需要绘制的元素,那么需要绘制的元素都包括什么呢?如下列举:
  1. 当元素设置了background-image属性时,如果解析到内容包含url地址则需要绘制;
  2. 当遍历到该元素的子元素包含文本类型的节点且节点内容不为空时需要绘制;
  3. 遍历当前的元素为文本类型且节点内容不为空时需要绘制;
  4. 当元素在我们的预设列表中存在时需要绘制。


注:

  1. 以上条件满足一项即需要绘制。
  2. 当我们设置需要绘制头部的时候,如果头部的高度会遮挡一部分元素,那么这部分元素可跳过不绘制。

这里贴出关键的绘制函数:
drawBlock({
    width,
    height,
    top,
    left,
    zIndex = 999,
    background = this.background,
    radius,
    subClas = false,
  }: DrawBlock) {
    const styles = [`height:${height}%`];
    if (!subClas) {
      styles.push(`top:${top}%`, `left:${left}%`, `width:${width}%`);
    }
    if (classProps.zIndex !== zIndex) {
      styles.push(`z-index:${zIndex}`);
    }
    if (classProps.background !== background) {
      styles.push(`background:${background}`);
    }
    radius && radius != "0px" && styles.push(`border-radius:${radius}`);
    this.blocks.push(
      `<div class="_${subClas ? " __" : ""}" style="${styles.join(";")}"></div>`
    );
}
复制代码


预览绘制效果:


这一块相对简单很多,就是一个dom操作将我们处理得到的字符串拆入到目标页面的body节点中:

const { body } = document;
const blocksHTML = this.blocks.join("");
const div = document.createElement("div");
div.innerHTML = blocksHTML;
body.appendChild(div);
复制代码


说明: 此项目是在dps项目的基础上重写的一个Ts版本,目的是学习思路方便后续改造。



相关文章
|
8天前
|
移动开发 JavaScript 小程序
uView Skeleton 骨架屏
uView Skeleton 骨架屏
42 0
|
编解码 程序员 atlas
Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
图集只是当所有给低昂的纹理需要相同的着色器时采用的一种方法,如果一些纹理需要通过着色器应用独立的图形效果,它们就必须分离到自己的材质中,并在单独的组中打图集。
1457 0
Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
|
5月前
|
人工智能 JavaScript Linux
基于Three.js的3D自动纹理化开发包
DreamTexture.js 基于 Three.js 和稳定扩散(stable diffusion) AI 模型开发,用于实现 3D 模型的自动纹理化。
60 0
|
11月前
|
人工智能 API 图形学
unity基础脚本代码总结
unity基础脚本代码总结
144 0
|
Dart IDE 开发工具
Flutter工程解析(如何运行写初始化一个Dart文件)
解析 — Flutter工程解析(如何运行写初始化一个Dart文件) 这是一节小白必看的解析哦~,如果你了解过一点Flutter的写法可以跳过这节.
Flutter工程解析(如何运行写初始化一个Dart文件)
|
数据可视化 vr&ar 图形学
Unity可视化编程XDreamer插件导入
前言 XDreamer是一款基于Unity平台开发的,可在Unity(包括编辑器与运行时)中使用的可扩展的中文交互编辑软件,可进行2D、3D、VR、AR、MR开发。 本期博客为XDreamer的官方讲解的学习记录。可以理解为UE4中的蓝图效果。是从事美术人员的福音,美术人员也可不用编写程序进行游戏的制作。 一、下载XDreamer官方插件包 XDreamer中文交互编辑器http://www.xdreamer.com.cn/请在官网进行下载,得到如下的文件。 二、插件加载 目前我导入到URP
450 0
Unity可视化编程XDreamer插件导入
|
数据采集 资源调度 JavaScript
【dart-skeleton】自动生成骨架屏项目
【dart-skeleton】自动生成骨架屏项目
332 0
【dart-skeleton】自动生成骨架屏项目
|
数据采集 JavaScript
【dart-skeleton,逻辑篇】自动生成骨架屏项目
【dart-skeleton,逻辑篇】自动生成骨架屏项目
185 0
|
存储 Linux Windows
OpenGL基础代码总结
OpenGL基础代码总结
262 0
OpenGL基础代码总结
|
图形学 Android开发
Unity粒子特效系列-龙卷风预制体做好了,unitypackage包直接用!
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1971 1

热门文章

最新文章