Canvas默认inline导致底部留白,应设vertical-align:top或display:block;width/height属性决定分辨率,CSS仅控制显示尺寸;Flex居中需父容器定宽高并设display:block;绝对定位不影响内部坐标系。
直接写 时,它表现得像一个字母(比如 x),底部对齐父容器的 baseline,导致下方留白——这不是 margin 或 padding,而是 vertical-align 的默认行为。常见现象:Canvas 下方多出几像素空白,紧贴其后的元素被顶开。
设置 vertical-align: top、middle 或 bottom(推荐 top)display: block(最常用,彻底脱离行内流)float 布局,现代项目优先用 Flex 或 GridCSS 的 width 和 height 只控制渲染尺寸,不改变绘图坐标系;真正决定画布“分辨率”的是 canvas.width 和 canvas.height 属性(注意:不是 HTML 属性,是 JS 属性或 DOM 属性)。混淆会导致图像模糊、拉伸或缩放失真。
canvas.width = 800、canvas.height = 600,再用 CSS 控制显示大小(如 width: 100%; height: auto) —— 此时画布实际渲染分辨率为 300×150(浏览器默认),会被 CSS 拉伸resize 并同步更新 canvas.width/canvas.height,再重绘
Flex 是目前最简洁可控的 Canvas 布局方式
,但要注意主轴方向与对齐属性的组合逻辑。
justify-content 控制水平,align-items 控制垂直(对单个子项有效)100vh),否则 Flex 无法计算居中基准display: block,避免 inline 行内特性干扰flex: 1,应结合 JS 动态重设 width/height
position: absolute 改变的是 Canvas 元素在页面中的位置,不影响其内部绘图坐标系。这点常被误认为“Canvas 坐标会跟着偏移”。
canvas.style.left = "50px" 后,ctx.fillRect(0,0,10,10) 仍从 Canvas 左上角开始画,只是整个 Canvas 被挪到了距左侧 50px 处ctx.translate(50, 0)
top/left 值后,记得给父容器加 position: relative,否则会相对于 viewport 定位width/height 的双重含义,以及 inline 元素的 vertical-align 隐形干扰——这两个点踩中一个,布局就容易失控。