当前位置: 首页 > news >正文

svg 进阶

svg 进阶

svg 应用场景

  • 绘制 icon
  • 绘制动画

svg viewport 和 viewBox

  • viewport 是 svg 图像的可见区域

  • viewBox 是用于在画布上绘制 svg 图形的坐标系统

  • 在一下案例中 svg中 width=“500” height=“200” 就是可视区域 比如你的svg是100X100但是你的可视区域只有20X20

    那么他就不能展示—>viewport

  • viewBox表示svg的绘制坐标系默认值取viewport svg的viewBox是怎么计算的呢 就是拿viewport 中的x和y除viewBox的x和y得到一个比值然后拿着这个比值去等比的缩放或者放大svg的宽高

    这个 viewBox 有四个数字,分别表示左上角 x 坐标、左上角 y 坐标、宽度和高度。

<svg width="500" height="200" viewBox="0 0 50 20" style="border: 1px solid #000000"><rect x="20" y="10" width="10" height="5" style="stroke: #000000; fill:none;"/>
</svg>      

上述案例中 viewBox 坐标系中 1 = 10px,上述代码相当于:

<svg width="500" height="200" style="border: 1px solid #000000"><rect x="200" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>
  • preserveAspectRatio 用于当 viewport 和 viewBox 宽高比不相同时,指定这个坐标系在viewport 中是否完全可见,同时也可以指定它在viewport 坐标系统中的位置

preserveAspectRatio 是一个较难理解的概念,它相当于在 viewport 内部绘制了一个虚拟内框,它的默认值为:xMidYMid meet

<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMidYMid meet"><rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>

上述配置的原理如下图:
svg_viewbox

<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMaxYMin meet"><rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>

上述配置的原理如下图:
svg_viewbox

preserveAspectRatio 第二个参数如下:

  • meet: 保持宽高比并将viewBox缩放为适合viewport的大小

meet 模式下,svg 将优先采纳压缩比较小的作为最终压缩比,meet 是默认参数

  • slice: 保持宽高比并将所有不在viewport中的viewBox剪裁掉
<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMidYMax slice"><rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>                          

上述代码原理如下图:
svg_viewbox

<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="xMaxYMin slice"><rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>                          

上述代码原理如下图:
svg_viewbox

slice 模式下,svg 将优先采纳压缩比较大的作为最终压缩比

  • none: 不保存宽高比。缩放图像适合整个viewbox,可能会发生图像变形

none 模式下,svg 将分别计算 x 和 y 轴的压缩比

<svg width="500" height="200" viewBox="0 0 200 200" style="border: 1px solid #000000" preserveAspectRatio="none"><rect x="100" y="100" width="100" height="50" stroke-width="10" style="stroke: #000000; fill:none;"/>
</svg>                              

svg 组件库

  • defs 标签
  • g 标签
<g id="arrow"><polyline points="30 20, 70 50, 30 80" fill="transparent" stroke="currentColor" stroke-width="3"></polyline>
</g>
  • use 标签
<svg :style="{color:'red'}"><use href="#filledArrow"></use>
</svg>
  • symbol
    symbol 与 g 标签类似,但 symbol 可以拥有一个独立的 viewBox
<svg width="0" height="0"><symbol id="cross" viewBox="0 0 100 100"><line x1="50" y1="10" x2="50" y2="90" stroke-width="8" stroke="currentColor"></line><line x1="10" y1="50" x2="90" y2="50" stroke-width="8" stroke="currentColor"></line></symbol>
</svg>

使用 iconfont 的正确姿势

集成 svg 图标

  • 找到合适的 svg 图标
  • 下载图标
  • 将 svg 代码集成到组件库
  • 在 vue 项目中使用组件

创建 iconfont 项目

  • 创建 iconfont 项目
  • 上传 svg 图标
  • 生成 js 库

官方帮助文档:查看,推荐使用 symbol 方式

创建 svg 组件

  • 外部引用 symbol 链接
  • 接收 icon name
  • icon 外层样式封装

相关文章:

  • 掌握C++中的动态数据:深入解析list的力量与灵活性
  • mybatis-plus的批量修改源码遇到的问题
  • 什么是IDE,新手用哪个IDE比较好
  • 【工具】Android|Android Studio 长颈鹿版本安装下载使用详解
  • HLS 三角函数报错:undefined reference to ‘cordic_apfixed::circ_table_arctan_128‘
  • Python爬虫http基本原理#2
  • 【AI绘画--七夕篇】使用Stable Diffusion的艺术二维码完全生成攻略
  • 即席查询框架怎么选?
  • 13.JS实现深拷贝的方式
  • 【Linux】SystemV IPC
  • WPF控件-ItemsControl
  • Elasticsearch 安装和配置脚本文档
  • 【C语言】案例:输出n位水仙花数
  • Python学习路线 - Python高阶技巧 - PySpark案例实战
  • Java Jackson库使用教程
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • httpie使用详解
  • java正则表式的使用
  • js写一个简单的选项卡
  • Laravel核心解读--Facades
  • PHP面试之三:MySQL数据库
  • Python中eval与exec的使用及区别
  • Webpack 4 学习01(基础配置)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 那些年我们用过的显示性能指标
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • ​一些不规范的GTID使用场景
  • (1)bark-ml
  • (175)FPGA门控时钟技术
  • (二)JAVA使用POI操作excel
  • (二)斐波那契Fabonacci函数
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (算法)Game
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • @PreAuthorize注解
  • [Android]使用Git将项目提交到GitHub
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [CF407E]k-d-sequence
  • [CISCN2019 华东南赛区]Web11
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [docker] Docker的数据卷、数据卷容器,容器互联
  • [hive小技巧]同一份数据多种处理
  • [HNOI2008]玩具装箱toy
  • [java基础揉碎]方法的重写/覆盖
  • [Java性能剖析]Sun JDK基本性能剖析工具介绍