You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用HTML&CSS实现Loop Loom编织图案?解决层级冲突

环形织机编织图案的实现方案(HTML/CSS + React)

解决多列层级冲突的CSS方案

你遇到的全局z-index冲突问题,核心原因是交叉编织的层级规则需要基于行列奇偶性的局部判断,而非全局层级控制。以下两种方案可以彻底解决这个问题:

方案1:单元格局部层级控制

将每个编织条的交叉区域拆分为单元格内的独立元素,仅在单元格范围内设置层级,避免全局冲突。

示例代码:

<div class="loom">
  <!-- 横向行条 -->
  <div class="row-thread row-1"></div>
  <div class="row-thread row-2"></div>
  <!-- 纵向列条 -->
  <div class="col-thread col-1"></div>
  <div class="col-thread col-2"></div>
</div>
.loom {
  display: grid;
  grid-template-rows: repeat(4, 20px);
  grid-template-columns: repeat(4, 20px);
  gap: 2px;
  background: #eee;
}

/* 横向行条基础样式 */
.row-thread {
  grid-column: 1 / -1;
  background: #ff4444;
  position: relative;
  height: 100%;
}
/* 奇数列的行条区域层级更高 */
.row-1::before {
  content: '';
  position: absolute;
  top: 0; bottom: 0;
  left: 0; right: calc((20px + 2px) * 2);
  background: inherit;
  z-index: 1;
}
.row-2::before {
  content: '';
  position: absolute;
  top: 0; bottom: 0;
  left: calc((20px + 2px) * 1); right: calc((20px + 2px) * 1);
  background: inherit;
  z-index: 1;
}

/* 纵向列条基础样式 */
.col-thread {
  grid-row: 1 / -1;
  background: #4444ff;
  position: relative;
  width: 100%;
}
/* 偶数行的列条区域层级更高 */
.col-1::before {
  content: '';
  position: absolute;
  top: calc((20px + 2px) * 1); bottom: calc((20px + 2px) * 1);
  left: 0; right: 0;
  background: inherit;
  z-index: 1;
}
.col-2::before {
  content: '';
  position: absolute;
  top: 0; bottom: calc((20px + 2px) * 2);
  background: inherit;
  z-index: 1;
}

方案2:clip-path裁剪交叉区域

完全不用z-index,通过裁剪编织条的交叉区域,实现视觉上的交错效果,适合静态或规则固定的图案。

示例代码片段:

.row-thread {
  grid-column: 1 / -1;
  background: #ff4444;
  height: 100%;
  /* 裁剪偶数列位置,露出下方列条 */
  clip-path: polygon(
    0 0, 
    calc(25% - 1px) 0, calc(25% - 1px) 100%, calc(25% + 1px) 100%, calc(25% + 1px) 0,
    calc(75% - 1px) 0, calc(75% - 1px) 100%, calc(75% + 1px) 100%, calc(75% + 1px) 0,
    100% 0, 100% 100%, 0 100%
  );
}

.col-thread {
  grid-row: 1 / -1;
  background: #4444ff;
  width: 100%;
  /* 裁剪奇数行位置,露出下方行条 */
  clip-path: polygon(
    0 0, 100% 0, 100% calc(25% - 1px), 0 calc(25% - 1px), 0 calc(25% + 1px), 100% calc(25% + 1px),
    100% calc(75% - 1px), 0 calc(75% - 1px), 0 calc(75% + 1px), 100% calc(75% + 1px),
    100% 100%, 0 100%
  );
}

React集成与动态控制方案

将编织图案封装为可复用组件,通过状态管理实现行列数、颜色、编织规则的动态调整:

核心组件实现

import { useState } from 'react';

const LoomPattern = () => {
  const [rows, setRows] = useState(4);
  const [cols, setCols] = useState(4);
  const [rowColors, setRowColors] = useState(Array(rows).fill('#ff4444'));
  const [colColors, setColColors] = useState(Array(cols).fill('#4444ff'));

  // 定义编织规则:true=行压列,false=列压行
  const getWeaveRule = (rowIdx, colIdx) => 
    (rowIdx % 2 === 0 && colIdx % 2 === 0) || (rowIdx % 2 === 1 && colIdx % 2 === 1);

  const cellSize = 20;
  const gap = 2;
  const containerWidth = cols * (cellSize + gap) - gap;

  return (
    <div 
      className="loom"
      style={{
        display: 'grid',
        gridTemplateRows: `repeat(${rows}, ${cellSize}px)`,
        gridTemplateColumns: `repeat(${cols}, ${cellSize}px)`,
        gap: `${gap}px`,
        width: `${containerWidth}px`,
        background: '#eee'
      }}
    >
      {/* 渲染横向行条 */}
      {Array.from({ length: rows }).map((_, rowIdx) => (
        <div
          key={`row-${rowIdx}`}
          style={{
            gridColumn: '1 / -1',
            gridRow: rowIdx + 1,
            backgroundColor: rowColors[rowIdx],
            position: 'relative'
          }}
        >
          {Array.from({ length: cols }).map((_, colIdx) => {
            if (getWeaveRule(rowIdx, colIdx)) {
              return (
                <div
                  key={`row-${rowIdx}-col-${colIdx}`}
                  style={{
                    position: 'absolute',
                    top: 0,
                    bottom: 0,
                    left: `${colIdx * (cellSize + gap)}px`,
                    width: `${cellSize}px`,
                    backgroundColor: rowColors[rowIdx],
                    zIndex: 1
                  }}
                />
              );
            }
            return null;
          })}
        </div>
      ))}
      {/* 渲染纵向列条 */}
      {Array.from({ length: cols }).map((_, colIdx) => (
        <div
          key={`col-${colIdx}`}
          style={{
            gridRow: '1 / -1',
            gridColumn: colIdx + 1,
            backgroundColor: colColors[colIdx],
            position: 'relative'
          }}
        >
          {Array.from({ length: rows }).map((_, rowIdx) => {
            if (!getWeaveRule(rowIdx, colIdx)) {
              return (
                <div
                  key={`col-${colIdx}-row-${rowIdx}`}
                  style={{
                    position: 'absolute',
                    left: 0,
                    right: 0,
                    top: `${rowIdx * (cellSize + gap)}px`,
                    height: `${cellSize}px`,
                    backgroundColor: colColors[colIdx],
                    zIndex: 1
                  }}
                />
              );
            }
            return null;
          })}
        </div>
      ))}
    </div>
  );
};

export default LoomPattern;

动态扩展方向

  • 行列数调整:添加输入框,通过setRows/setCols同步更新颜色数组
  • 自定义颜色:给每行/每列添加颜色选择器,修改rowColors/colColors状态
  • 编织规则切换:预设平纹、斜纹等规则,修改getWeaveRule逻辑
  • 性能优化:行列数过大时,改用Canvas渲染替代DOM元素

内容的提问来源于stack exchange,提问作者async await

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:10:09