svg绘(viewBox viewport preserveAspectRatio)代替png图片等

news2024/11/16 3:51:23

当我们的代码中需要一个小图标的时候没必要去iconfont进行下载图标使用
要是下载的png格式那么容量还很大 远不如svg
直接自己代码写
记住svg的坐标朝向和数学坐标轴不一样
在这里插入图片描述

实现下图添加的小图标
在这里插入图片描述

 <svg width="20px" height="20px" style="border: 1px solid red">
      <!-- 
        x1  y1  线段的起始坐标  x2 y2线段的终点坐标
        stroke-width  线段的宽度   stroke="线的颜色" -->
      <line x1="0" y1="10" x2="20" y2="10" stroke-width="1" stroke="red"></line>
      <line x1="10" y1="0" x2="10" y2="20" stroke-width="1" stroke="red"></line>
    </svg>

注意颜色

 stroke="red" 是直接应用为红色
 stroke="currentColor"  是找的父级的元素上的color来使用

 <div class="test"> 
    <svg width="20px" height="20px" style="border: 1px solid red; color: blue"> 
      //currentColor指向的是父级的颜色此时为svg的color :blue (currentColor父级的父级的颜色对他没影响)
     // 如果currentColor父级没有颜色color那么在继续往上找
      <line   x1="0"  y1="10" x2="20" y2="10"  stroke-width="1"  stroke="currentColor" ></line>
      <line x1="10" y1="0" x2="10" y2="20" stroke-width="1" stroke="red"></line>
    </svg>
  </div>

在这里插入图片描述
以上这样的话不会进行适配看下面的解决方案

viewport :是svg图像的可见区域 也就是svg上的width height 一旦设置为100%那么就会继承父元素的尺寸 当尺寸小于自己描述的x y坐标点的时候那么就会出现无法绘制的问题 (宽高是20px 坐标点是50px 超出viewport可视区域导致无法渲染绘制)

viewbox:是在画布上绘制svg图形的坐标系统 viewbox不设置的话 那么默认是使用的svg的width height ,把svg或者父元素的宽高作为自己的默认viewbox 具体描述看下图代码的注释

<div  style="width:20px;height:20px"> 
  //此时的svg的宽高是100%  那么就会找父元素的宽高 那就是20px svg还没有设置viewbox那么他的默认就是  viewbox='0 0 20 20'
  //viewbox的四个值代表  0 0 代表x轴和y轴的起始位置  后面200, 200 表示长和宽但是只是一个数量,不会有具体的长度
  //svg的宽高和viewbox的计算比例公式:
 //  viewbox='0 0 20 20'  svg的宽高是20px  20px  
  // svg的宽/viewbox的宽度-x位置=1(宽的比例)  
  // svg的高/viewbox的高度-y位置=1(高的比例)
   // 然后line下的坐标 x y都会×1  保持了1:1的效果
   但是一旦把svg的宽高设置为40px 那么不设置viewbox的话它默认就是svg的宽高就是40    40/40=1 在把line的x,y乘以1 那么就是
   在40px*40px的区域下绘制了个线段是很小的 不能跟视图进行等比例
    <svg width="100%" height="100%" style="border: 1px solid red; color: blue"> 
      <line x1="0" y1="10"  x2="20" y2="10"  stroke-width="1"  stroke="currentColor"  ></line>
      <line x1="10" y1="0" x2="10" y2="20" stroke-width="1" stroke="red"></line>
    </svg>
  </div>

正确的配置:到时候我们修改最外层的div的宽高内部就会进行等比例缩放—(配置viewbox属性)

<div class="test" style="width: 200px; height: 200px"> 
    <svg
      width="100%"
      height="100%"
      viewBox="0 0 200 200"
      view
      style="border: 1px solid red; color: blue"
    >  
      <line  x1="0"    y1="100" x2="200"   y2="100"  stroke-width="1"  stroke="currentColor" ></line>
      <line  x1="100"  y1="0"   x2="100"   y2="200"  stroke-width="1"  stroke="red" ></line>
    </svg>
  </div>


绘制矩形
在这里插入图片描述


  <div class="test" style="width: 500px; height: 200px">
    <!-- <svg width="100px" height="100px" style="border: 1px solid red"> -->
    <svg
      width="100%"
      height="100%"
      viewBox="0 0 50 20"
      view
      style="border: 1px solid red; color: blue"
    >
      <!-- 矩形  x,y(坐标点)  width,height(在坐标点的基础上绘制宽高的矩形) -->
      <rect
        x="20"
        y="10"
        width="10"
        height="5"
        style="stroke: #000; fill: none"
      ></rect>
    </svg>
  </div>

