SVG 视野概念(二)

简介: SVG 视野概念(二)

一、简介

  • SVG视窗、世界、视野的概念
  • widthheight - 控制视窗(控件大小)
  • SVG 代码 - 定义世界(显示内容)
  • viewBoxpreserveAspectRatio - 控制视野(在控件大小内的可视区域)
<svg
  xmlns="http://www.w3.org/2000/svg"
  width="1000"
  height="1000"
  viewBox="0 0 400 400"
  preserveAspectRatio="xMinYMin meet"
  <!-- SVG Content -->
>

  • preserveAspectRatio 取值范围示例:
<!-- preserveAspectRatio - Align -->
<select>
  <option value="none">none</option>
  <option value="xMinYMin">xMinYMin</option>
  <option value="xMidYMin">xMidYMin</option>
  <option value="xMaxYMin">xMaxYMin</option>
  <option value="xMinYMid">xMinYMid</option>
  <option value="xMidYMid">xMidYMid</option>
  <option value="xMaxYMid">xMaxYMid</option>
  <option value="xMinYMax">xMinYMax</option>
  <option value="xMidYMax">xMidYMax</option>
  <option value="xMaxYMax">xMaxYMax</option>
</select>
<!-- preserveAspectRatio - meetOrSlice -->
<select>
  <option value="meet">meet</option>
  <option value="slice">slice</option>
</select>

二、案例

  • SVG 可视区域效果
<!-- svg画布大小 === 可视范围 -->
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 200 200" style="background-color: green;">
  <rect x="0" y="0" width="50" height="50" fill="red"/>
</svg>
<!-- svg画布大小 < 可视范围 -->
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 400 400" style="background-color: green;">
  <rect x="0" y="0" width="50" height="50" fill="red"/>
</svg>
<!-- svg画布大小 > 可视范围 -->
<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 100 100" style="background-color: green;">
  <rect x="0" y="0" width="50" height="50" fill="red"/>
</svg>
  • SVG 可视区域 preserveAspectRatio 配置效果
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 可视区域效果 + preserveAspectRatio -->
  <h3>可视区域效果 + preserveAspectRatio + viewBox</h3>
  <!-- 配置区域 -->
  <span>preserveAspectRatio - </span>
  <span>align:</span>
  <select id="align" onchange="onAlignChange(this)">
    <option value="none">none</option>
    <option value="xMinYMin" selected>xMinYMin</option>
    <option value="xMidYMin">xMidYMin</option>
    <option value="xMaxYMin">xMaxYMin</option>
    <option value="xMinYMid">xMinYMid</option>
    <option value="xMidYMid">xMidYMid</option>
    <option value="xMaxYMid">xMaxYMid</option>
    <option value="xMinYMax">xMinYMax</option>
    <option value="xMidYMax">xMidYMax</option>
    <option value="xMaxYMax">xMaxYMax</option>
  </select>
  <span>meetOrSlice:</span>
  <select id="meetOrSlice" onchange="onMeetOrSliceChange(this)">
    <option value="meet">meet</option>
    <option value="slice">slice</option>
  </select>
  <div style="margin-top: 10px;">
    <span>viewBox - </span>
    x:<input type="number" value="0" placeholder="x" onchange="onChangeX(this)" style="width: 50px;">
    y:<input type="number" value="0" placeholder="y" onchange="onChangeY(this)" style="width: 50px;">
    width:<input type="number" value="200" placeholder="width" onchange="onChangeWidth(this)" style="width: 50px;">
    height:<input type="number" value="200" placeholder="height" onchange="onChangeHeight(this)" style="width: 50px;">
  </div>
  <!-- 画布 -->
  <div style="margin-top: 20px;">
    <!-- svg画布-->
    <svg id="svg" xmlns="http://www.w3.org/2000/svg" width="300" height="200" viewBox="0 0 200 200" preserveAspectRatio="none meet" style="background-color: green;">
      <rect id="rect" x="0" y="0" width="200" height="200" fill="red"/>
    </svg>
  </div>
  <!-- JS 切换配置 -->
  <script>
    // 默认配置
    var alignType = 'xMinYMin'
    var meetOrSliceType = 'meet'
    var x = 0
    var y = 0
    var width = 200
    var height = 200
    // 监听切换
    function onAlignChange (e) {
      // 记录
      alignType = e.value
      // 更新
      reloadUI()
    }
    function onMeetOrSliceChange (e) {
      // 记录
      meetOrSliceType = e.value
      // 更新
      reloadUI()
    }
    function onChangeX (e) {
      // 记录
      x = e.value
      // 更新
      reloadUI()
    }
    function onChangeY (e) {
      // 记录
      y = e.value
      // 更新
      reloadUI()
    }
    function onChangeWidth (e) {
      // 记录
      width = e.value
      // 更新
      reloadUI()
    }
    function onChangeHeight (e) {
      // 记录
      height = e.value
      // 更新
      reloadUI()
    }
    // 组装赋值
    function reloadUI () {
      // 组装
      var viewBox = [x, y, width, height].join(' ')
      var preserveAspectRatio = [alignType, meetOrSliceType].join(' ')
      // 赋值
      svg.setAttribute('viewBox', viewBox)
      svg.setAttribute('preserveAspectRatio', preserveAspectRatio)
      rect.setAttribute('x', x)
      rect.setAttribute('y', y)
      rect.setAttribute('width', width)
      rect.setAttribute('height', height)
    }
    // 初始化
    reloadUI()
  </script>
