当前位置:首页 > 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实现方式:

<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动态生成:

<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;
    }
  }
});

参数化配置

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

js实现弧形座位图

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方案适合简单可视化。每种方法都可以扩展添加更多功能如座位状态管理、动画效果等。

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

相关文章

js实现弧形

js实现弧形

实现弧形的方法 在JavaScript中,实现弧形可以通过多种方式,以下是几种常见的方法: 使用Canvas绘制弧形 Canvas API提供了arc()方法来绘制弧形。以下是一个示例代码: co…

vue实现座位

vue实现座位

Vue实现座位功能 在Vue中实现座位功能通常涉及以下几个关键步骤: 数据建模 使用二维数组或对象数组表示座位布局,每个座位对象包含属性如id、row、column、status(可选/已选/不可选…

vue实现座位

vue实现座位

Vue 实现座位功能 在 Vue 中实现座位功能通常涉及展示可选择的座位布局,处理用户交互,以及管理座位状态。以下是实现步骤: 1. 数据结构设计 使用数组或对象存储座位信息,每个座位包含唯一标识…

vue实现弧形选择

vue实现弧形选择

Vue 实现弧形选择器 弧形选择器通常用于视觉化选择场景,如时间选择、角度选择等。以下是基于 Vue 的实现方法: 基本思路 通过 SVG 或 Canvas 绘制弧形轨道,结合触摸/鼠标事件实现交互…

js实现弧形

js实现弧形

使用Canvas绘制弧形 Canvas API提供了arc()方法用于绘制弧形或圆形。该方法需要圆心坐标、半径、起始角度和结束角度等参数。 const canvas = document.getEl…

vue实现座位

vue实现座位

Vue 实现座位功能 使用 Vue 实现座位功能通常涉及动态渲染座位布局、处理选座逻辑以及状态管理。以下是实现步骤和代码示例: 基础实现方案 数据准备 定义座位数据结构,通常使用二维数组或对象数组:…