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

用JavaScript获取图片尺寸匹配canvas实现放射状文字链接效果

问题根因

  • getElementsByClassName返回的是匹配类名的元素集合,不是单个DOM元素,直接取.width会返回undefined
  • 脚本执行时图片还未完成加载,此时读取图片尺寸会得到0或空值
  • 仅通过CSS设置了canvas的显示宽高,未设置canvas元素本身的width/height属性,会导致绘制内容拉伸变形
  • canvas的定位用了固定的margin百分比和固定宽高,和图片的响应式规则不绑定,无法自适应对齐

修复方案

调整DOM结构把canvas和图片放在同一个父容器内,方便定位对齐,再修改JS逻辑,等图片加载完成后再获取尺寸、初始化canvas。

调整后的HTML

<div class="logo-wrapper">
  <canvas id="myCanvas">Error</canvas>
  <img class="logo_centrale" src="img.png" alt="Errore" >
</div>

调整后的CSS

body {
  position: fixed;
  background-color: black;
  margin: 0;
}
* {
  box-sizing: border-box;
}
.logo-wrapper {
  position: relative;
  width: 45%;
  margin: 10% auto 0;
}
.logo_centrale{   
  z-index: -1;
  width: 100%;
  display: block;
}
#myCanvas{  
  z-index: 2;
  position:absolute;
  left: 0;
  top: 0;
  border: 3px solid #f00;
}

调整后的JS

// 等待页面所有资源加载完成后执行
window.onload = function() {
  const img = document.querySelector('.logo_centrale');
  const canvas = document.getElementById('myCanvas');
  const ctx = canvas.getContext('2d');
  
  // 获取图片实际渲染的宽高
  const imgWidth = img.offsetWidth;
  const imgHeight = img.offsetHeight;
  
  // 同时设置canvas的元素属性和CSS样式,保证绘制比例和显示比例一致
  canvas.width = imgWidth;
  canvas.height = imgHeight;
  canvas.style.width = imgWidth + 'px';
  canvas.style.height = imgHeight + 'px';
  
  // 绘制圆形,圆心为图片中心
  const centerX = imgWidth / 2;
  const centerY = imgHeight / 2;
  ctx.beginPath();
  ctx.strokeStyle = '#fff';
  // 半径取宽高最小值的80%,避免超出图片范围
  ctx.arc(centerX, centerY, Math.min(centerX, centerY) * 0.8, 0, 2 * Math.PI);
  ctx.stroke();
}

后续开发提示

后续做放射状文字的话,直接以centerX、centerY为圆心计算每个文字的角度、坐标即可,响应式缩放时只要监听窗口的resize事件,重新获取图片尺寸、更新canvas宽高、重绘内容即可适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:36:07