Skip to content
组件参考

ak-object 物体

Cube 立方体

单个预览

拖动滑块设置 X、Y、Z 轴旋转角度,或选择六面视角检查图标和边框。点击「重置」恢复初始角度。

PREVIEW / OBJECT/PREVIEWCube preview
SOURCE / HTML
html
<div id="cube-preview" style="width: 100%; max-width: 480px">
  <div class="perspective" style="display: grid; place-items: center; height: 220px; perspective-origin: center">
    <div class="ak-cube" style="--cube-size: 100px; --cube-border-width: 4px; transform: rotateX(-20deg) rotateY(30deg) rotateZ(0deg)">
      <div class="ak-face front">
        <svg class="ak-icon" aria-hidden="true"><use href="#icon-warning"></use></svg>
        <div class="ak-face__lines">
          <i class="ak-face__line--tl"></i><i class="ak-face__line--tr"></i>
          <i class="ak-face__line--bl"></i><i class="ak-face__line--br"></i>
        </div>
      </div>
      <div class="ak-face back"></div><div class="ak-face right"></div>
      <div class="ak-face left"></div><div class="ak-face top"></div><div class="ak-face bottom"></div>
    </div>
  </div>
  <div style="display: grid; gap: 12px">
    <label style="display: flex; align-items: center; gap: 12px">X 轴
      <input type="range" name="x" aria-label="X 轴旋转" min="-180" max="180" value="-20" style="flex: 1; min-width: 0">
      <output style="width: 5ch; text-align: right">-20°</output>
    </label>
    <label style="display: flex; align-items: center; gap: 12px">Y 轴
      <input type="range" name="y" aria-label="Y 轴旋转" min="-180" max="180" value="30" style="flex: 1; min-width: 0">
      <output style="width: 5ch; text-align: right">30°</output>
    </label>
    <label style="display: flex; align-items: center; gap: 12px">Z 轴
      <input type="range" name="z" aria-label="Z 轴旋转" min="-180" max="180" value="0" style="flex: 1; min-width: 0">
      <output style="width: 5ch; text-align: right">0°</output>
    </label>
    <div style="display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px" aria-label="预设视角">
      <button class="ak-button" style="width: calc(25% - 6px); height: 36px" data-view="front">正面</button>
      <button class="ak-button" style="width: calc(25% - 6px); height: 36px" data-view="back">背面</button>
      <button class="ak-button" style="width: calc(25% - 6px); height: 36px" data-view="left">左面</button>
      <button class="ak-button" style="width: calc(25% - 6px); height: 36px" data-view="right">右面</button>
      <button class="ak-button" style="width: calc(25% - 6px); height: 36px" data-view="top">顶面</button>
      <button class="ak-button" style="width: calc(25% - 6px); height: 36px" data-view="bottom">底面</button>
      <button class="ak-button" style="width: calc(25% - 6px); height: 36px" data-view="reset">重置</button>
    </div>
  </div>
</div>

<script>
  const preview = document.querySelector('#cube-preview')
  const cube = preview.querySelector('.ak-cube')
  const sliders = Array.from(preview.querySelectorAll('input[type="range"]'))
  const views = {
    front: [0, 0, 0], back: [0, 180, 0], left: [0, 90, 0],
    right: [0, -90, 0], top: [-90, 0, 0], bottom: [90, 0, 0],
    reset: [-20, 30, 0],
  }
  function update() {
    const [x, y, z] = sliders.map(slider => Number(slider.value))
    cube.style.transform = `rotateX(${x}deg) rotateY(${y}deg) rotateZ(${z}deg)`
    sliders.forEach(slider => {
      slider.nextElementSibling.value = `${slider.value}°`
    })
  }
  sliders.forEach(slider => slider.addEventListener('input', update))
  preview.querySelectorAll('[data-view]').forEach(button => {
    button.addEventListener('click', () => {
      views[button.dataset.view].forEach((angle, index) => { sliders[index].value = angle })
      update()
    })
  })
</script>

战术地图

原生 JavaScript 示例生成了一组战术地图方块,不依赖 Vue 或其他运行时。

PREVIEW / OBJECT/CUBETactical cubes
SOURCE / HTML
html
<div class="perspective" id="tactical-map" aria-label="战术地图"></div>

<script>
  const map = document.querySelector('#tactical-map')
  const cube = color => `
    <div class="ak-cube" style="--cube-size: 52px; --cube-border-width: 4px; ${color ? `--cube-color: ${color}` : ''}">
      <div class="ak-face front">
        <svg class="ak-icon" aria-hidden="true"><use href="#icon-warning"></use></svg>
        <div class="ak-face__lines">
          <i class="ak-face__line--tl"></i><i class="ak-face__line--tr"></i>
          <i class="ak-face__line--bl"></i><i class="ak-face__line--br"></i>
        </div>
      </div>
      <div class="ak-face back"></div><div class="ak-face right"></div>
      <div class="ak-face left"></div><div class="ak-face top"></div><div class="ak-face bottom"></div>
    </div>`

  map.innerHTML = Array.from({ length: 30 }, (_, index) => cube(index > 19 ? 'rgba(246, 84, 14, 0.65)' : '')).join('')
</script>
VariableDescription
--cube-color立方体颜色
--cube-size立方体宽高
--cube-border-width立方体边框宽度

Unofficial ak-ui design language study.