直接运行此例子

深入理解svg的viewport、viewbox、preserveaspectradio实例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="author" content="李可">
  6. <title>svgviewBox的特写过程。演示动画</title>
  7. <style>
  8. div {
  9. box-sizing: border-box;
  10. }
  11. span {
  12. font-weight: bolder;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <fieldset style="width:800px;">
  18. <legend>
  19. <h2>viewport,viewBox,preserveAspectRatio演示-李可</h2>
  20. </legend>
  21. <h4>viewport: </h4>
  22. <label for="viewportWidthNumber">width:</label>
  23. <input type="number" id='viewportWidthNumber' value="400" oninput="updateView('#svg','width',this.value)" />
  24. <label for="viewportHeightNumber">height:</label>
  25. <input type="number" id='viewportHeightNumber' value="300" oninput="updateView('#svg','height',this.value)" />
  26. <h4>viewBox: </h4>
  27. <label for="viewBoxWidthNumber">width:</label>
  28. <input type="number" id='viewBoxWidthNumber' value="40" oninput="updateView('#react','width',this.value)" />
  29. <label for="viewBoxHeightNumber">height:</label>
  30. <input type="number" id='viewBoxHeightNumber' value="30" oninput="updateView('#react','height',this.value)" />
  31. <h4>preserveAspectRatio(align,meetOrSlice)</h4>
  32. <select name="align" id="align" onchange="preserveAspectRadioFirst(this.value)">
  33. <option value="none">none</option>
  34. <option value="xMinYMin">xMinYMin</option>
  35. <option value="xMinYMid">xMinYMid</option>
  36. <option value="xMinYMax">xMinYMax</option>
  37. <option value="xMidYMin">xMidYMin</option>
  38. <option value="xMidYMid" selected>xMidYMid</option>
  39. <option value="xMidYMax">xMidYMax</option>
  40. <option value="xMaxYMin">xMaxYMin</option>
  41. <option value="xMaxYMid">xMaxYMid</option>
  42. <option value="xMaxYMax">xMaxYMax</option>
  43. </select>
  44. <select name="meetOrSlice" id="meetOrSlice">
  45. <option value="meet" selected>meet</option>
  46. <option value="slice">slice</option>
  47. </select>
  48. <p>viewBox,默认 0 0 width height</p>
  49. <p>preserverAspectRadio,默认xMidYMid meet,如果align是none,meetOrSlice的值将会被忽略</p>
  50. <div id="note" style="visibility:hidden;">
  51. <p>按照---><span id="direction"></span>,缩放 ---> <span id="percent"></span></p>
  52. </div>
  53. <button type="button" id="btn">运动动画</button>
  54. </fieldset>
  55. <div id="svg" style="margin:100px 0 0 100px;position:relative;width:400px;height:300px; background:gray;">vport
  56. <div id="react" style="position:absolute;width:40px;height:30px;background:green;">vBox
  57. <div id="realDiv" style="position:absolute;top:0;left:0;opacity:0.5;margin:10% 0 0 15%;width:30%;height:50%;background:red;"></div>
  58. </div>
  59. </div>
  60. <script>
  61. let updateView = (selector, attr, val) => {
  62. document.querySelector(selector).style[attr] = val + 'px';
  63. preserveAspectRadioFirst(align.value)
  64. }
  65. let preserveAspectRadioFirst = (startPosition = 'xMidYMid') => {
  66. const svgW = viewportWidthNumber.value;
  67. const svgH = viewportHeightNumber.value;
  68. const reactW = viewBoxWidthNumber.value;
  69. const reactH = viewBoxHeightNumber.value;
  70. switch (align.value) {
  71. case 'none':
  72. react.style.transformOrigin = 'center center';
  73. react.style.left = (svgW - reactW) / 2 + 'px';
  74. react.style.top = (svgH - reactH) / 2 + 'px';
  75. break;
  76. case 'xMinYMin':
  77. react.style.transformOrigin = 'left top';
  78. react.style.left = 0 + 'px';
  79. react.style.top = 0 + 'px';
  80. break;
  81. case 'xMinYMid':
  82. react.style.transformOrigin = 'left center';
  83. react.style.left = 0 + 'px';
  84. react.style.top = (svgH - reactH) / 2 + 'px';
  85. break;
  86. case 'xMinYMax':
  87. react.style.transformOrigin = 'left bottom';
  88. react.style.left = 0 + 'px';
  89. react.style.top = (svgH - reactH) + 'px';
  90. break;
  91. case 'xMidYMin':
  92. react.style.transformOrigin = 'center center';
  93. react.style.left = (svgW - reactW) / 2 + 'px';
  94. react.style.top = 0 + 'px';
  95. break;
  96. case 'xMidYMid':
  97. react.style.transformOrigin = 'center center';
  98. react.style.left = (svgW - reactW) / 2 + 'px';
  99. react.style.top = (svgH - reactH) / 2 + 'px';
  100. break;
  101. case 'xMidYMax':
  102. react.style.transformOrigin = 'center bottom';
  103. react.style.left = (svgW - reactW) / 2 + 'px';
  104. react.style.top = (svgH - reactH) + 'px';
  105. break;
  106. case 'xMaxYMin':
  107. react.style.transformOrigin = 'right top';
  108. react.style.left = (svgW - reactW) + 'px';
  109. react.style.top = 0 + 'px';
  110. break;
  111. case 'xMaxYMid':
  112. react.style.transformOrigin = 'right center';
  113. react.style.left = (svgW - reactW) + 'px';
  114. react.style.top = (svgH - reactH) / 2 + 'px';
  115. break;
  116. case 'xMaxYMax':
  117. react.style.transformOrigin = 'right bottom';
  118. react.style.left = (svgW - reactW) + 'px';
  119. react.style.top = (svgH - reactH) + 'px';
  120. break;
  121. }
  122. }
  123. preserveAspectRadioFirst(align.value);
  124. let awaitFn = () => {
  125. return new Promise((resolve, reject) => {
  126. setTimeout(() => {
  127. react.style.transitionDuration = '0s';
  128. resolve()
  129. })
  130. })
  131. }
  132. let inputs = document.querySelectorAll('input');
  133. let selects = document.querySelectorAll('select');
  134. let disableEle = () => {
  135. for (let i = 0; i < inputs.length; i++) {
  136. inputs[i].setAttribute('disabled', 'disabled')
  137. }
  138. for (let i = 0; i < selects.length; i++) {
  139. selects[i].setAttribute('disabled', 'disabled')
  140. }
  141. }
  142. let enbledEle = () => {
  143. for (let i = 0; i < inputs.length; i++) {
  144. inputs[i].removeAttribute('disabled')
  145. }
  146. for (let i = 0; i < selects.length; i++) {
  147. selects[i].removeAttribute('disabled')
  148. }
  149. }
  150. let step = 1;
  151. btn.addEventListener('click', async e => {
  152. if (step % 2) {
  153. btn.innerHTML = '初始化'
  154. disableEle();
  155. react.style.transition = "transform 5s";
  156. const svgW = viewportWidthNumber.value;
  157. const svgH = viewportHeightNumber.value;
  158. const reactW = viewBoxWidthNumber.value;
  159. const reactH = viewBoxHeightNumber.value;
  160. svg.style.width = svgW + 'px';
  161. svg.style.height = svgH + 'px';
  162. react.style.width = reactW + 'px';
  163. react.style.height = reactH + 'px';
  164. let p = (reactW / reactH) / (svgW / svgH) > 1;//p>1,viewbox宽先到viewport的宽 p<1,viewbox高先到viewport的高
  165. let s = meetOrSlice.value;
  166. let scaleX = svgW / reactW;
  167. let scaleY = svgH / reactH;
  168. let scale = p ?
  169. s == 'meet' ? scaleX : scaleY :
  170. s == 'meet' ? scaleY : scaleX;
  171. //note
  172. let derector = p ?
  173. s == 'meet' ? 'x轴' : 'y轴' :
  174. s == 'meet' ? 'y轴' : 'x轴';
  175. percent.innerHTML = scale;
  176. direction.innerHTML = derector;
  177. note.style.visibility = 'visible';
  178. //note
  179. react.style.transform = "scale(" + scale + ")";
  180. } else {
  181. note.style.visibility = 'hidden';
  182. enbledEle()
  183. await awaitFn()
  184. react.style.transform = 'scale(1)'
  185. react.style.background = 'green'
  186. btn.innerHTML = '运动动画'
  187. }
  188. step++;
  189. })
  190. react.addEventListener('transitionend', e => {
  191. if (e.propertyName == 'transform') {
  192. react.style.transition = "background 5s";
  193. react.style.background = 'transparent';
  194. }
  195. });
  196. </script>
  197. </body>
  198. </html>

运行例子

viewport的理解

例子

这里的viewport的宽高就是svg标签里面的widthheight属性值。默认单位像素px,这里也就是400px*300px,当然可以用其他单位em rem %等等,前提你用得着~哦。然后svg的viewport就讲完了,简单吧。

  1. <svg width="400" height="300" style="border:1px solid red">
  2. <rect width="40" height="30" fill="green"/>
  3. </svg>

运行图片

viewBox

重点理解,绝对不要放过的地方哦

例子1

viewBox="x y width height" 或者viewBox="x ,y,width,height" 带不带 逗号

x:初始矩形的左上点x坐标

y:初始矩形左上角y坐标

width:初始矩形宽度

height:初始矩形高度

我画三个图形,跟我先弄懂这三个

  1. <svg width="400" height="300" style="border:1px solid red">
  2. <rect width="40" height="30" />
  3. </svg>
  4. <svg width="400" height="300" viewBox="0 0 40 30" style="border:1px solid red">
  5. <rect width="40" height="30" />
  6. </svg><br/>
  7. <svg width="400" height="300" viewBox="0 0 80 30" style="border:1px solid red">
  8. <rect width="40" height="30" />
  9. </svg>

运行图片

可视化svg深入理解viewport、viewbox、preserveaspectradio的更多相关文章

  1. SVG 入门——理解viewport,viewbox,preserveAspectRatio

    工欲善其事必先利其器,没有真正搞懂SVG里的viewport,viewbox, preserveAspectRatio这三个属性,就很容易遇到坑,最近写项目用到svg这三个属性被我一眼就略过 ,后来发 ...

  2. 理解SVG中的 viewport,viewBox, preserveAspectRatio

    _ 阅读目录 一:理解viewport 二:理解viewBox 三:理解 preserveAspectRatio 回到顶部 一:理解viewport 该属性表示的是SVG可见区域的大小.或者也可以叫画 ...

  3. 数据可视化-svg入门基础(二)

    接上一篇:数据可视化-svg入门基础(一),基础一主要是介绍了svg概念,元素样式设置等. svg是(scalable vector graphic)伸缩矢量图像. 一.目录 (1)图形元素 (2)文 ...

  4. 理解SVG的viewport,viewBox,preserveAspectRatio

    万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...

  5. 深入理解viewport(转)

    在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或 ...

  6. 深入理解viewport

    这篇文章我已写成pdf,建议直接下载浏览. 链接:https://pan.baidu.com/s/1c4cwd7E 密码:jty1 <对viewport标签的理解> --版权所有 @RYZ ...

  7. 『cs231n』卷积神经网络的可视化与进一步理解

    cs231n的第18课理解起来很吃力,听后又查了一些资料才算是勉强弄懂,所以这里贴一篇博文(根据自己理解有所修改)和原论文的翻译加深加深理解,其中原论文翻译比博文更容易理解,但是太长,而博文是业者而非 ...

  8. HTML-HTML5+CSS3权威指南阅读(五、深入理解viewport)

    1.手机浏览器与桌面浏览器的不同 现在手机浏览器的显示分辨率与桌面浏览器差不多,但是手机的尺寸比电脑要小很多.一个没做过响应式处理的网站,在手机和电脑上显示完全一样的内容, 不可避免的会出现字体被缩小 ...

  9. 通透理解viewport

    摘自:https://blog.csdn.net/u014787301/article/details/44466697 在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewpor ...

随机推荐

  1. [随笔][胡思乱想][唠叨][web server]

    nginx是一个webserver,最基本的功能是发送静态的文件.类似于apache2的webserver,主要的功能就是响应请求,做出响应. 所说的服务器是安装了服务器软件的物理机,专用的服务器或者 ...

  2. IDEA 代码生成插件 CodeMaker

    Java 开发过程中经常会遇到编写重复代码的事情,例如说:编写领域类和持久类的时候,大部分时候它们的变量名称,类型是一样的,在编写领域类的时候常常要重复写类似的代码.类似的问题太多……这里介绍一个 I ...

  3. java安装与配置

    参考:https://blog.csdn.net/gaokao2011/article/details/75211429 Win 1.JDK JDK 可以到官网下载http://www.oracle. ...

  4. laravel Cache store [] is not defined

    去这个网站学习一下也好  https://laravel-china.org/topics/2093/laravel-source-analysis-series-cache#0b2791 如果env ...

  5. winform 打印时的默认单位

    通过设置Graphics.PageUnit,是枚举类型GraphicsUnit,默认是display(指定显示设备的度量单位. 通常,视频显示使用的单位是像素:打印机使用的单位是 1/100 英寸.)

  6. 使用doxc4j将word转pdf遇到的一个问题

    看到网上很多使用Docx4j将word转成pdf,于是cv工程师就开始了一系列复制粘贴操作,但是运行报错 最后经过修改

  7. java大数据量调优

    从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问.高并发请求方面,基本的解决方案集中在这样几个环节:1.首先需要解决网络带宽和Web请求的高并发,需要合理的加大服务器和带宽的投入,并且需要 ...

  8. kong api可视化管理工具konga安装

    说明:官网推荐: kong-dashboard,但对比界面高端程度和友好度,更推荐konga.[一个坑]kong版本问题:我在安装时目前kong最新版本已经到1.0.0, 对于konga和kong-d ...

  9. 激活WINDOWS SERVER 2019

    Windows Server 2019 Datacenter WMDGN-G9PQG-XVVXX-R3X43-63DFGWindows Server 2019 Standard N69G4-B89J2 ...

  10. Zookeeper并不保证读取的是最新数据

    Zookeeper并不保证读取的是最新数据 原文地址:http://www.crazyant.net/2120.html 如果是对zk进行读取操作,读取到的数据可能是过期的旧数据,不是最新的数据. 已 ...