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

如何通过CSS/LESS利用类修改其他Canvas元素宽度?

实现Canvas点击选中后其余元素宽度变化的交互

方案一:CSS + 极简JS(推荐,依赖CSS :has选择器)

利用CSS的:has选择器可以简洁实现需求,无需在JS里手动控制非选中元素样式:

样式部分

/* 所有Canvas的默认样式,可按需调整默认宽度 */
canvas {
  width: 300px;
  height: 200px;
  border: 1px solid #ddd;
  transition: width 0.3s ease; /* 添加入场过渡,提升交互体验 */
  display: inline-block;
  margin: 0 8px;
}

/* 当页面存在选中的Canvas时,未选中元素宽度变为100px */
body:has(.selected) canvas:not(.selected) {
  width: 100px;
}

交互逻辑部分

const allCanvases = document.querySelectorAll('canvas');

allCanvases.forEach(canvas => {
  canvas.addEventListener('click', () => {
    // 先移除所有Canvas的选中状态
    allCanvases.forEach(c => c.classList.remove('selected'));
    // 给当前点击的Canvas添加选中类
    canvas.classList.add('selected');
  });
});

方案二:纯JS控制(兼容不支持:has的旧浏览器)

如果需要兼容不支持:has选择器的环境,可直接在JS中控制每个Canvas的宽度:

const allCanvases = document.querySelectorAll('canvas');
const DEFAULT_WIDTH = '300px'; // 替换为你的默认宽度值

allCanvases.forEach(canvas => {
  canvas.addEventListener('click', () => {
    allCanvases.forEach(c => {
      if (c === canvas) {
        c.classList.add('selected');
        c.style.width = DEFAULT_WIDTH; // 恢复默认宽度
      } else {
        c.classList.remove('selected');
        c.style.width = '100px';
      }
    });
  });
});

说明

  • 方案一的:has选择器已被现代主流浏览器支持(Chrome 105+、Firefox 121+、Safari 15.4+),代码简洁且样式与逻辑分离。
  • 方案二兼容性更强,适合需兼容旧版浏览器的场景。

内容的提问来源于stack exchange,提问作者Jonas Cannehag

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:37:11