浅谈ViewBox那些事(二)

264 阅读3分钟

上一篇文章里我们真的是浅谈了一下ViewBox相关的理论,列举的是正方形,上篇文章的理论不仅适用于正方形,还适用于 “一切ViewBox自身的长宽比 == svg自身的长宽比” 的情况。

但是有些情况下,开发者还是会存在非常规的情况(ViewBox的长宽比 != svg的长宽比),那这个时候,ViewBox如何适应指定长宽的svg呢?

一句话:“ViewBox在哪个位置上以什么标准去适应svg?”。

这就得提到 preserveAspectRatio 属性了。

它的语法如下:

preserveAspectRatio = "align meetOrSlice"

// 默认值如下:
preserveAspectRatio = "xMidYMid meet"
  • align决定了ViewBox在X轴、Y轴上如何与svg对齐。
  • meetOrSlice决定了ViewBox到底是以较长边还是较短边去缩放以此来适应svg。

大家在阅读过程中,如果有对坐标系统不理解的,请看这篇文章

meetOrSlice

取值范围2个,分别是meet(默认值)、slice。

这2个值都是在保证ViewBox自身长宽比的情况下去缩放,有点类似 “background-size”。meet是在svg可视范围内尽可能的完整显示ViewBox,而slice是要占满整个svg的可视区域。

<style>
   svg {
       background-color: antiquewhite;
   }
</style>
<svg
      width="500"
      height="200"
      preserveAspectRatio="xMinYMin meet"
      ViewBox="20 20 200 100"
>
  <path 
      d="
          M 20 20
          L 220 120
      "
      stroke="black"
   ></path>
</svg>

截屏2025-01-19 12.16.09.png

上面是meet的效果,而slice的效果如下:

截屏2025-01-19 12.22.26.png

align

写法是小驼峰,比较好记忆。无论x、Y,它们的取值范围都是固定的集合【Min、Mid、Max】。

与之对应,大家可以理解为左对齐、中间对齐、右对齐。

我们还是以上面的代码为例,当 “Y不变,并且保证svg里始终都能显示完整的ViewBox”的情况下,我们看看这3个值在x轴上的变化(Y轴的变化情况与x一样,大家自行举一反三)。

Min

截屏2025-01-19 12.49.19.png

Min的含义就是“ViewBox的语法参数里,第一个参数就是svg可视范围内的x轴上的原点,第二个参数就是svg可视范围内的y轴上的原点”。

Mid

截屏2025-01-19 12.48.25.png

Mid的含义就是两个中点对齐(即逻辑上的中点物理长度上的中点对齐)。我们继续以x轴为例,首先ViewBox在逻辑上的坐标系统起点(20,20),终点(220,120),逻辑上的中点(120, 70),所以逻辑上的中点120与物理长度的中点对齐。那在横轴上的效果自然就是居中对齐。

Max

截屏2025-01-19 12.47.44.png

这个MDN的解释比较怪异,不太建议大家直接用这个属性,从表现形式上看的话,差不多是右对齐的形式,如果有知道这个属性含义的,大家可以评论区里讨论一下,哈哈哈。

最后

本期内容到这里就结束啦,两篇文章我们讲完了ViewBox的那些事,希望我的文章能够对你有帮助,那么我们下期再见~~