@johnmorrisdotca/kazoku-ui

中文文档
0.2.1发布于 2026/11/01MITTypeScriptES Module零依赖构建来源已验证

家族的共享接口部件作为自己的版本化包。第一部分:任何3D或可缩放视图的视图控件(角度,倾斜,自动旋转,缩放指针,平移,触摸,地址状态)作为无框架自定义元素和pl

中文使用文档
文档目录13 节
  1. 视图控件
  2. 在纯HTML中
  3. 在框架中
  4. 没有元素
  5. 视图中的按钮和链接
  6. 以现场的自然大小开场
  7. 事件API
  8. 属性
  9. 的地址
  10. 为什么标签只有在空闲时才被定义
  11. 大小
  12. 检查
  13. 没有

和风

The demo: a white card with a blue circle and a black triangle, turned a little and tipped, in a frame with a dotted floor. Under it the view controls: Angle and Tilt sliders, Auto-turn and Front buttons, zoom out, 2 times, zoom in and Fit, four arrows to move the zoomed view, and the Move and Turn choice for a drag.

家族的共享接口部分,作为它们自己的版本化包:每个子路径一个部分,所以一个页面只加载它使用的部分。没有运行时依赖,MIT。 第一部分是 视图控件 用于任何3D或可缩放视图。它们从不绘制场景:它们告诉你的页面读者选择了什么,而你的画布,WebGL, SVG或CSS 3D应用它。

演示 · 标签,英文和中文 · 更新日志

npm install @johnmorrisdotca/kazoku-ui

部分(每个部分都有自己的子路径;后面的部分:图片贴图选择器,带有明暗的主题色板,英文和中文开关,帮助,GitHub和npm药丸,保存SVG和PNG,家庭背景):

子路径它是什么?
@johnmorrisdotca/kazoku-ui/view-controls控制器,算法,地址和标签。服务器上的导入。
@johnmorrisdotca/kazoku-ui/view-controls/element这个 ViewControlsElement 类(需要浏览器)。
@johnmorrisdotca/kazoku-ui/view-controls/define寄存器 <kazoku-view-controls> (一次,且仅当标签是空闲的时候)。

视图控件

  • 角度和倾斜滑块,自动旋转与播放和暂停,前面。
  • 缩小,2倍,放大和适合。缩放是关于指针(Ctrl或Command与滚轮,或触控板的捏)。
  • 四个箭头平移键(放大后显示)和移动或转向选项用于拖动。
  • 触摸:一根手指旋转1x,放大时移动视图;两根手指捏。
  • 键在视图上:箭头转动和倾斜, + 和 - 变焦, 0 或者Home is Front and Fit。
  • 选项保存在地址中,其中的键可以重命名。
  • 英文和日文标签;光明与黑暗;48像素触摸目标;手机上的小型酒吧;对于喜欢减少运动的读者来说,没有自动旋转。
  • 控件永远不会停止或重置回合。 缩放,倾斜,平移,移动或转向选择,Fit和Front都会使自动旋转运行(Front只将角度设置为0,并且从那里开始旋转)。在角度滑块上的手,或者通过拖动来转动视图,在视图向下时保持转弯不动,并且从手离开的位置继续转弯。只有自动旋转按钮暂停它。

在纯HTML中

<div id="scene" tabindex="0" style="height: 320px">...your scene...</div>
<kazoku-view-controls for="scene" address></kazoku-view-controls>

<script type="module">
  import "@johnmorrisdotca/kazoku-ui/view-controls/define";

  const scene = document.getElementById("scene");
  document.querySelector("kazoku-view-controls").addEventListener("kazoku-viewchange", (event) => {
    const { yaw, tilt, zoom, panX, panY } = event.detail;
    scene.style.transform = `translate(${panX}px, ${panY}px) scale(${zoom}) rotateX(${tilt}deg) rotateY(${yaw}deg)`;
  });
</script>

将元素放在视图上或它的右边,这样它就和视图一起出现在屏幕上。 for 命名手绑定到的元素(指针、缩放、转轮和键);给它一个机会 tabindex 如果你想把键放在上面,根据视图来调整大小,因为平移是在房间里缩放的。与 overlay 该工具条位于其父工具条的底部。

在框架中

该元素是普通的DOM,因此任何框架都将其与一个ref和一个侦听器一起使用。反应:

import "@johnmorrisdotca/kazoku-ui/view-controls/define";
import { useEffect, useRef } from "react";

