专栏名称: 程序猿
本微信公众号:imkuqin,为程序员提供最新最全的编程学习资料的查询。目前已经开通PHP、C/C++函数库、.NET Framework类库、J2SE API查询功能。
目录
相关文章推荐
程序猿  ·  Cursor 1.0 太炸裂了。。。 ·  昨天  
程序员的那些事  ·  突发!TP-Link ... ·  昨天  
OSC开源社区  ·  你每天都很急(程序员版) ·  3 天前  
51好读  ›  专栏  ›  程序猿

零JS!他用4.6万行HTML+CSS手搓了个《我的世界》,程序员哭诉:网友把服务器玩爆了

程序猿  · 公众号  · 程序员  · 2025-06-11 12:18

正文

请到「今天看啥」查看全文



2、核心技术原理

光看这代码量就像用牙签拼城堡,这个项目之所以能运作起来,Simon Willison 解释称,关键技巧是将 标签与 has() 选择器组合使用才得以实现。

对此,整个页面中有 35001 个 5840 个 单选按钮组成了 状态存储引擎。

每个方块的六个面都相当于一个标签,点击任意一面,就像触发了一个隐藏的开关, 通过 for 属性精准「链接」到相邻方块的状态。

当你想给方块换材质时,其实是在切换可见的标签组。CSS 里的 has() 选择器就像个「大管家」,比如当你选中「石头」材质的单选按钮时,它会立刻让其他材质的方块「隐身」( display: none ),只留下石头方块在界面上显示。具体实现代码如下:
.controls:has(  > .block-chooser > .stone > input[type=radio]:checked) ~ main .cubes-container > .cube:not(.stone) {  display: none;}

值得一提的是,因为这个项目要生成上万行 HTML 标签,比如几万个

下面是这个 Pug 模板的简化版本 (完整代码详见:https://github.com/BenjaminAster/CSS-Minecraft/blob/main/index.pug) ,可以帮助大家理解 HTML 的结构:

//- pug index.pug -wconst blocks = ["air""stone""grass""dirt""log""wood""leaves""glass"];const layers = 9;const rows = 9;const columns = 9;<html lang="en" style="--layers: #{layers}; --rows: #{rows}; --columns: #{columns}"><div class="blocks">  for _, layer in Array(layers)    for _, row in Array(rows)      for _, column in Array(columns)        <div class="cubes-container" style="--layer: #{layer}; --row: #{row}; --column: #{column}">          - const selectedBlock = layer === layers - 1 ? "grass" : "air";          - const name = `cube-layer-${layer}-row-${row}-column-${column}`;          <div class="cube #{blocks[0]}">            - const id = `${name}-${blocks[0]}`;            <input type="radio" name="#{name}" id="#{id}" !{selectedBlock === blocks[0] ? "checked:






请到「今天看啥」查看全文