当前位置:首页 > JavaScript

js实现弧形座位图

2026-03-01 18:05:05JavaScript

使用Canvas绘制弧形座位图

通过HTML5 Canvas可以灵活绘制弧形排列的座位图。以下是一个基础实现示例:

const canvas = document.getElementById('seatCanvas');
const ctx = canvas.getContext('2d');
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
const radius = 150;
const seatCount = 12;
const seatSize = 20;

for (let i = 0; i < seatCount; i++) {
  const angle = (i * 2 * Math.PI / seatCount) - Math.PI/2;
  const x = centerX + radius * Math.cos(angle);
  const y = centerY + radius * Math.sin(angle);

  ctx.beginPath();
  ctx.arc(x, y, seatSize, 0, 2 * Math.PI);
  ctx.fillStyle = '#3498db';
  ctx.fill();
  ctx.stroke();

  // 座位编号
  ctx.fillStyle = '#fff';
  ctx.font = '12px Arial';
  ctx.textAlign = 'center';
  ctx.textBaseline = 'middle';
  ctx.fillText(i+1, x, y);
}

使用SVG实现弧形座位

SVG更适合需要交互的场景,以下是SVG实现方式:

js实现弧形座位图

<svg width="400" height="400" id="seatSvg">
  <g transform="translate(200,200)">
    <script>
      const seatCount = 8;
      const radius = 150;
      const seatSize = 20;

      for (let i = 0; i < seatCount; i++) {
        const angle = (i * 360 / seatCount) - 90;
        const radian = angle * Math.PI / 180;
        const x = radius * Math.cos(radian);
        const y = radius * Math.sin(radian);

        const seat = document.createElementNS("http://www.w3.org/2000/svg", "circle");
        seat.setAttribute("cx", x);
        seat.setAttribute("cy", y);
        seat.setAttribute("r", seatSize);
        seat.setAttribute("fill", "#e74c3c");
        seat.setAttribute("class", "seat");
        seat.setAttribute("data-seat", i+1);

        const text = document.createElementNS("http://www.w3.org/2000/svg", "text");
        text.setAttribute("x", x);
        text.setAttribute("y", y);
        text.setAttribute("fill", "white");
        text.setAttribute("text-anchor", "middle");
        text.setAttribute("dominant-baseline", "central");
        text.textContent = i+1;

        document.getElementById("seatSvg").appendChild(seat);
        document.getElementById("seatSvg").appendChild(text);
      }
    </script>
  </g>
</svg>

使用CSS变换实现

纯CSS方案适合简单场景,结合JavaScript动态生成:

js实现弧形座位图

<div class="stage">
  <div class="arc-seats"></div>
</div>

<style>
  .stage {
    position: relative;
    width: 400px;
    height: 400px;
  }
  .arc-seats {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
  .seat {
    position: absolute;
    width: 30px;
    height: 30px;
    background: #2ecc71;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
  }
</style>

<script>
  const container = document.querySelector('.arc-seats');
  const seatCount = 10;
  const radius = 150;

  for (let i = 0; i < seatCount; i++) {
    const seat = document.createElement('div');
    seat.className = 'seat';
    seat.textContent = i+1;

    const angle = (i * 360 / seatCount) - 90;
    const radian = angle * Math.PI / 180;
    const x = radius * Math.cos(radian);
    const y = radius * Math.sin(radian);

    seat.style.transform = `translate(${x}px, ${y}px)`;
    container.appendChild(seat);
  }
</script>

添加交互功能

为Canvas方案添加点击检测的示例:

canvas.addEventListener('click', (e) => {
  const rect = canvas.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;

  for (let i = 0; i < seatCount; i++) {
    const angle = (i * 2 * Math.PI / seatCount) - Math.PI/2;
    const seatX = centerX + radius * Math.cos(angle);
    const seatY = centerY + radius * Math.sin(angle);

    const distance = Math.sqrt((x - seatX)2 + (y - seatY)2);
    if (distance <= seatSize) {
      console.log(`Seat ${i+1} clicked`);
      ctx.fillStyle = '#e74c3c';
      ctx.beginPath();
      ctx.arc(seatX, seatY, seatSize, 0, 2 * Math.PI);
      ctx.fill();
      break;
    }
  }
});

参数化配置

创建可配置的弧形座位生成函数:

function createArcSeats(options) {
  const defaults = {
    container: '#seatContainer',
    radius: 200,
    seats: 12,
    seatSize: 15,
    startAngle: -90,
    endAngle: 90,
    fillColor: '#3498db',
    textColor: '#fff'
  };

  const config = {...defaults, ...options};
  const centerX = config.radius + config.seatSize;
  const centerY = config.radius + config.seatSize;

  // 实现逻辑...
}

// 调用示例
createArcSeats({
  container: '#theaterSeats',
  seats: 24,
  radius: 250,
  startAngle: -60,
  endAngle: 60
});

以上方案可根据实际需求选择,Canvas适合复杂绘制,SVG适合需要DOM操作的场景,CSS方案适合简单可视化。每种方法都可以扩展添加更多功能如座位状态管理、动画效果等。

标签: 弧形座位
分享给朋友:

相关文章

css制作弧形

css制作弧形

使用 border-radius 创建简单弧形 通过调整 border-radius 属性可以创建弧形效果。将 border-radius 设置为元素高度的一半,可以得到一个半圆形。例如: .arc…

vue实现选座位

vue实现选座位

Vue 实现选座位功能 数据准备 创建一个座位数组,每个座位对象包含唯一标识符、行列位置和选中状态。示例数据结构如下: data() { return { seats: […