export function Viewer({ draw }) {
  const view = useRef(null);
  const controls = useRef(null);
  useEffect(() => {
    const bar = controls.current;
    bar.view = view.current;
    const on = (event) => draw(event.detail);
    bar.addEventListener("kazoku-viewchange", on);
    return () => bar.removeEventListener("kazoku-viewchange", on);
  }, [draw]);
  return (
    <>
      <div ref={view} tabIndex={0} style={{ height: 320 }} />
      <kazoku-view-controls ref={controls} lang="en" />
    </>
  );
}

没有元素

createViewController 是相同的手和状态,没有自己的标记,对于绘制自己按钮的页面。它只在 bind.

import { createViewController } from "@johnmorrisdotca/kazoku-ui/view-controls";

const view = createViewController({
  speed: 30, // degrees a second for Auto-turn
  onChange(state, { final, reason }) {
    draw(state); // { yaw, tilt, zoom, panX, panY, turning, drag }
  },
});
const unbind = view.bind(document.getElementById("scene")); // pointer, pinch, wheel, keys
myPlayButton.onclick = () => view.toggle();
myZoomIn.onclick = () => view.zoomBy(1.4);

选项的 createViewController 匹配: zoom ("fit" 或者一个数字), fitScale, ignore. 控制器也有 ignore (的), fitScale, startZoom ( zoom 视图在)和处打开 setFitScale(n), setStartZoom(zoom); DEFAULT_IGNORE 是默认的选择器。

手抓住指针上的 for 元素,因此按下放置在其中的按钮或链接将被视为拖动,而其点击将丢失。按下任何符合的 ignore (没有捕获,没有拖动,没有双击),然后点击就完成了。给其他孩子做标记 data-kazoku-ignore. 从视图的空部分拖动使其像以前一样转动。

ignore 也可以通过阴影DOM看到:它会测试事件路径上的每个元素,从最里面的那个元素一直到视图,所以即使事件的目标是组件,web组件打开的阴影根中的按钮(比如卡片自己的Animate按钮)也不会受到影响。封闭的影子根将其内部隐藏在页面中,因此只有组件本身可以匹配:将主机标记为 data-kazoku-ignore,或将其标记名添加到 ignore.

以现场的自然大小开场

缩放1表示适合,无论页面大小如何。一页在 fitScale (例如,当它适合视图时,它的自然大小为0.4),并希望以自然大小集打开 zoom="1" 并告诉控制者刻度:

const controls = document.querySelector("kazoku-view-controls");
controls.setAttribute("zoom", "1"); // natural size
controls.setFitScale(measure()); // the scale the scene is drawn at when it fits, for example 0.4
// the event's zoom is now 2.5; draw at event.detail.zoom * controls.fitScale

setFitScale 将视图移动到新比例的开始缩放,除非阅读器已经缩放。Fit和Fit键仍然是缩放1,当地址是打开的时候,它会留下一个缩放。 zoom="fit",或者没有 zoom,与以前没有任何改变。

事件API

kazoku-viewchange 在元素上分配(它冒泡并穿过阴影根)。 event.detail的第一个参数 onChange是:

场意义
yaw度,从-180度到180度:垂直方向的转弯。向右拖动会使其变大。
tilt度,保持正负 tilt-max 当它变大时,顶部会向外倾斜(向上拉)。
zoom1至5 (zoom-min, zoom-max我很健康。这场面被画得很逼真 zoom * fitScale (见下文)。
panX, panYCSS像素,缩放后的图片从视图的中间移动;x = 0。
turning当Auto-turn运行时为True。
drag"move" 或者 "turn":普通拖动在放大时的效果。
final对于拖动、缩放、滑动和自动转弯的步骤为False;当事情解决时是真的。这张昂贵的汇票是什么 final,对每个事件进行廉价的变换。
reason是什么改变了它: init, auto, drag, pinch, wheel, key, slider, zoom, pan, front, fit, fit-scale, play, pause 或者 set.

一个 init 事件在元素连接后立即发送一次,并使用起始视图(来自属性和地址)。 element.state 是任何时候的当前视图。

属性

属性
for手绑定到的视图的id。或一组 element.view = someElement.
langen 或者 ja. 否则最近的 lang 高于它,否则是英语。
yaw, tilt起始角度和倾斜度。
zoom起始变焦: fit (默认值)或一个数字,其中1是场景的自然大小。打开数除以 fit-scale;与 fit-scale 左边是1 zoom 事件的。
fit-scale页面在Fit(事件)时绘制场景的比例 zoom 1): zoom 1表示什么。默认为1。或打电话 element.setFitScale(n) 一旦场景被测量。
ignore一个CSS选择器,用于在视图内指针按下后留下的内容,因此它的点击经过: button, a, input, select, textarea, label, [data-kazoku-ignore] 默认情况下。一个光秃秃的 ignore="" 什么都不留下。
autoplay从一开始就自动转动,除非读者喜欢减少转动。
speed每秒30度。
flat视图不能转动:没有角度、倾斜、自动转动或前方,拖拽可以移动它。
tilt-max, zoom-min, zoom-max极限(30,1,5)。
address将选择保留在页面地址(?yaw=40&tilt=10&zoom=2&drag=turn)。
address-keys其他键: yaw:a,zoom:z.
themelight 或者 dark;否则页面的配色方案。
overlay坐在定位父级的底部。