svg绘图的时候是根据viewBox尺寸进行绘制(图形的xywidth最终还是根据viewbox和svg的宽高计算出来的比例) 当viewbox和viewport的尺寸不一致的时候 我们要指定策略
preserveAspectRatio:他相当于在viewport内部绘制了一个虚拟内框 他的默认值是 xMidYMid meet )
xMid 代表的是viewbox会出现在x轴的最中心
xMax会绘制到viewport的最右侧
xMin会绘制到最左侧

在这里插入图片描述
在这里插入图片描述

(meet默认参数):该参数控制viewBox缩放的方式。
1:保持宽高比并将viewbox缩放为适合viewport的大小
2:svg将优先采纳把压缩比较小的作为最终的压缩比
比如:计算压缩公式的结果:宽是1 高是2 那么选择的是1 ,< rect></ rect>的x y width height 就会分别*1
在这里插入图片描述

slice:该参数控制viewBox缩放的方式。
1:保持宽高比并将所有不在viewport中的viewbox剪裁掉 ,
2:并且将压缩比最大的作为最终的压缩比
比如:计算压缩公式的结果:宽是1 高是2 那么选择的是2,< rect></ rect>的x y width height 就会分别*2
在这里插入图片描述

none:不保持宽高比 直接全部占满视图(svg)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

500/200=2.5 200/200=1 选取最小值1 rect下的x y width height 分别✖1最终的结果是保持原比
上面说了 当 svg的宽高(viewport)和viewbox的宽高比不一致的时候 就会出现默认的属性preserveAspectRatio:xMidYMid meet代表x轴居中 y居中)因为viewport宽度是500所以设置x居中是可以的 y是1:1的所以居中对他无效
最终的rect的x y 坐标 是在居中的viewBox内部进行绘制的

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/164774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023java面试之Zookeeper基础

一、说说 Zookeeper 是什么&#xff1f;直译&#xff1a;从名字上直译就是动物管理员&#xff0c;动物指的是 Hadoop 一类的分布式软件&#xff0c;管理员三个字体现了 ZooKeeper 的特点&#xff1a;维护、协调、管理、监控。简述&#xff1a;有些软件你想做成集群或者分布式&a…

冯诺依曼体系结构

冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成&#xff1a; 输入单元&#xff1a;包括键盘, 鼠…

netbeans中配置maven

deploy-发布到远程maven库本节默认maven库为nexusnetbeans中按ctrl1&#xff0c;打开Project窗口&#xff1b;在Project窗口中找到相关的project或module,在项目名上点击鼠标右键&#xff1b;在弹出菜单中找到菜单“Run Maven”的子菜单“Goals”&#xff0c;并点击&#xff0c…

PCB封装创建(IC类+USB)

目录 一&#xff1a;IC类 封装原理图 规格参数选最大。创建过程 1.放置焊盘 2.我们需要八个上图焊盘&#xff0c;可以用特殊粘贴 3.丝印层设置 封装向导 右击0805R&#xff0c;选择footprint 输入焊盘尺寸 二&#xff1a;USB封装 原理图 创建过程 1.放置焊盘&#x…

SSM 03_SpringMVC REST风格 Postman SSM整合 拦截器

01-SpringMVC简介SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。SpringMVC是处于Web层的框架&#xff0c;所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端&#xff0c;所…

元宇宙时代业务扩张,专精特新小巨人找到了增长“神器”

进入2023年&#xff0c;元宇宙时代正扑面而来。自从脸书公司更名为Meta以来&#xff0c;元宇宙就在全球迅速走红。《福布斯》认为&#xff0c;2030年全球元宇宙的市场规模有望高达5万亿美元。更为重要的是&#xff0c;元宇宙正在成为数实融合的新界面、未来商业的新型基础设施。…

如何在浏览器中安装使用Vue开发者工具?Vue开发者工具的安装使用?可直接提取插件安装使用

一个混迹于Github、Stack Overflow、开源中国、CSDN、博客园、稀土掘金、51CTO等 的野生程序员。 目标&#xff1a;分享更多的知识&#xff0c;充实自己&#xff0c;帮助他人 GitHub公共仓库&#xff1a;https://github.com/zhengyuzh 以github为主&#xff1a; 1、分享前端后端…

【阶段四】Python深度学习08篇:深度学习项目实战:循环神经网络SimpleRNN、LSTM进行淘宝商品评论文本情感分析

本篇的思维导图: 项目背景 随着信息化社会的发展,互联网成为方便、快捷的信息获取渠道之一。在电子商务和社会网站中,大量非结构化的评论文本作为最直观的用户体验数据被保存下来。如何利用这些文字信息归纳出用户对某一事、物的观点态度成为自然语言(NLP)领域一项…

RNN从理论到实战【实战篇】

