2048样式系统指南:Sass循环生成16个定位类,打造自适应响应式棋盘
【免费下载链接】2048The source code for 2048项目地址: https://gitcode.com/gh_mirrors/20/2048
2048 的经典棋盘并非手写 16 份 CSS,而是由 style/main.scss 中的 Sass 变量 +@for循环自动生成16 个定位类(tile-position-1-1至tile-position-4-4),并借助媒体查询一次重算出桌面版与手机版两套棋盘,堪称"响应式棋盘"的小型范本。本指南带你读懂这套样式系统的设计思路。
🧩 一切从变量开始:棋盘尺寸的数学推导
打开 style/main.scss,开头几个变量就定义了整个棋盘:
$field-width: 500px:棋盘总宽度$grid-spacing: 15px:格子间距$grid-row-cells: 4:每行 4 格$tile-size:由前三者自动计算出单格边长(约 107px)$mobile-threshold:桌面/移动切换阈值(520px)
这样设计的好处:改一个数字,整块棋盘(格子大小、间距、定位偏移)全部联动,无需逐处修改。
上图即 2048 的 4×4 响应式棋盘:背景网格 + 悬浮方块的双层结构
🔁 核心技巧:@for 循环生成 16 个定位类
方块的移动不靠left/top,而是靠transform: translate()。但 4×4 = 16 个格子,难道手写 16 条规则?当然不用。style/main.scss 中只有一段嵌套循环:
@for $x from 1 through $grid-row-cells { @for $y from 1 through $grid-row-cells { &.tile-position-#{$x}-#{$y} { $xPos: floor(($tile-size + $grid-spacing) * ($x - 1)); $yPos: floor(($tile-size + $grid-spacing) * ($y - 1)); @include transform(translate($xPos, $yPos)); } } }编译后在 style/main.css 中展开为 16 条定位规则,偏移量精确到像素:
| 定位类 | 桌面版偏移 |
|---|---|
tile-position-1-1 | translate(0px, 0px) |
tile-position-2-2 | translate(121px, 121px) |
tile-position-4-4 | translate(363px, 363px) |
每步 121px = 107px(格宽)+ 15px(间距),完全由变量推导而来。
📱 一套 Mixin,两套棋盘:响应式的秘密
所有棋盘相关样式都被封装进game-fieldMixin(style/main.scss),并在两个地方被引入:
- 桌面版:直接
@include game-field;,使用 500px 变量; - 移动版:包在 style/helpers.scss 提供的
smaller($width)媒体查询 Mixin 内,重新定义为 280px 宽、10px 间距的变量后再@include game-field;(style/main.scss)。
于是同一套循环自动重跑一遍,在 style/main.css 中生成第二套更紧凑的定位类(如translate(67px, 67px)),并同步缩小字号、重排头部——屏幕宽度小于 520px 时,棋盘无缝切换为移动端形态。这就是"一个 Mixin + 变量作用域"实现响应式的完整套路。
⌨️ JS 侧:如何给方块贴上定位类
样式准备好后,js/html_actuator.js 中的positionClass方法会把方块的行列坐标(0 起)归一化为 1 起的类名:tile-position-{x}-{y},与 Sass 生成的类名严丝合缝。方块移动时只切换类名,浏览器即可用 CSS 过渡(transition: 100ms ease-in-out)平滑滑到目标格。棋盘 DOM 本身由 index.html 中的 4 行 × 4 个grid-cell静态写死,与动态方块层(tile-container)分离,保证了"背景网格不动、方块在上方滑动"的效果。
🎨 附赠技巧:@while 循环生成 2→2048 的方块配色
定位类用@for,配色用@while:style/main.scss 以 2 的幂次循环 11 次(2、4、8 … 2048),结合pow()(定义于 style/helpers.scss)与mix()函数,按"金色浓度"逐级加深背景,并自动为大数字调小字号、给高阶方块加金色光晕——全程零手写规则。
📂 相关文件清单
| 文件 | 作用 |
|---|---|
| style/main.scss | 样式源文件:变量、game-fieldMixin、定位类循环 |
| style/helpers.scss | 工具 Mixin:媒体查询、过渡、关键帧、幂函数 |
| style/main.css | 编译产物:两套 16 个定位类一目了然 |
| js/html_actuator.js | 负责生成并切换tile-position-x-y类名 |
| index.html | 棋盘 DOM 结构:grid-container + tile-container |
💡小结:2048 的样式系统用"变量驱动 + 循环生成 + Mixin 复用"三板斧,把 16 格棋盘的定位与配色压缩到几十行 SCSS 内,还免费获得了响应式能力——这正是值得新手学习的经典样式架构案例。
【免费下载链接】2048The source code for 2048项目地址: https://gitcode.com/gh_mirrors/20/2048
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考