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

如何检测canvas父div的Bootstrap类 按col-sm属性动态设置画布尺寸

问题原因

原有判断逻辑的错误在于,document.querySelector('.col-sm-12')是检索整个文档内是否存在任意col-sm-12类的元素,而非判断当前canvas的父容器是否是col-sm-12,因此判断结果完全不符合预期。

解决方案

使用Element.closest()方法,从当前canvas元素向上遍历所有祖先节点,匹配最近的符合类名规则的元素,即可准确判断所处容器的类。

完整实现代码

单个指定ID的画布版本

// 替换为你实际的canvas ID,比如canvas-id-1或canvas-id-2
let canvas = document.getElementById('canvas-id-1');
let ctx = canvas.getContext("2d");

// 核心判断:向上找最近的col-sm-12祖先元素
if (canvas.closest('.col-sm-12')) {
  canvas.width = 800;
  canvas.height = 400;
} else {
  canvas.width = 500;
  canvas.height = 400;
}

var image = new Image();
// 替换为你实际的图片地址
image.src = 'http://t2.gstatic.com/images?q=tbn:ANd9GcQQveW9AJCxOC8Phnq3vptJIxPFHlxNw63q4pudc66dM4O96vtm';
image.onload = function () {
  ctx.drawImage(image,
    canvas.width / 2 - image.width / 2,
    canvas.height / 2 - image.height / 2
  );
}

批量处理所有.image-canvas类画布版本

如果页面上有多个画布,不用逐个指定ID,可直接批量处理:

document.querySelectorAll('.image-canvas').forEach(canvas => {
  const ctx = canvas.getContext("2d");
  // 自动判断容器类设置尺寸
  canvas.width = canvas.closest('.col-sm-12') ? 800 : 500;
  canvas.height = 400;

  const image = new Image();
  // 可根据canvas的自定义属性、ID等匹配对应图片地址
  image.src = '对应画布的图片地址';
  image.onload = () => {
    ctx.drawImage(image,
      canvas.width / 2 - image.width / 2,
      canvas.height / 2 - image.height / 2
    );
  };
});

兼容老浏览器的替代方案

如果需要兼容不支持closest方法的旧版浏览器,可以自己实现父级类名判断逻辑:

function checkParentHasClass(element, className) {
  let currentEl = element;
  while (currentEl) {
    if (currentEl.classList?.contains(className)) {
      return true;
    }
    currentEl = currentEl.parentElement;
  }
  return false;
}

// 调用方式
const isInCol12 = checkParentHasClass(canvas, 'col-sm-12');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:24:03