.bandit{display:flex;}生成数据因为老虎机每一列的数据一般都是一致的,所以我们需要有一个默认的初始化数据,这里我们简化成一个0-9的数组,有动态生成的方法很多,从长到短的实现方法有:方法一newArray(10).join(',').split(',').map((item,idx)=>idx)方法二(Array.from({length:10})).map((item,idx)=>idx)方法三Array.from({length:10},(item,idx)=>idx)方法四[...newArray(10).keys()]元素布局我们需要应用3D属性进行布局,实现3D视觉和无缝循环效果分别需要经过:绝对定位X轴旋转Z轴偏移转移视角的隐藏线sight绝对定位实现图形效果ul{position:relative;宽度:100px;height:160px;}li{position:absolute;顶部:0;左:0;宽度:100%;高度:100%;框大小:边框框;边框:1px实心#3e3e3e;background-color:rgba(233,155,67,0.1);}X轴旋转我们有十个数字,周围是正十边形,所以每个数字的旋转角度也很容易计算,实现第二个效果graphics//边数$num:10;li{@for$idxfrom1through$num{&:nth-child(#{$idx}){transform:rotateX(-#{($idx-1)*360/$num}deg);}}}Z轴偏移首先,这是一个3D维度属性。我们都知道基本轴分为多少个,偏移量值多少。这是一个比较复杂的涉及初中数学公式的问题。已知边长为160,每个三角形的内角为360/10=36,其中r就是我们要求的公理,即Z轴的偏移值,根据数学公式r=直角三角形对边内角/Math.tan(直角三角形内角/180*Math.PI)即r=(160/2)/Math.tan((36/2)/180*Math.PI)≈246所以最终样式//边数$num:10;li{@for$idxfrom1through$num{&:nth-child(#{$idx}){变换:rotateX(-#{($idx-1)*360/$num}deg)translateZ(246px);}}}以上三步虽然已经调布局实现了,但是没有用。我们的屏幕是平面的,透视可以决定我们是用2D透视还是3D透视看界面。让我们了解这些关键属性的作用。perspective透视属性定义了3D元素和视图之间的距离。像素计此属性允许您更改查看3D元素的视图。当为元素定义透视属性时,其子元素获得透视效果,而不是元素本身。注意:perspective属性只影响3D变换元素。perspective-originperspective-origin属性定义3D元素所基于的X轴和Y轴。此属性允许您更改3D元素的底部位置。当为元素定义了perspective-origin属性时,它的子元素获得透视效果,而不是元素本身。注意:此属性必须与perspective属性一起使用,并且只影响3D转换元素。transform-style指定嵌套元素应如何在3D空间中呈现。如果你接触过设计或建筑等专业,你可能看过这些图片。一般来说,改变视角就是改变视线的角度和距离。所以我们稍微调整一下属性,然后复制多个叠加看看效果。主容器{perspective:3000px;//3dperspective-origin:50%50%;//观察角度,50%50%表示从中间观察ul{margin:04px;变换样式:保留3d;}}我们可以发现它在视觉上是3D的并且是居中的,但是需要处理它们堆叠优先级的问题。我们用逆向计算的方法来处理-(当前索引-平均值)ul{@for$idxfrom1through$num{&:nth-child(#{$idx}){z-index:-(#{($idx-3)});}}}隐藏视线。我们只需要保持视线,将元素隐藏在容器外即可。需要注意的是,以上属性会影响容器的实际大小,需要预留一个内边距。主容器{overflow:hidden;宽度:600px;高度:160px;padding:20px60px;}不预留marginMargin动画效果我们已经知道整圈数字是一个正十边形,每个数字的旋转角度也是已知的,所以只需要一个循环就可以完成。我们给动画一些固定的旋转圈来达到更好的效果。另外需要设置默认的动画属性和延时效果,顺序为ul{animation-duration:2s;动画填充模式:转发;动画计时功能:缓入缓出;@for$idx从1到$num{&:nth-child(#{$idx}){animation-delay:#{($idx-1)*0.2}s;}@keyframesnum#{($idx-1)}{到{变换:rotateX(calc(5*360deg+360deg/#{$num}*#{($idx-1)}));}}}}RollUp组件实现