Checkboxland
将任何内容渲染为 HTML 复选框
示例演示
社区示例:
(如果你有示例想要分享,请创建一个文档 PR并添加到上面的列表中)
概览
Checkboxland 是一个用于将任何内容渲染为 HTML 复选框的 JavaScript 库。
你可以用它来展示动画、文字、图片、视频以及任意数据。它还支持插件,因此你可以添加自己的 API。
Checkboxland 无依赖、框架无关,而且很有趣!🙃
为什么这个项目会存在?这里有相关背景介绍。
局限性
网页上存在大量元素可能会影响运行时性能。复选框也不例外。Checkboxland 试图缓解其中一些问题,但如果你显示大型网格(1500+ 复选框)并尝试快速更新它们,仍可能会遇到性能问题。
为获得最佳效果,请将复选框数量保持在 1500 个以下。一些推荐的尺寸包括 32x32、48x24 和 64x16。
安装配置
通过 npm 安装此包:
npm install checkboxland
将其导入你的应用程序,并创建一个复选框网格:
import { Checkboxland } from 'checkboxland';
// 在 #my-container 内创建一个 16x16 的复选框网格
const cbl = new Checkboxland({
dimensions: '16x16',
selector: '#my-container'
});
Checkboxland 类接受以下几个参数:
dimensions(字符串):以 '{宽度}x{高度}' 格式表示复选框网格尺寸的字符串。默认值:'8x8'。selector(字符串 | Element):指向 Checkboxland 渲染复选框网格的容器元素的选择器。也可以直接传入一个 Element 或 HTMLElement。默认值:'#checkboxland'。fillValue(数字):预填充网格的复选框类型。默认值:0(未选中)。
注意:如果你确实想通过 <script> 标签加载 Checkboxland,可以考虑使用内联 ES6 模块,如下所示:
<script type="module">
import { Checkboxland } from 'https://unpkg.com/checkboxland?module';
window.Checkboxland = Checkboxland;
</script>
一个例子
让我们在复选框网格上展示一颗爱心:
import { Checkboxland } from 'checkboxland';
const cbl = new Checkboxland({
dimensions: '8x7',
selector: '#my-container'
});
// 创建爱心的数据表示
const heart = [
[0,1,1,0,0,1,1,0],
[1,0,0,1,1,0,0,1],
[1,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,1],
[0,1,0,0,0,0,1,0],
[0,0,1,0,0,1,0,0],
[0,0,0,1,1,0,0,0],
];
// 使用我们提供的数据更新网格
cbl.setData(heart);
(注意:你可以在 Codepen上尝试这个示例,然后 Fork 它来创建你自己的演示)