方法: play(), pause(), front(), fit(), set({ yaw, tilt, zoom, panX, panY, drag }), setFitScale(n), controller ( createViewController 对象)。 element.words = { front: "Home" } 替换标签。 颜色是自定义属性: --kazoku-ink, --kazoku-surface, --kazoku-line, --kazoku-accent;这些部分是 bar, field, slider 和 button.

的地址

只保留读者选择的内容:角度、倾斜、缩放和拖动选项。平移是以一个屏幕的像素为单位的,转动是瞬间的,所以两者都不是;当视图自己转动时,角度被忽略了。在其开始处的值(Fit或 zoom 页面在)打开时留下地址,其他参数保留。该地址每秒最多写入4次(Safari会在30秒内停止更改地址超过100次的页面)。不含元素的: parseAddress(search, keys?) 和 formatAddress(search, choices, keys?, leaveYaw?, startZoom?).

为什么标签只有在空闲时才被定义

customElements.define 当取一个名称时抛出,并且页面可以毫无错误地满足这个要求:该包的两个副本(每个包一个应用程序和一个小部件,或两个版本),脚本加载两次,或者注册了标记以提供自己的元素的页面。throw会停止导入模块和与之相关的页面脚本。所以 define 调用 customElements.get 第一种定义获胜; defineViewControls(registry?) 返回它是否定义了标记。

大小

压缩,未捆绑:元素及其定义约5.0 KB,控制器约3.9 KB,数学约1.4 KB,地址约1.2 KB,标签约0.7 KB,样式约1.6 KB (pnpm test:package 打印)。没有从网络中加载任何内容。

检查

pnpm check (lint,类型,数学的29个单元测试,地址,控制器和包,构建和打包包),以及 pnpm test:demo (chrome和WebKit在手机和桌面的宽度上的演示:第一个屏幕上的控件,自动旋转时的切换使角度前进,视图内的按钮或链接在拖动旋转时仍然点击,打开缩放和适合比例,缩放指针,缩放时的平移,触摸,地址,标签,减少运动)。

没有

还没有发布到npm。日语标签还没有被母语人士读过。演示的场景是一个CSS 3D卡;这个包对什么画没有意见。

执照:麻省理工学院。此包中没有品牌、联赛或赞助商的标志。

版本与发布记录

@johnmorrisdotca/kazoku-ui 共发布 4 个版本,首次发布于 2026/11/01;过去 12 个月发布了 4 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.2.1latest2026/11/011 天前
0.2.02026/11/011 天前
0.1.02026/11/011 天前
0.0.0-stage2026/11/011 天前

关于 @johnmorrisdotca/kazoku-ui 的常见问题

@johnmorrisdotca/kazoku-ui 是什么?

家族的共享接口部件作为自己的版本化包。第一部分:任何3D或可缩放视图的视图控件(角度,倾斜,自动旋转,缩放指针,平移,触摸,地址状态)作为无框架自定义元素和pl

如何安装 @johnmorrisdotca/kazoku-ui?

在项目目录运行 npm install @johnmorrisdotca/kazoku-ui,或使用 pnpm add / yarn add / bun add。

@johnmorrisdotca/kazoku-ui 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@johnmorrisdotca/kazoku-ui 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@johnmorrisdotca/kazoku-ui 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@johnmorrisdotca/kazoku-ui 可以商用吗?

@johnmorrisdotca/kazoku-ui 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@johnmorrisdotca/kazoku-ui 还在维护吗?

最新版本 0.2.1 发布于 2026/11/01(1 天前);至今共发布 4 个版本,其中过去 12 个月发布了 4 个;首次发布于 2026/11/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。