• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > 深入解析HTML5使用SVG图像时的viewBox属性用法

深入解析HTML5使用SVG图像时的viewBox属性用法

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-08-06

本文主要包含HTML5,SVG,viewBox等相关知识,佚名 希望在学习及工作中可以帮助到您

快速了解viewBox的参数

viewBox属性是用于指定用户SVG图像的坐标系统的原点以及尺寸的。所有在SVG内绘制的内容都是相对于这个坐标系统完成的。因为SVG画布在所有方向都是无限延长的,你甚至可以在这个坐标系统的边界之外的地方绘制图形;但是这些相对于SVG视窗定位的图形,也可以由用户坐标系的位置来控制。

viewBox属性使用四个参数来指定坐标系原点的位置以及它的尺寸:x y width height。初始情况下,这个坐标系等同于初始化的视窗坐标系(由SVG图像的width和height确定),而且它的原点是在(0, 0)——即SVG的左上角。

通过改变x和y这两个参数的值,可以调整原点的位置。改变width和height的值,可以改变坐标系统的尺寸。只使用viewBox属性,就可以帮你扩展或裁剪SVG画布。跟着示例一起阅读。

重要提示:在本文章中,我不会改变viewBox在SVG视窗内的默认行为(比例和位置)。因为,根据属性的默认行为,viewBox的内容会被尽可能地完全包含在视窗内,然后放置在中心位置。不过,使用preserveAspectratio属性可以让你自由地改变viewBox的尺寸和位置,但是在这篇文章中,这不是必需的技术,所以我们也不会在这里深入讲解。
使用viewBox裁剪SVG,即使用viewBox属性制作Art Direction的SVG

前阵子,我的一个客户要求把他网站的SVG头像按照不同的屏幕尺寸设置成不同的大小,从而使得它只有一小部分是在小屏幕上可见的,在中等的屏幕尺寸上可以看到再大一点的部分,然后在大屏幕上可以看到完整的内容。当时我脑子里首先出现的想法就是,他的要求其实是使用viewBox属性来裁剪SVG图像,然后根据不同的屏幕尺寸,显示他想要看到的图像的某部分。

通过改变SVG坐标系统的尺寸和原点位置,我们可以把SVG进行裁剪,并显示我们希望在视窗中显示的那部分内容。

我们来看看如何实现。

假设我们有如下这张完整的SVG图像,然后我们想要把它裁剪成小屏幕的尺寸。这张图是Freepik设计的可免费使用的房屋矢量图,该图片有Creative Commons Attribution 3.0 Unported协议的许可授权。为了简单起见,我们先假设图像只是要被裁剪成在中小屏幕上显示的内容,以及大屏幕上显示的完整的内容,如下所示。

左边的图的是我们将要使用viewBox属性裁剪的完整的图片,右边的图是我们希望在小屏幕上显示的区域。

现在,通过改变viewBox属性的值来裁剪SVG。有一些需要考虑的内容,我们等下会讲到。但是首先,我们要改变坐标系统,让它匹配上面的图片中虚框矩形区域的内容。,通过调整系统的原点以及width和height的值,我们可以改变它初始的0 0 800 800参数值。

但是我们要如何获知新坐标和新尺寸呢?重点是不要经过大量重复的实验和错误。

有几种方式。因为我们已经在图形编辑器中(我的示例使用的是AI),我们可以使用编辑器的面板来获取元素的位置和尺寸。

我画这个虚线的矩形框,除了用来表示我想要在小屏幕上显示的内容,还有一个原因就是:我们可以获取这个矩形的位置和尺寸,然后把它们作为viewBox的值来使用。使用AI的变换面板(如下图),我们获取了我们需要的这些值。通过选择矩形,并点击右上角的变换链接,我们得到了如下图所示的面板,包括我们所需要的x, y, width和height值。

这个AI中的变换面板可以用来获取选中矩形的位置和尺寸的值

你可能注意到了,上面的值并不是整数,所以我们需要手动修改。根据上面的信息,我们把viewBox的值改成 0 200 512 512。

因为新的viewBox的宽高比和SVG视窗的宽高比是一样的(都是正方形),viewBox内的内容将会扩大,并且只有被选中的区域会在视窗中显示。改变viewBox的值之后,结果如图:

新裁剪的SVG。只有我们指定使用viewBox属性的位置在视窗中是可见的。蓝色边框表示SVG的视窗。

在这一点上,有一个问题需要解决:

如果被裁剪区域(即viewBox)的宽高比 != SVG视窗的宽高比?

在这种情况下,将会有明显的溢出。明显的溢出,我指的不是超出SVG视窗边界的延伸,而是viewBox定义的相对于新用户坐标系统的溢出。下图作了相应的说明。

如果viewBox的宽高比和视窗的宽高比不同,SVG中的内容会溢出用户坐标系统,结果可能会是这样。

黑色边框代表新的用户坐标系,蓝色边框是SVG视窗。

上边右图中的黑色边框是viewBox定义的区域。根据viewBox在视窗内的默认行为,它会被居中并尽可能放大,来保证自身内容尽可能地包含在视窗(蓝色边框)中。

