一个易于使用的主题组件,用于随机选择和奖品。
onSpin
和onCurrentIndexChange
等事件的回调。 import { Wheel } from 'https://cdn.jsdelivr.net/npm/[email protected]/dist/spin-wheel-esm.js' ;
< script src =" https://cdn.jsdelivr.net/npm/[email protected]/dist/spin-wheel-iife.js " > </ script >
npm install spin-wheel
// 1. Configure the wheel's properties:
const props = {
items : [
{
label : 'one' ,
} ,
{
label : 'two' ,
} ,
{
label : 'three' ,
} ,
]
}
// 2. Decide where you want it to go:
const container = document . querySelector ( '.wheel-container' ) ;
// 3. Create the wheel in the container and initialise it with the props:
const wheel = new Wheel ( container , props ) ;
对于多人游戏或授予具有实际价值的奖品,最好的方法是调用Wheel.spinToItem()
。轮子会旋转一定的时间,完成后指针将指向指定的项目。您应该始终在后端计算获胜项目,例如:
const winningItemIndex = await fetchWinningItemIndex ( ) ;
const duration = 4000 ;
const easing = easing . cubicOut ;
wheel . spinToItem ( winningItemIndex , duration , true , 2 , 1 , easing )
如果精度不重要,您可以使用Wheel.spin()
立即开始以一定速度旋转轮子,该速度将根据Wheel.rotationResistance
随着时间的推移而减小。您还可以设置Wheel.isInteractive = true
以允许用户通过拖动或轻拂自行旋转滚轮。
滚轮没有内置指针,而是您设置Wheel.pointerAngle
并自己绘制指针。这是因为您可能希望指针以多种方式显示和表现,例如您可能希望为其设置动画。
绘制指针的选项有:
Wheel.overlayImage
叠加图像图像作为HTMLImageElement
的实例传递,并且应该预先加载,否则浏览器下载它们时会出现初始延迟(或闪烁)。出于同样的原因,也应该预加载字体。有关如何预加载图像和字体的示例,请参阅主题示例背后的代码。
一切都很容易配置。滚轮具有响应能力,并会自动调整大小以适应其容器,因此当容器的大小发生变化时,您不必担心更新宽度和字体大小等繁琐的事情。因此,某些数字属性以百分比表示,而另一些则以像素表示。
百分比属性是容器大小的百分比。例如, Wheel.radius
为0.9
表示轮子将填充容器的90%
。
像素属性与500px
的容器大小相关。例如,当容器大小为500px
时, Wheel.LineWidth
为1
将恰好为1px
。
标签的配置也很简单,因为字体大小是自动计算的。您可以选择设置Wheel.itemLabelFontSizeMax
(以像素为单位),但否则最大项目标签的大小将调整为介于Wheel.itemLabelRadius
(百分比)和Wheel.itemLabelRadiusMax
(百分比)之间。
这是一个方便的图表:
Wheel
的方法方法 | 描述 |
---|---|
constructor(container, props = {}) | 在容器 Element 内创建轮子并使用 props 对其进行初始化。 |
init(props = {}) | 初始化所有属性。如果未为属性提供值,则会为其指定默认值。 |
resize() | [旧版] 重新计算并重新绘制轮子。仅在不支持 ResizeObserver 的旧版浏览器的某些情况下需要。 |
remove() | 从 DOM 中移除轮子并取消注册事件处理程序。 |
spin(rotationSpeed = 0) | 通过设置rotationSpeed 来旋转轮子。轮子将立即开始旋转,并随着时间的推移减慢速度,具体取决于rotationResistance 的值。正数将顺时针旋转,负数将逆时针旋转。 |
spinTo(rotation = 0, duration = 0, easingFunction = null) | 将轮子旋转到特定的旋转。 动画将在提供的持续 可以通过提供可选的 如果未提供缓动函数,则将使用默认的 escapeSinOut。 例如缓动函数请参阅 easing-utils。 |
spinToItem(itemIndex = 0, duration = 0, spinToCenter = true, numberOfRevolutions = 1, direction = 1, easingFunction = null) | 将轮盘旋转到特定项目。 动画将在提供的持续 如果 可以通过提供可选的 如果未提供缓动函数,则将使用默认的 escapeSinOut。 例如缓动函数请参阅 easing-utils。 |
stop() | 立即停止车轮旋转,无论使用哪种方法使其旋转。 |
getCurrentIndex() | 获取指针所指向的项目的索引。 如果 |
Wheel
的属性注意:将属性设置为undefined
会将其重置为默认值。
姓名 | 默认值 | 描述 |
---|---|---|
borderColor | '#000' | 车轮圆周线的 CSS 颜色。 |
borderWidth | 0 | 围绕车轮圆周的线的宽度(以像素为单位)。 |
debug | false | 是否会显示调试信息。 这在定位标签时很有帮助。 |
image | null | 在滚轮上绘制并随滚轮旋转的 HTMLImageElement。 它将居中并缩放以适合 |
isInteractive | true | 是否允许用户使用单击拖动/触摸轻拂来旋转滚轮。 用户交互只会在 |
itemBackgroundColors | ['#fff'] | 用作所有项目背景颜色的重复模式的 CSS 颜色。 被 示例: |
itemLabelAlign | 'right' | 所有项目标签的对齐方式。 可能的值: |
itemLabelBaselineOffset | 0 | 所有项目标签的基线(或行高)的偏移量(以标签高度的百分比表示)。 |
itemLabelColors | ['#000'] | 用作所有项目标签颜色的重复模式的 CSS 颜色。 被 示例: |
itemLabelFont | 'sans-serif' | 用于所有项目标签的字体系列。 示例: |
itemLabelFontSizeMax | 100 | 所有项目标签的最大字体大小(以像素为单位)。 |
itemLabelRadius | 0.85 | 沿着轮子半径的点(以百分比形式,从中心开始)开始绘制所有项目标签。 |
itemLabelRadiusMax | 0.2 | 沿轮子半径的点(以百分比形式,从中心开始),用于限制所有项目标签的最大宽度。 |
itemLabelRotation | 0 | 所有项目标签的旋转。与itemLabelAlign 结合使用可将标签翻转180° 。 |
itemLabelStrokeColor | '#fff' | 应用于标签文本外部的描边的 CSS 颜色。 |
itemLabelStrokeWidth | 0 | 应用于标签文本外部的描边宽度。 |
items | [] | 轮盘上显示的项目(或切片、楔形、段)。 设置此属性将根据提供的对象重新创建轮子上的所有项目。 访问此属性可以让您更改单个项目。例如,您可以更改项目的背景颜色。 |
lineColor | '#000' | 项目之间线条的 CSS 颜色。 |
lineWidth | 1 | 项目之间线条的宽度(以像素为单位)。 |
offset | {x: 0, y: 0} | 轮子与其容器中心的偏移量(以轮子直径的百分比表示)。 |
onCurrentIndexChange | null | onCurrentIndexChange 事件的回调。 |
onRest | null | onRest 事件的回调。 |
onSpin | null | onSpin 事件的回调。 |
overlayImage | null | 要在滚轮顶部绘制的 HTMLImageElement。 它将居中并缩放以适合容器的最小尺寸。 用它来绘制方向盘周围的装饰,例如支架或指针。 |
pixelRatio | 0 | 用于绘制轮盘的像素比(百分比)。 较高的值会产生更清晰的图像,但会牺牲性能,但清晰度取决于当前的显示设备。 值为 |
pointerAngle | 0 | 将用于确定currentIndex (或“获胜”项目)的指针的角度。 |
radius | 0.95 | 轮子的半径(以容器最小尺寸的百分比表示)。 |
rotation | 0 | 车轮的旋转(角度)。 第一个项目将从该点开始顺时针绘制。 |
rotationResistance | -35 | 每秒rotationSpeed 将减少多少,直到轮子停止旋转。设置为 |
rotationSpeed | 0 | [只读] 轮子每 1 秒旋转的速度(以度为单位的角度)。 正数表示轮子顺时针旋转,负数表示逆时针旋转, |
rotationSpeedMax | 250 | rotationSpeed 的最大绝对值。车轮在任一方向上的旋转速度都不会超过该值。 |
Wheel
活动onCurrentIndexChange(event = {})
当指向新项目时引发。这可用于更改当前项目的颜色,或播放“滴答”声音。
钥匙 | 价值 |
---|---|
type | 'currentIndexChange' |
currentIndex | 指针所指向的项目的索引。 请参阅 |
onRest(event = {})
当车轮旋转后停止时升高。
钥匙 | 价值 |
---|---|
type | 'rest' |
currentIndex | 指针所指向的项目的索引。 请参阅 |
rotation | 轮子的旋转。 请参阅 |
onSpin(event = {})
当车轮旋转时升高。
钥匙 | 价值 |
---|---|
type | 'spin' |
duration | 旋转动画的持续时间。仅当method = spinto 或method = spintoitem 时提供。 |
method | 用于旋转轮子的方法( interact 、 spin 、 spinto 、 spintoitem )。 |
rotationResistance | 引发事件时Wheel.rotationResistance 的值。仅当 |
rotationSpeed | 引发事件时Wheel.rotationSpeed 的值。仅当 |
targetItemIndex | 旋转动画完成后指针将指向的项目。 仅当 |
targetRotation | 旋转动画完成后Wheel.rotation 将具有的值。仅当 |
Item
方法姓名 | 描述 |
---|---|
getCenterAngle() | 获取该项目结束的角度(以度为单位)(不包括),忽略轮子的当前rotation 。 |
getEndAngle() | 获取该项目结束的角度(以度为单位)(含),忽略轮子的当前rotation 。 |
getIndex() | 获取该项目的从 0 开始的索引。 |
getRandomAngle() | 返回该项目的起始角度(含)和结束角度(含)之间的随机角度(以度为单位)。 |
getStartAngle() | 获取该项目开始的角度(以度为单位)(含),忽略滚轮的当前rotation 。 |
init(props = {}) | 初始化所有属性。 如果某个值未定义或无效,则该属性将回退到默认值。 |
Item
属性注意:将属性设置为undefined
会将其重置为默认值。
姓名 | 默认值 | 描述 |
---|---|---|
backgroundColor | null | 项目背景的 CSS 颜色。 当 示例: |
image | null | 要在项目上绘制的 HTMLImageElement。 延伸到项目之外的图像的任何部分都将被剪掉。图像将绘制在 |
imageOpacity | 1 | Item.image 的不透明度(以百分比表示)。如果您想要淡化图像以使项目的标签突出,则非常有用。 |
imageRadius | 0.5 | 沿着轮子半径的点(以百分比形式,从中心开始)绘制Item.image 的中心。 |
imageRotation | 0 | Item.image 的旋转(角度)。 |
imageScale | 1 | Item.image 的比例(大小以百分比表示)。 |
label | '' | 将在项目上绘制的文本。 |
labelColor | null | 项目标签的 CSS 颜色。 当 示例: |
value | null | 一些对您的应用程序有意义的值。例如,对表示轮子上的项目的对象的引用,或数据库 ID。 |
weight | 1 | 该项目相对于轮盘上其他项目的比例大小。 例如,如果您有 2 个项目,其中 |
受到随机轮的启发。