</body>
</html>


相关文章
|
7月前
|
前端开发 算法
Canvas艺术之旅:探索锚点抠图的无限可能
Canvas艺术之旅:探索锚点抠图的无限可能
67 0
|
4月前
|
前端开发
CSS动画变形宝典:Transform属性,打造动态视觉盛宴!
CSS动画变形宝典:Transform属性,打造动态视觉盛宴!
|
6月前
|
前端开发 编解码 移动开发
【魅力网页的背后】:CSS基础魔法,从零打造视觉盛宴
【魅力网页的背后】:CSS基础魔法,从零打造视觉盛宴
|
6月前
|
前端开发
技术经验分享:CSS画三角形(三种方法)
技术经验分享:CSS画三角形(三种方法)
28 0
|
前端开发
【我的前端】玻璃拟态效果实战开发:比毛玻璃更好看的CSS背景玻璃拟态效果
玻璃拟态是目前市面上的新风格,越来越受欢迎,新拟态 (Neumorphism) 模仿受到挤压的塑料材质,这种新的视觉风格更加注重垂直空间z轴的使用。它的典型特征是:
【我的前端】玻璃拟态效果实战开发:比毛玻璃更好看的CSS背景玻璃拟态效果
|
存储 XML 编解码
图形学 | 蓄势待发!说一说图片相关的那些概念
图形学 | 蓄势待发!说一说图片相关的那些概念
165 0
图形学 | 蓄势待发!说一说图片相关的那些概念
|
前端开发
web前端学习(三十)——CSS3图像透明/不透明、拼合技术的相关设置
web前端学习(三十)——CSS3图像透明/不透明、拼合技术的相关设置
web前端学习(三十)——CSS3图像透明/不透明、拼合技术的相关设置
|
前端开发 算法
CSS奇思妙想 -- 使用 background 创造各种美妙的背景
CSS奇思妙想 -- 使用 background 创造各种美妙的背景
586 0
CSS奇思妙想 -- 使用 background 创造各种美妙的背景
|
芯片 异构计算
设计师为新iMac设计窄边框设想图
11月11日,苹果将召开2020年第三场秋季发布会,外界猜测将会发布搭载Apple Silicon的Mac产品。近日,就有设计师为苹果新iMac制作了设想图,屏幕尺寸分别为24寸和32寸。
139 0
设计师为新iMac设计窄边框设想图
|
前端开发 JavaScript 容器
如何用 CSS 和 D3 创作一个无尽的六边形空间
效果预览 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/NBvrWL 可交互视频 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
954 0