因为SVG画布从概念上来说,在所有方向都是无限延伸的,你可以在用户坐标系统边界之外绘制图形,内容会直接溢出移动,如上图所示。

如果你改变了SVG视窗的宽高比(SVG的width和height),来让它们适应viewBox的宽高比,你就不会看到溢出了,因为viewBox的缩放是适应视窗的,和前面的示例一样。

但是,在某些情况下,你可能不能或根本不想改变SVG的宽高比。比如说,如果你是使用SVG sprite作为一组图像来显示页面上图片的。在大多数情况下,图像都有一个固定的宽高比——而且你并不想改变改变图像的尺寸,就为了适应它里面的某一张小图的内容。或者可能你嵌入了一个图标系统,并希望所有的图标在同一个时间都保持相同的尺寸。

为了剪掉多余的东西(比如说,sprite上的部分其它图标,在视窗中显示),你可以使用<clipPath>来把多余的部分裁剪掉。裁剪路径可以是一个覆盖了整个viewBox区域的<rect>元素,然后将该元素应用到root SVG。

但是,还有一点要记住:确保<rect>的x和y属性和viewBox的保持一致,除非rect将被相对定位于原来的/初始化的系统的原点,那么SVG最终被裁剪的内容也是不确定的。

  1. <svg xmlns="http://w3.org/2000/svg" viewBox="vx vy width height" clip-path="url(#clipper)" width=".." height="..">   
  2.     <!-- SVG content here -->   
  3.     <clipPath id="clipper">   
  4.         <rect x="vx" y="vy" width="100%" height="100%"></rect>   
  5.     </clipPath>   
  6. </svg>  

当然,裁剪多余的部分也就意味着你仍然在使用不同的宽高比,还是需要解决内容两边多出的空白。如果SVG是一个连续的场景,像我们前面的那个例子,那就没必要了,因为你还需要调整视窗的宽高比。如果SVG是一组图标,并且你只是在不同的视窗中使用一次,这可能就不是问题了。

这里有一点重要的东西要记住,viewBox的宽高比最好还是和视窗的宽高比保持一致;另外,你需要设置固定来避免SVG中任何不确定的多余的空白出现。

所以,viewBox可以用来裁剪SVG,并根据需要只展示SVG的某部分内容。但是它要如何应用于实例呢?

在响应式设计中的Art Directing SVG

这部分没有什么需要补充的内容,除了实际过程的代码。所以,假设你有如上所示的SVG,并且想要把它作为头像,比如说,在中小尺寸的屏幕上你只想显示裁剪下来的那部分内容,然后在大屏幕上显示完整的头像。

改变SVG视窗的width和height值,我们可以使用CSS。但是改变viewBox的值,目前我们需要使用JavaScript。

并非所有的SVG属性,CSS属性都可以等同使用;只有一组具有和CSS属性相同效果的属性才可以在CSS中设置。你可以在这个表格中查看这组可以作为CSS属性的SVG属性的概述。在SVG2中,很多属性(如x, y, cx, cy, r等等)都可以被添加到这个列表中;但是这些都是我们现在可以使用的属性。

为了展示SVG的不同部分,需要基于不同媒体

您可能想查找下面的文章:

  • HTML5知识点总结
  • HTML5的本地存储
  • HTML5本地存储之IndexedDB
  • Html5实现文件异步上传功能
  • Html5新标签datalist实现输入框与后台数据库数据的动态匹配
  • 详解HTML5 window.postMessage与跨域
  • HTML5拖放API实现拖放排序的实例代码
  • 解决html5中video标签无法播放mp4问题的办法
  • HTML5新特性 多线程(Worker SharedWorker)
  • Html5新增标签有哪些

相关文章

  • 2018-12-03javascript html5 canvas实现可拖动省份的中国地图
  • 2018-12-03HTML5漫谈(1)–什么是HTML5?
  • 2018-12-03REM相对单位使用案例分享
  • 2018-12-03html5设置或返回音频/视频是否应该在结束时再次播放的属性loop
  • 2018-12-03HTML5 Canvas处理头像上传的图文代码详细介绍
  • 2017-08-06HTML5之tabindex属性全面解析
  • 2018-12-03详解HTML5中ol标签的用法_html5教程技巧
  • 2018-12-03HTML5是什么,HTML5有哪些特性和优缺点?
  • 2018-12-03使用HTML5中的localStorage实现记住密码功能
  • 2018-12-03分享DOM中的表单操作,节点操作

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • H5应用缓存-Manifest的具体介绍
    • localStorage存储读取JSON怎样实现
    • 如何用H5实现一个触屏版的轮播器的实例
    • html5定位并在百度地图上显示的示例
    • HTML5获取地理位置信息
    • 基于HTML5 的人脸识别技术
    • 使用html5+css3来实现slider切换效果告别javascript+css
    • canvas学习和滤镜实现代码
    • 关于HTML5 Canvas旋转动画的2个例子
    • 想学习 HTML5 ,应该怎么入门? 有什么好点的书推荐的吗?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有