来源&#xff1a;投稿 作者&#xff1a;175 编辑&#xff1a;学姐 昨天的文章中&#xff0c;我们学习了RNN的理论部分&#xff0c;本文来看如何实现它&#xff0c;包括堆叠RNN和双向RNN。从而理解它们的原理。最后看一个应用到词性标注任务的实战。 RNNCell 首先实现单时间步…

iMX6ULL —按键输入捕获与GPIO输入配置与高低电平读取

硬件介绍1.1 板子上按键原理图先来看原理图&#xff0c;我板子上有4个按键sw1~sw4:1.1.1 SW1SW1是板子的系统复位按键&#xff0c;不可编程使用1.1.2 SW2、SW3SW2&#xff1a;SNVS_TAMPER1&#xff0c;GPIO5_1平时是低电平&#xff0c;按下去是高电平。SW3&#xff1a;ONOFF它也…

2023年java面试题之zookeeper基础2

一、请描述一下 Zookeeper 的通知机制是什么&#xff1f;Zookeeper 允许客户端向服务端的某个 znode 注册一个 Watcher 监听&#xff0c;当服务端的一些指定事件触发了这个 Watcher &#xff0c;服务端会向指定客户端发送一个事件通知来实现分布式的通知功能&#xff0c;然后客…

echarts基本用法

目录 tooltip:{ // 设置提示框信息 图表的提示框组件 legend:{ // 图例组件 toolbox : { //工具箱组件 可以另存为图片等功能 grid{ //网格配置 grid可以控制线型图 柱状图 图表大小 xAxs: { // 设置x轴的相关配置 y轴同理 series:[ // 系列图表 它决定着显示那种…

Spring MVC 详解 (Spring Boot)

Spring MVC 详解 - Spring Boot一、什么是 Spring MVC1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系1.3 学习目的二、Spring MVC 创建和连接2.1 创建 Spring MVC 项目2.2 相关注解三、获取参数3.1 使用 Servlet API3.2 通过方法参数直接拿到3.2.1 传递单个参数3.2.2 传递多个参数3…

【Acwing 周赛复盘】第86场周赛复盘(2023.1.14)

【Acwing 周赛复盘】第86场周赛复盘 周赛复盘 ✍️ 本周个人排名&#xff1a;678/2358 AC情况&#xff1a;2/3 这是博主参加的第一次周赛&#xff0c;深刻体会到了世界的参差 &#x1f602; 看到排名 TOP3 的大佬都是不到 5 分钟内就 AK 了&#xff0c;真是恐怖如斯&#xff0…

29.动态内存申请

1.动态内存分配的概念 在数组一章中&#xff0c;介绍过数组的长度是预先定义好的&#xff0c;在整个程序中固定不变&#xff0c;但是在实际的编程中&#xff0c;往往所需的内存空间取决于实际输入的数据&#xff0c;而无法预先确定。为了解决上述问题&#xff0c;C语言提供了一…

Linux 发布 JavaWeb 项目

Linux 发布 JavaWeb 项目 安装 mysql 使用 yum search mysql-community 查看是否安装下载地址&#xff1a;https://dev.mysql.com/downloads/repo/yum/ 选择自己虚拟机的版本 在此处&#xff0c;复制 链接地址&#xff0c; 然后使用命令 wget 链接地址 来进行 下载rpm 安装 …

Python解题 - CSDN周赛第23期 - 树形背包与优化

以问哥目前的水平来看&#xff0c;本期的四道题的整体难度还是中等偏上的&#xff0c;而且从结果上来看&#xff0c; 也达到了竞赛的标准&#xff08;只有三名选手拿到满分&#xff09;。也许在某些大佬看来还是太简单了&#xff0c;毕竟都是模板题&#xff0c;直接套模板就能过…

基于深度学习人脸性别识别项目

项目概述要求针对提供的人脸数据集&#xff0c;根据人脸图像预测人脸性别。本次将提供 20000 多张已经分割的人脸图像&#xff0c;要求基于人脸图像自动识别该人性别。数据集的年龄从 1 岁覆盖到 100 多岁&#xff0c;包括了白种人、黄种人、黑种人等多种种族数据。数据集存在人…

2022年“网络安全”赛项海南省赛选拔赛 任务书

2022年“网络安全”赛项海南省赛选拔赛 任务书 一、竞赛时间 共计6小时。 &#xff08;二&#xff09;A模块基础设施设置/安全加固&#xff08;350分&#xff09; 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&#xff0c;对于企业的服务器系统&#xff0c…

【数据结构】二叉搜索树

一、概念二叉搜索树也叫二叉排序树。在一颗二叉搜索树中&#xff0c;他的左子树二点节点值一定比根节点的值小&#xff0c;他的右子树节点的值一定比根节点的值大。二、特点他的左子树节点的值一定比根节点的值小他的右子树节点的值一定比根节点的值大他的每一颗子树都是一颗二…