https://github.dsrkafuu.net/sakana-widget/
把石蒜模拟器添加到你自己的网页内!支持自定义图片、自动缩放和更多运行参数!
功能
- 注册并使用你自己的角色
- 自动缩放适应,最小 120px
- 按住立牌拖拽,松手后立牌会向反方向弹跳
- 底座控制栏切换角色和其他功能
- 自走模式,以随机间隔施加一个大小随机的力
- CDN/NPM 引入,自定义参数,链式调用
使用
首先需要引入模块,可以使用 CDN 直接引入或者通过 NPM 包的形式安装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sakana-widget@2.7.0/lib/sakana.min.css" /> <div id="sakana-widget"></div> <script> function initSakanaWidget() { new SakanaWidget().mount('#sakana-widget'); } </script> <script async onload="initSakanaWidget()" src="https://cdn.jsdelivr.net/npm/sakana-widget@2.7.0/lib/sakana.min.js" ></script>
|
1 2 3 4
| import 'sakana-widget/lib/index.css'; import SakanaWidget from 'sakana-widget'; new SakanaWidget().mount('#sakana-widget');
|
本包默认导出一个类 SakanaWidget
,通过该类可以初始化一个小组件。上面的代码初始化了一个全默认设置的组件,并将其挂载到了 #sakana-widget
元素上。
你可以继续创建实例并挂载到更多的 DOM 元素上,组件之间除了角色以外,数据是完全独立的,非静态方法支持链式调用。
例如,你可以在挂载组件之前修改一些设置,并获得一个超慢速的永续千束:
1
| new SakanaWidget().setState({ i: 0.001, d: 1 }).mount('#sakana-widget');
|
又或者,通过 getCharacter
静态方法获取内置的角色对象,修改参数,并创建一个超慢速无阻尼 (永续) 的泷奈作为新角色:
1 2 3 4 5 6 7 8
| const takina = SakanaWidget.getCharacter('takina'); takina.initialState = { ...takina.initialState, i: 0.001, d: 1, }; SakanaWidget.registerCharacter('takina-slow', takina); new SakanaWidget({ character: 'takina-slow' }).mount('#sakana-widget');
|
当然,你也可以使用自己的图片 (url 或 base64) 作为角色比如 GitHub 的图标:
1 2 3 4
| const github = SakanaWidget.getCharacter('chisato'); github.image = `https://raw.githubusercontent.com/dsrkafuu/sakana-widget/main/docs/github.png`; SakanaWidget.registerCharacter('github', github); new SakanaWidget({ character: 'github' }).mount('#sakana-widget');
|
详细的参数和返回实例请见下文 API 章节。
自动缩放
在初始化组件的时候设置 autoFit: true
即可,组件会自动根据其挂载容器的大小进行缩放,最小 120px。
注意,开启自动缩放时需要确保挂载容器是一个 BFC,最简单的方式就是设置 position: relative
或 position: fixed
。组件在自动缩放模式下会额外在 app 和挂载容器之间添加一个包裹容器,并将其宽高设置为 100%
,通过该包裹容器侦测实际的大小,因此,BFC 是必须的。
API
类型定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| export interface SakanaWidgetState {
i: number;
s: number;
d: number;
r: number;
y: number;
t: number;
w: number; }
export interface SakanaWidgetCharacter { image: string; initialState: SakanaWidgetState; }
|
构造函数选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| export interface SakanaWidgetOptions {
size?: number;
autoFit?: boolean;
character?: 'chisato' | 'takina';
controls?: boolean;
rod?: boolean;
draggable?: boolean;
stroke?: { color?: string; width?: number; };
threshold?: number;
rotate?: number;
title?: boolean; }
|
返回实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class SakanaWidget {
static getCharacter(name: string): SakanaWidgetCharacter | null;
static getCharacters();
static registerCharacter(name: string, character: SakanaWidgetCharacter);
setState(state: Partial<SakanaWidgetState>);
setCharacter(name: string);
nextCharacter();
triggetAutoMode();
mount(el: HTMLElement | string);
unmount(); }
|
备注
本项目代码基于 MIT 协议授权,前期是基于 https://github.com/itorr/sakana 的二次开发。
插画来源: 大伏アオ @blue00f4 pixiv