最近做一个流程图绘制项目,所以研究了一下svg。发现svg目前浏览器支持的挺强大的,但是svg本身有很多背景知识和元素属性以及js库等,如何系统地掌握这一强大工具呢?
viewPort(视窗)和viewBox(视野)
这两个词的翻译还是比较好的!你站在屋子里通过窗户来看外面的世界。窗户的大小是固定的,比如是400*200,可外面的世界是无限大的!那是不是你就只能看到窗户大小般的世界和井底之蛙一般呢?如果真是这样,那viewBox就没用了。想想看,如果你里窗户越远,是不是看到的越多呢?当你和窗户津贴成二维平面时,就真的是井底之蛙了。所以viewBox就很有意义了!
svg是html标签,类似于canvas,代表上面所说的viewPort.这里浏览器会渲染一块
400*200
的空白区域(窗户)。我们发现上面的宽高属性没有单位,所以默认是px.所以我们应该看到的是一块100px*100px的绿色正方形
但是结果不是我们想要的
首先html width,height属性如果没有单位就是px,svg是
400*200
,没有问题。但是里面的rect明明是
100*100
怎么就变成了200*200
结论
svg标签包裹的世界(代表是viewBox
viewBox="0 0 200 50"
)和外部html(代表是viewPortwidth="400" height="200"
)的世界不是一体的。如果上面的svg元素没有viewBox和preserveAspectRatio属性,那viewPort和viewBox的单位像素是1:1的,我们通过改变viewBox属性,改变两个世界的单位像素比例.
两个世界(viewPort和viewBox)的单位像素
怎么理解两个世界
demo: 1.html