发生了什么?
我们创建了一个 JavaScript 矩阵(数组的数组)来表示网格。矩阵中的每个位置代表一个复选框,其中:
- 0 =
(未选中) - 1 =
(选中) - 2 =
(不确定)
通过将这个矩阵传递给 setData() 方法,我们可以更新页面上的复选框网格。
更多 Checkboxland 示例
- 用 Checkboxland 画爱心(Codepen)
- 在 React 中集成 Checkboxland(Stackblitz)
- Checkboxland 演示(Github 源码)
- DOOM via Checkboxes(Github 源码)
更多关于复选框网格交互方式的内容,请参见下面的 API 方法。
底层 API
底层 API 允许你使用原始数据更新复选框网格。
getCheckboxValue
获取复选框网格中单个复选框的值。
需要一个 (x, y) 坐标来指定复选框的位置。
注意:网格左上角为坐标原点 (0,0)。
.getCheckboxValue(x, y)
参数
x(数字):目标复选框的 x 坐标。y(数字):目标复选框的 y 坐标。
返回值
(数字):返回 0、1 或 2(0 表示"未选中",1 表示"选中",2 表示"不确定")。
setCheckboxValue
设置复选框网格中单个复选框的值。
需要一个 (x, y) 坐标来指定复选框的位置。
注意:网格左上角为坐标原点 (0,0)。
.setCheckboxValue(x, y, newValue)
参数
x(数字):目标复选框的 x 坐标。y(数字):目标复选框的 y 坐标。newValue(数字):要设置的复选框值。必须是 0、1 或 2(0 表示"未选中",1 表示"选中",2 表示"不确定")。
返回值
无
getData
获取表示复选框网格当前状态的数据矩阵。
.getData()
参数
无
返回值
(数组):一个矩阵(数组的数组),表示复选框网格的完整状态。
setData
将复选框网格的值设置为所提供的矩阵中的值。
默认情况下,矩阵会从左上角开始覆盖网格中已有的数据。可以通过选项进行更精确的数据设置。
.setData(data, [options])
参数
data(数组):一个矩阵(数组的数组),包含要设置到复选框网格的数据。options(对象)x(数字):开始设置数据的 x 坐标。默认值:0。y(数字):开始设置数据的 y 坐标。默认值:0。fillValue(数字):如果设置的数据无法填满整个复选框网格,可以选择提供一个复选框值(0、1 或 2)来填充剩余区域。默认值:undefined。
返回值
无
clearData
清除复选框网格中的所有数据。结果:网格中所有复选框变为未选中状态。
.clearData()
参数
无
返回值
无
getEmptyMatrix
一个工具方法,返回一个与现有复选框网格尺寸相同的空矩阵。
可选地,可以传入一个对象来自定义预填充值或返回矩阵的尺寸。
.getEmptyMatrix([options])
参数
options(对象)fillValue(数字):希望预填充到返回矩阵中的值。默认值:0。width(数字):返回矩阵的宽度(列数)。默认与现有复选框网格的宽度一致。height(数字):返回矩阵的高度(行数)。默认与现有复选框网格的高度一致。
返回值
(数组):一个矩阵(数组的数组),具有与现有复选框网格相同的尺寸,仅包含 0 值(除非另有指定)。
扩展 API
Checkboxland 内置了插件,通过更高级的功能扩展 API。以下是这些"核心"插件提供的 API 方法。
将文字打印到复选框网格上。这些文字会从左上角开始覆盖现有的复选框网格。
默认字体中的大多数字符大小为 5x7 个复选框。支持的字符包括:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789`~!@#$%^&*()-_+=[]{}|\/;:"',.<>?
实际示例请参见文本框演示。
.print(text, [options])
参数
text(字符串):要打印到复选框网格的文字。options(对象)font(对象):包含自定义字体字符数据的对象(如果需要使用)。实际示例请参见时钟演示。x(数字):文字在复选框网格上开始的 x 坐标。默认值:0。y(数字):文字在复选框网格上开始的 y 坐标。默认值:0。fillValue(数字):如果文字数据无法填满整个复选框网格,可以选择提供一个复选框值(0、1 或 2)来填充剩余区域。默认值:undefined。dataOnly(布尔值):如果为true,则返回文字的数据矩阵,而不更新复选框网格。默认值:false
返回值
无,除非 options.dataOnly 设置为 true。在这种情况下,返回一个矩阵(数组的数组)。
marquee
通过让数据块从右向左滚动穿过复选框网格来实现动画效果。
实际示例请参见跑马灯演示。
.marquee(data, [options])
参数
data(数组):一个矩阵(数组的数组),表示要在网格上滚动的数据块。options(对象)repeat(布尔值):动画完成后是否重复播放。默认值:falseinterval(数字):动画每步之间的毫秒数。默认值:200fillValue(数字):如果滚动数据无法填满整个复选框网格,该复选框值用于填充剩余区域。默认值:0callback(函数):动画完成时执行的回调函数。
返回值
无
清理
要取消正在进行的跑马灯动画,请调用 cleanUp 方法:
.marquee.cleanUp()
renderImage
将提供的图片渲染为复选框。已测试的格式包括 PNG、JPEG、WEBP 和 GIF(非动画)。
注意:使用 HTMLImageElement 从外部域名加载图片时,需要包含 crossorigin="anonymous" 属性。图片服务器还需要发送 Access-Control-Allow-Origin 响应头。
参见使用 HTMLImageElement、文件上传、URL 加载和拖放的示例。
.renderImage(dataSource, [options])
参数
dataSource(字符串 | HTMLImageElement):包含图片 URL 的字符串(包括 data URL),或定义了src的HTMLImageElement(比如从页面查询到的<img />标签)。options(对象)threshold(数字):0-100 之间的数字,表示阈值,用于将视频分为暗区和亮区。默认值:50dithering(字符串):用于渲染视频的抖动算法。接受ordered、atkinson、errorDiffusion或none。默认值:none。x(数字):图片开始的 x 坐标。默认值:0。y(数字):图片开始的 y 坐标。默认值:0。fillValue(数字):如果放置的图片无法填满整个复选框网格,可以选择提供一个复选框值(0、1 或 2)来填充剩余区域。默认值:undefined。
返回值
无
renderVideo
将提供的视频渲染为复选框。已测试的格式包括 MP4、WEBM 和 MediaStreams。
注意:使用 HTMLVideoElement 从外部域名加载视频时,需要包含 crossorigin="anonymous" 属性。视频服务器还需要发送 Access-Control-Allow-Origin 响应头。
参见使用 HTMLVideoElement、文件上传、URL 加载、拖放以及摄像头的示例。
.renderVideo(dataSource, [options])
参数
dataSource(字符串 | HTMLVideoElement):包含视频 URL 的字符串(包括 data URL),或定义了src的HTMLVideoElement(比如从页面查询到的<video />标签)。以 URL 形式传递的视频会以合理的默认设置自动播放。以HTMLVideoElement形式传递的视频可以通过 HTML 属性进行自定义,并通过 HTMLMediaElement API进行控制。options(对象)threshold(数字):0-100 之间的数字,表示阈值,用于将视频分为暗区和亮区。默认值:50dithering(字符串):用于渲染视频的抖动算法。接受ordered、atkinson、errorDiffusion或none。默认值:none。x(数字):视频开始的 x 坐标。默认值:0。y(数字):视频开始的 y 坐标。默认值:0。fillValue(数字):如果放置的视频无法填满整个复选框网格,可以选择提供一个复选框值(0、1 或 2)来填充剩余区域。默认值:undefined。
返回值
无
清理
要取消自动播放的复选框视频,请调用 cleanUp 方法:
.renderVideo.cleanUp()
transitionWipe
通过在屏幕上擦除的方式,在当前复选框网格状态和未来状态之间进行过渡动画。
实际示例请参见擦除过渡演示。
.transitionWipe(newData, [options])
参数
newData(数组):一个矩阵(数组的数组),表示过渡完成后复选框网格的最终状态。options(对象)direction(字符串):擦除方向。接受ltr(从左到右)和rtl(从右到左)。默认值:ltrinterval(数字):动画每步之间的毫秒数。默认值:200fillValue(数字):如果滚动数据无法填满整个复选框网格,该复选框值用于填充剩余区域。默认值:0callback(函数):动画完成时执行的回调函数。
返回值
无
清理
要取消正在进行的过渡动画,请调用 cleanUp 方法:
.transitionWipe.cleanUp()
dataUtils
对数据矩阵执行各种转换(或操作)并返回结果。这些转换不会影响复选框网格。
.dataUtils(actionName, matrix, [options])
参数
actionName(字符串):要应用于矩阵的转换名称。matrix(数组):一个矩阵(数组的数组),表示要转换的数据。options(对象):转换选项。
支持的 actionName:
invert:反转提供的矩阵(所有 0 变为 1,反之亦然)。不支持选项。pad:在提供的矩阵周围添加内边距。选项包括:top(数字):顶部内边距的行数。bottom(数字):底部内边距的行数。left(数字):左侧内边距的列数。right(数字):右侧内边距的列数。all(数字):设置矩阵四边的内边距值。
返回值
(数组):一个矩阵(数组的数组),表示转换后的数据。
onClick
注册一个 eventHandler,当复选框网格被点击时调用。同时提供有关点击位置的 data。
实际示例请参见"点击事件"演示。
.onClick(eventHandler)
参数
eventHandler(函数|对象):当复选框网格被点击时调用的回调函数。也可以使用 eventListener 接口对象。
调用时,eventHandler 会接收到一个 data 对象,定义如下:
data(对象):包含点击数据的对象。其属性包括:x(数字):被点击的复选框的 x 坐标。y(数字):被点击的复选框的 y 坐标。checkbox(HTMLInputElement):被点击的复选框对应的 DOM 对象。
返回值
无
清理
要从复选框网格中移除 onClick 事件监听器,请调用 cleanUp 方法:
.onClick.cleanUp()
使用插件
Checkboxland 支持插件,可以扩展 API 并提供更高级的功能。
这是一个( realistic 但虚构的)使用插件扩展 Checkboxland 的示例:
import { Checkboxland } from 'checkboxland';
import mirrorPlugin from 'checkboxland-mirror';
Checkboxland.extend(mirrorPlugin);
const cbl = new Checkboxland();
// 镜像网格上的数据
cbl.mirror();
你可以在 Checkboxland 核心文件中看到更多使用插件的示例。
现有插件
(如果你为 Checkboxland 编写了第三方插件,我会将其列在这里)
创建插件
Checkboxland 插件是能够访问 Checkboxland 特殊数据的 JavaScript 函数。
插件可以通过 this 对象访问 Checkboxland 的所有属性和底层 API 方法。包括:
this.displayEl(对象) - 复选框网格的存储 DOM 元素this.dimensions(数组) - 复选框网格的尺寸,格式为[x, y]this.getCheckboxValue()(函数) - 参见 getCheckboxValue()this.setCheckboxValue()(函数) - 参见 setCheckboxValue()this.getData()(函数) - 参见 getData()this.setData()(函数) - 参见 setData()this.clearData()(函数) - 参见 clearData()this.getEmptyMatrix()(函数) - 参见 getEmptyMatrix()
示例
下面是一个插件示例,它将各种数据记录到 JavaScript 控制台:
import { Checkboxland } from 'checkboxland';
// 定义插件名称和要执行的函数
const myPlugin = {
name: 'logData',
exec: (propertyName) => {
if (propertyName === 'element') {
console.log(this.displayEl);
} else
if (propertyName === 'dimensions') {
console.log(`width: ${this.dimensions[0]}`);
console.log(`height: ${this.dimensions[1]}`);
} else
if (propertyName === 'matrix') {
console.log(this.getData());
}
}
cleanUp: () => {
// 可选的清理方法,在使用完插件时调用
// (用于移除事件监听器、清除定时器等)
console.log('clean up was called');
}
}
// 注册插件
Checkboxland.extend(myPlugin);
const cbl = new Checkboxland({ dimensions: '4x2' });
// 通过插件名称调用插件函数
cbl.logData('element'); // => <div id="checkboxland">...</div>
cbl.logData('dimensions'); // => 'width: 4, height: 2'
cbl.logData('matrix'); // => (2) [Array(4), Array(4)]
cbl.logData.cleanUp(); // => 'clean up was called'
更多插件示例请参见Checkboxland 内置的这些插件。