整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

前端的你应该知道的SVG知识

前端的你应该知道的SVG知识

我们阅读这篇文章之前,我们需要思考下,我们为什要去了解SVG,阅读了这篇文章是否可以给我们带来帮助。

1. 如果你想要一张 css或者JavaScript可以控制的图片,那么你可以考虑SVG。

2. 如果你期望图片的质量不会因为放大或缩小而降低,那么你可以考虑SVG。

3. 如果你期望网页对残障人士和视力受损的用户有更好的体验,那么你可以考虑SVG。

4. 如果你期望图片在高清设备还是低分辨率设备上,都能保持清晰和细腻的图像质量,那么你可以考虑SVG。

1. 矢量图

我们在学习SVG之前,需要先了解一下位图和矢量图。

简单来说:

  • 位图:由像素点组成的图像,放大图像会失真,canvas就是位图效果。
  • 矢量图:由数学公式(通常是XML)来描述图像,放大图像不会失真。

详细来说:

  • 位图:也称为像素图,是由一个个像素点组成的图像。每个像素点都有特定的颜色和位置,这些信息被编码并存储在文件中。位图的显示效果取决于像素的数量和密度,即分辨率。一般来说,位图主要用于表示细节丰富,颜色和亮度变化多的图像,如照片,自然风景等。
  • 矢量图:使用数学公式(通常是XML)来描述图像,而不是像位图那样使用像素矩阵。这些数据公式决定了图像的形状,线条和填充样式。由于矢量图的每个元素都是由数学公式定义的,因此它们可以在不同尺寸和分辨率下保持清晰度。这种类型的图像在缩放,旋转或以其他方式变换时不会失去细节或者质量。

2. SVG

SVG究竟什么?

是Scalable Vector Graphics的缩写,意思是可缩放矢量图形。

这是一种基于XML的二维矢量图形标准,由W3C开发的。

对于初学者来说,可以将SVG理解为一套新的HTML标签。

所以我们可以使用css和JavaScript来对标签进行操作。

很多小伙伴可能已经忘记了XML,我们回顾一下:
XML(可扩展标记语言)是一种用于描述数据的标记语言,它使用一系列简单的标记来描述数据,这些标记可以用来表示不同类型的数据元素,如标题,作者,价格等。

3. 优势

SVG的优势:

  1. 可扩展性和响应能力:SVG是使用形状,数字和坐标在浏览器中渲染图形,这使得它具有分辨率无关性和无限可伸缩性。不管我们画了什么图形,不论用户将页面放的多大,图形都不会失真,只是比例变化了而已。
  2. 可编程性和交互性:SVG是完全可编辑和脚本可编写的,我们可以通过css和JavaScript将各种动画和交互添加到绘图中。
  3. 无障碍:SVG文件是基于文本的,可以进行搜索和索引,这使得他们可以通过屏幕阅读器,搜索引擎和其他设备阅读。
  4. 性能:与GIF,JPG和PNG相比,SVG通常是较小的文件。

4. 劣势

SVG的劣势:

设计复杂性:SVG需要具备一定的设计和制作技巧,与位图相比,SVG的设计难度较大,需要更高的技术水平。

浏览器兼容性:在一些旧版浏览器中,可能存在对SVG的兼容性问题。

渲染速度:SVG复杂度过高会降低页面渲染速度。

5. 使用方式

对于前端开发的我们,要如何去使用SVG呢?

SVG归根结底来说和JPG,PNG一样,也是一种图像格式,所以我们可以在HTML中,将SVG的路径设置为<img>的src属性。

我们也可以将SVG的代码放在HTML中,我们完全可以把SVG的代码看做成我们的HTML标签。

例如:

<svg width="500" height="500">
    <circle cx="100" cy="100" r="50" fill="transparent" stroke="#000"></circle>
</svg>

我们也可以通过css的background-image或者伪元素,将SVG图片作为背景图像。

6. 使用场景

  1. 图标和徽标:由于SVG可以无损缩放,所以非常适合用来做网站的图标和徽标,无论是在大屏幕还是小屏幕上,SVG都能保证清晰度。
  2. 插画:任何钢笔或铅笔制作的传统绘图,都可以完美转化为SVG格式。
  3. 动态图形:SVG的脚本特性使它可以用来创建动态的,交互式图形。
  4. 之前我做过空调的SVG图片,然后由JavaScript控制空调上的开关,温度,模式。
  5. 地图和图表:SVG可以绘制地图和图表,然后和JavaScript进行数据交互。
  6. 游戏:虽然SVG不是专门用来做游戏的,但是一些游戏开发者会用SVG来制作游戏中的图形。

总的来说,任何需要保持清晰度,动态交互和无损缩放的图形场景,都可以考虑使用SVG。

7. Canvas与SVG

Canvas和SVG都是用于在网页上绘制图形的工具,但它们在许多方面都存在显著的差异。以下是对Canvas和SVG的对比:

  1. 基本概念
  2. Canvas:是HTML5提供的 <canvas>标签,使用JavaScript在网页上绘制图形。它主要通过像素进行渲染,不支持事件处理器。
  3. SVG:全称为可伸缩矢量图形(Scalable Vector Graphics),是基于XML的二维图形语言。它由许多节点构成,每个被绘制的图形都被视为一个对象,如果SVG对象的属性发生变化,浏览器能够自动重现图形。
  4. 特点
  5. Canvas: 依赖分辨率。 不支持事件处理器。 弱的文本渲染能力。 能够以 .png 或 .jpg 格式保存结果图像。 最适合图像密集型的游戏,其中的许多对象会被频繁重绘。
  6. SVG: 基于矢量,能够很好地处理图形大小的改变。 不支持事件处理器。 弱的文本渲染能力。 能够以 .png 或 .jpg 格式保存结果图像。
  7. 性能
  8. Canvas的历史没有SVG悠久,它是H5新增的标签,而SVG已经存在十几年。
  9. SVG图形节点足够多时,渲染会比较慢,而Canvas性能好一些。
  10. 其他差异
  11. Canvas适合带有大型渲染区域的应用程序(如谷歌地图)。
  12. SVG的复杂度高可能会减慢渲染速度(任何过度使用DOM的应用都不快)。

总结:Canvas和SVG各有其优势和适用场景。Canvas更适合图像密集型的游戏和需要高效渲染的应用,而SVG更适合处理矢量图形和大型渲染区域。

8. 实战一

说了这么多,我们来开始实战,我们要在HTML中,画出一个SVG图像。

<html>
<body>
<h1>Feng SVG</h1>

<svg version="1.1"  baseProfile="full"  width="300" height="200"  xmlns="http://www.w3.org/2000/svg">
  <rect width="100%" height="100%" stroke="red" stroke-width="4" fill="yellow" />
  <circle cx="150" cy="100" r="80" fill="green" />
  <text x="150" y="115" font-size="16" text-anchor="middle" fill="white">RUNOOB SVG TEST</text>
</svg> 

</body>
</html>

运行后:

代码解读:

  1. <svg>和</svg>是表示SVG代码,相当于开始标签和结束标签,这是根元素。
  2. width 和 height 属性可设置此 SVG 的宽度和高度。
  3. version 属性可定义所使用的 SVG 版本。
  4. xmlns 属性可定义 SVG 命名空间。
  5. baseProfile 特性描述了作者认为正确渲染内容所需要的最小的 SVG 语言概述。这个特性不会说明任何处理限制,可以把它看作是元数据。
  6. SVG 的 <rect> 用来创建一个矩形,通过 fill 把背景颜色设为黄色。
  7. SVG 的 <circle> 用来创建一个圆。cx 和 cy 属性定义圆中心的 x 和 y 坐标。如果忽略这两个属性,那么圆点会被设置为 (0, 0),r 属性定义圆的半径。 一个半径 80px 的绿色圆圈 <circle> 绘制在红色矩形的正中央 (向右偏移 150px,向下偏移115px)。
  8. stroke 和 stroke-width 属性控制如何显示形状的轮廓。我们把圆的轮廓设置为 4px 宽,红色边框。
  9. fill 属性设置形状内的颜色。我们把填充颜色设置为红色。

9. 实战二

我们还可以在线设计SVG图片,我们可以直接使用该图片或者拷贝其代码复制到我们的代码中。

SVG在线编辑: c.runoob.com/more/svgedi…

10. SVG的基本形状

10.1 矩形

示例一

正常的矩形

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect width="300" height="100" style="fill:rgb(122,122,0);stroke-width:2;stroke:rgb(0,0,0)" />
</svg>

效果:

代码解析:

  • <rect>:这是一个矩形元素,用于在SVG图像中绘制矩形。
  • width="300" 和 height="100":这两个属性定义了矩形的宽度和高度。在这个例子中,矩形的宽度是300像素,高度是100像素。
  • style="fill:rgb(122,122,0);stroke-width:2;stroke:rgb(0,0,0)":这设置了矩形的样式。 fill:rgb(122,122,0):设置填充颜色为RGB值(122,122,0)的颜色,这是一种黄色调的颜色。 stroke-width:2:设置线条宽度为2像素。 stroke:rgb(0,0,0):设置线条颜色为RGB值(0,0,0)的颜色,这是一种黑色。

综上,这段代码会在SVG图像中绘制一个宽度为300像素、高度为100像素、填充颜色为黄色调、线条宽度为2像素、线条颜色为黑色的矩形。

示例二:

填充和边框的透明度

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <rect x="50" y="20" width="150" height="150" style="fill:blue;stroke:red;stroke-width:5;fill-opacity:0.5;stroke-opacity:0.5" />
</svg>

效果:

代码解析:

  • <rect>:这是一个矩形元素,用于在SVG图像中绘制矩形。
  • x="50" 和 y="20":这两个属性定义了矩形左上角的坐标(x, y)。在这个例子中,坐标是(50, 20)。
  • width="150" 和 height="150":这两个属性定义了矩形的宽度和高度。在这个例子中,矩形的宽度是150像素,高度是150像素。
  • style="fill:blue;stroke:red;stroke-width:5;fill-opacity:0.5;stroke-opacity:0.5":这设置了矩形的样式。 fill:blue:设置填充颜色为蓝色。 stroke:red:设置线条颜色为红色。 stroke-width:5:设置线条宽度为5像素。 fill-opacity:0.5:设置填充透明度为0.5,这意味着矩形将是半透明的。 stroke-opacity:0.5:设置线条透明度为0.5,这意味着线条将是半透明的。

综上,这段代码会在一个SVG图像中绘制一个左上角坐标为(50, 20)、宽度为150像素、高度为150像素、填充颜色为蓝色、线条颜色为红色、线条宽度为5像素、填充透明度和线条透明度都为0.5的矩形。

示例三:

整个元素的透明度

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="500px" height="500px">
  <rect x="50" y="20" width="150" height="150" style="fill:blue;stroke:pink;stroke-width:5;opacity:0.4" />
</svg>

效果:

代码解析:

  • <rect>:这是一个矩形元素,用于在SVG图像中绘制矩形。
  • x="50" 和 y="20":这两个属性定义了矩形左上角的坐标(x, y)。在这个例子中,坐标是(50, 20)。
  • width="150" 和 height="150":这两个属性定义了矩形的宽度和高度。在这个例子中,矩形的宽度是150像素,高度是150像素。
  • style="fill:blue;stroke:pink;stroke-width:5;opacity:0.4":这设置了矩形的样式。 fill:blue:设置填充颜色为蓝色。 stroke:pink:设置线条颜色为粉红色。 stroke-width:5:设置线条宽度为5像素。 opacity:0.4:设置透明度为0.4,这意味着矩形将是半透明的。

综上,这段代码会在一个500x500像素的SVG图像中绘制一个左上角坐标为(50, 20)、宽度为150像素、高度为150像素、填充颜色为蓝色、线条颜色为粉红色、线条宽度为5像素、透明度为0.4的矩形。

示例四:

圆角矩形

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="500px" height="500px">
  <rect x="50" y="20" rx="20" ry="20" width="150" height="160" style="fill:red;stroke:black;stroke-width:1;opacity:0.5" />
</svg>

效果:

代码解析:

  • <rect>:这是一个矩形元素,用于在SVG图像中绘制矩形。
  • x="50" 和 y="20":这两个属性定义了矩形左上角的坐标(x, y)。在这个例子中,坐标是(50, 20)。
  • rx="20" 和 ry="20":这两个属性定义了矩形的圆角半径。在这个例子中,矩形的圆角半径是20像素。
  • width="150" 和 height="160":这两个属性定义了矩形的宽度和高度。在这个例子中,矩形的宽度是150像素,高度是160像素。
  • style="fill:red;stroke:black;stroke-width:1;opacity:0.5":这设置了矩形的样式。 fill:red:设置填充颜色为红色。 stroke:black:设置线条颜色为黑色。 stroke-width:1:设置线条宽度为1像素。 opacity:0.5:设置透明度为0.5,这意味着矩形将是半透明的。

综上,这段代码会在一个500x500像素的SVG图像中绘制一个左上角坐标为(50, 20)、宽度为150像素、高度为160像素、填充颜色为红色、线条颜色为黑色、线条宽度为1像素、透明度为0.5的圆角矩形。

10.2 圆形

示例:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
   <circle cx="100" cy="50" r="40" stroke="red" stroke-width="2" fill="blue" />
</svg> 

效果:

代码解析:

  • <circle>:这是一个圆形元素,用于在SVG图像中绘制圆形。
  • cx="100" 和 cy="50":这两个属性定义了圆心的坐标(x, y)。在这个例子中,圆心的坐标是(100, 50)。
  • r="40":这个属性定义了圆的半径,单位是像素。在这个例子中,圆的半径是40像素。
  • stroke="red":这个属性定义了圆的边框颜色。在这个例子中,圆的边框颜色是红色。
  • stroke-width="2":这个属性定义了圆的边框宽度。在这个例子中,圆的边框宽度是2像素。
  • fill="blue":这个属性定义了圆的填充颜色。在这个例子中,圆的填充颜色是蓝色。

综上,这段代码会在一个SVG图像中绘制一个圆心坐标为(100, 50)、半径为40像素、边框颜色为红色、边框宽度为2像素、填充颜色为蓝色的圆形。

10.3 椭圆

示例:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="500" height="500">
  <ellipse cx="300" cy="80" rx="100" ry="50" style="fill:red;stroke:purple;stroke-width:2" />
</svg>

效果:

代码解析:

  • <ellipse>:这是一个椭圆元素,用于在SVG图像中绘制椭圆。
  • cx="300" 和 cy="80":这两个属性定义了椭圆的中心点坐标(x, y)。在这个例子中,中心点坐标是(300, 80)。
  • rx="100" 和 ry="50":这两个属性定义了椭圆的长轴和短轴半径。在这个例子中,长轴半径是100像素,短轴半径是50像素。
  • style="fill:red;stroke:purple;stroke-width:2":这设置了椭圆的样式。 fill:red:设置填充颜色为红色。 stroke:purple:设置线条颜色为紫色。 stroke-width:2:设置线条宽度为2像素。

综上,这段代码会在一个500x500像素的SVG图像中绘制一个中心点坐标为(300, 80)、长轴半径为100像素、短轴半径为50像素的红色椭圆,线条颜色为紫色,线条宽度为2像素。

10.4 线

示例:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <line x1="0" y1="0" x2="200" y2="200" style="stroke:black;stroke-width:5" />
</svg>

效果:

代码解析:

  • <line>:这是一个线段元素,用于在SVG图像中绘制线段。
  • x1="0" 和 y1="0":这两个属性定义了线段的起始点坐标(x, y)。在这个例子中,起始点坐标是(0, 0)。
  • x2="200" 和 y2="200":这两个属性定义了线段的终点坐标(x, y)。在这个例子中,终点坐标是(200, 200)。
  • style="stroke:black;stroke-width:5":这设置了线段的样式。 stroke:black:设置线条颜色为黑色。 stroke-width:5:设置线条宽度为5像素。

综上,这段代码会在一个SVG图像中绘制一条从(0, 0)到(200, 200)的黑色线段,线条宽度为5像素。

11.5 折线

示例一:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <polyline points="20,20 40,25 60,40 80,10 120,140 200,180" style="fill:none;stroke:black;stroke-width:3" />
</svg>

效果:

代码解析:

  • <polyline>:这是一个多边形线条元素,它使用points属性定义多边形的顶点。
  • points="20,20 40,25 60,40 80,10 120,140 200,180":这定义了多边形的顶点。每个顶点由两个坐标值(x和y)组成,它们之间用空格分隔,并且每个顶点之间用空格分隔。例如,20,20定义了一个顶点在(20,20)的位置。
  • style="fill:none;stroke:black;stroke-width:3":这设置了多边形的样式。 fill:none:设置填充颜色为透明(不填充)。 stroke:black:设置线条颜色为黑色。 stroke-width:3:设置线条宽度为3像素。

综上,这段代码会在一个SVG图像中绘制一个黑色的折线。这个折线有6个点,形状大致为一个不规则的六边折线。注意:因为设置了fill:none,所以该多边形线段不会进行填充,只显示其黑色边框。

示例二:

画一个五角星

<svg style="height:300px;width:300px;" xmlns="http://www.w3.org/2000/svg" version="1.1">
    <polyline points="100 10,40 180,190 60,10 60,160 180" style="fill:blue;stroke:blue;stroke-width:1" />
</svg>

效果:

代码解析:

  • <polyline>:这是一个多边形线条元素,它使用points属性定义多边形的顶点。
  • points="100 10,40 180,190 60,10 60,160 180":这定义了多边形的顶点。每个顶点由两个坐标值(x和y)组成,它们之间用空格分隔,并且每个顶点之间用逗号分隔。例如,100 10定义了一个顶点在(100,10)的位置。
  • style="fill:blue;stroke:blue;stroke-width:1":这设置了多边形的样式。 fill:blue:设置填充颜色为蓝色。 stroke:blue:设置线条颜色为蓝色。 stroke-width:1:设置线条宽度为1像素。

综上,这段代码会在一个300x300像素的区域内绘制一个蓝色的多边形。这个多边形有5个顶点,形状大致为一个不规则的五边形。

10.6 多边形

示例一:

<svg  height="210" width="500">
  <polygon points="200,10 250,190 160,210"
  style="fill:red;stroke:purple;stroke-width:1"/>
</svg>

效果:

代码解析:

  • <polygon>:这是一个多边形元素,用于在SVG图像中绘制多边形。
  • points="200,10 250,190 160,210":这个属性定义了多边形的顶点坐标。在这个例子中,多边形有三个顶点:(200,10), (250,190) 和 (160,210)。
  • style="fill:red;stroke:purple;stroke-width:1":这设置了多边形的样式。 fill:red:设置填充颜色为红色。 stroke:purple:设置线条颜色为紫色。 stroke-width:1:设置线条宽度为1像素。

综上,这段代码会在一个500x210像素的SVG图像中绘制一个由三个顶点定义的多边形,填充颜色为红色,线条颜色为紫色,线条宽度为1像素。

示例二:

画一个五角星

<svg style="height:300px;width:300px;" xmlns="http://www.w3.org/2000/svg" version="1.1">
    <polygon points="100 10,40 180,190 60,10 60,160 180" style="fill:none;stroke:black;stroke-width:5"/>
</svg>

效果:

代码解析:

  • <polygon>:这是一个多边形元素,用于在SVG图像中绘制多边形。
  • points="100 10,40 180,190 60,10 60,160 180":这个属性定义了多边形的顶点坐标。在这个例子中,多边形有七个顶点:(100,10), (40,180), (190,60), (10,60), (160,180)。
  • style="fill:none;stroke:black;stroke-width:5":这设置了多边形的样式。 fill:none:设置填充颜色为无色。 stroke:black:设置线条颜色为黑色。 stroke-width:5:设置线条宽度为5像素。

综上,这段代码会在一个300x300像素的SVG图像中绘制一个由七个顶点定义的多边形,没有填充颜色,线条颜色为黑色,线条宽度为5像素。

10.7 路径

路径数据:

  1. M (moveto): 该命令开始一个新的路径,并设置当前点。其后的命令将从这个点开始绘制线条或曲线。
  2. L (lineto): 该命令从当前点绘制一条直线到指定点。
  3. H (horizontal lineto): 该命令从当前点绘制一条水平线到指定x坐标。y坐标保持不变。
  4. V (vertical lineto): 该命令从当前点绘制一条垂直线到指定y坐标。x坐标保持不变。
  5. C (curveto): 该命令绘制一个贝塞尔曲线,需要提供三个点:控制点和结束点。
  6. S (smooth curveto): 该命令绘制一个平滑的贝塞尔曲线,它使用前一个点和当前点作为控制点,并连接到下一个点。
  7. Q (quadratic Bézier curve): 该命令绘制一个二次贝塞尔曲线,需要提供两个点:控制点和结束点。
  8. T (smooth quadratic Bézier curveto): 该命令绘制一个平滑的二次贝塞尔曲线,它使用前一个点和当前点作为控制点,并连接到下一个点。
  9. A (elliptical Arc): 该命令绘制一个椭圆弧,需要提供起始角度、结束角度、半径和旋转角度等参数。
  10. Z (closepath): 该命令关闭路径,将当前点连接到起始点,形成一个封闭图形。

示例:

画一个三角形

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <path d="M150 0 L75 200 L205 270 Z" />
</svg>

效果:

代码解析:

  • <path>:这是一个路径元素,用于绘制线条和曲线。
  • d="M150 0 L75 200 L205 270 Z":这是路径的指令。这些指令定义了图形的形状和位置。 M150 0:移动到(150, 0)点。 L75 200:从当前点绘制一条直线到(75, 200)点。 L205 270:从当前点绘制一条直线到(205, 270)点。 Z:关闭路径,将当前点连接到起始点,形成一个封闭图形。

综上,这段代码将在SVG图像中绘制一个由三个直线段组成的封闭图形,其顶点坐标分别为(150, 0),(75, 200)和(205, 270)。

11. 设置样式

11.1 属性样式

直接在元素属性上设置样式,比如将矩形填充色改成粉红

<svg width="400" height="400" style="border: 1px solid red;">
  <rect
    x="100"
    y="100"
    width="200"
    height="100"
    fill="pink"
  />
</svg>

11.2 内联样式

把所有样式写在 style 属性里

<svg width="400" height="400" style="border: 1px solid red;">
  <rect
    x="100"
    y="100"
    width="200"
    height="100"
    style="fill: pink;"
  />
</svg>

11.3 内部样式

将样式写在 <style> 标签里

<style>
  .rect {
    fill: pink;
  }
</style>

<svg width="400" height="400" style="border: 1px solid red;">
  <rect
    x="100"
    y="100"
    width="200"
    height="100"
    class="rect"
  />
</svg>

11.4 外部样式

将样式写在 .css 文件里,然后在页面中引入该 CSS 文件。

12. SVG动画

SVG动画可以通过多种方式实现,包括使用SMIL、CSS和JavaScript。

12.1 SMIL

能让SVG不靠JavaScript与CSS就能动起来是因为使用了SMIL(Synchronized Multimedia Integration Language),是W3C的标准之一,旨在以XML格式提供多媒体的交互表现(白话点其实就是动画),是Web上动画的开路先锋,启发了Web animation与CSS animation。SVG与SMIL的开发团队合作,让SVG能利用SMIL达到如下效果:

  1. 动画化元素的数值属性
  2. 动画化元素的transform属性(平移、旋转)
  3. 动画化元素颜色
  4. 轨迹路线移动动画,类似于CSS中的offset-path

光是这些特性就够我们组合出很多种的动画了, 使用方法也不难,只要在SVG元素内置入以下四种元素即可操作动画:

  • <set>
  • <animate>
  • <animateTransform>
  • <animateMotion>

例如:

<circle cx=“56.7573”cy=“92.8179”r=“2”fill=“black”stroke=“black”stroke-width=“1”>
    <set attributeName=“cy”to=“105.7318”begin=“2s”/>
</circle>

代码解析:

这段代码用于描述一个圆形,并在特定时间改变其中心点的y坐标。

  1. <circle cx="56.7573" cy="92.8179" r="2" fill="black" stroke="black" stroke-width="1" />
  2. <circle>: 这是一个SVG元素,用于绘制一个圆形。
  3. cx="56.7573" 和 cy="92.8179": 定义了圆心的x和y坐标。这里,圆心的初始位置是(56.7573, 92.8179)。
  4. r="2": 定义了圆的半径为2单位。
  5. fill="black": 定义了圆的填充颜色为黑色。
  6. stroke="black": 定义了圆的边框颜色为黑色。
  7. stroke-width="1": 定义了圆的边框宽度为1单位。
  8. <set attributeName="cy" to="105.7318" begin="2s"/>
  9. <set>: 这是一个SVG动画元素,用于改变元素的属性。
  10. attributeName="cy": 指定要改变的属性是cy,即中心点的y坐标。
  11. to="105.7318": 指定新的属性值,即圆心的y坐标将变为105.7318。
  12. begin="2s": 指定动画开始的时间,这里表示动画将在2秒后开始。

综上,这段代码绘制了一个半径为2单位、填充和边框颜色均为黑色的圆形,并设置了一个动画,使圆心的y坐标在2秒后从92.8179变为105.7318。

12.2 基于 CSS 的 SVG 动画

通过设置一组 CSS 样式和关键帧,可以实现基于时间或基于事件的 SVG 动画。这种方式实现的 SVG 动画相对简单,具有易于实现、可读性好、易于维护、性能良好等优点。

下面是一个基于 CSS 的 SVG 动画示例,实现了一个圆形的旋转动画:

<svg>
  <circle cx="50" cy="50" r="40" />
</svg>

<style>
  circle {
    fill: red;
    animation: rotate 2s linear infinite;
  }
  @keyframes rotate {
    to {
      transform: rotate(360deg);
    }
  }
</style>

12.3 基于 JavaScript 的 SVG 动画

通过 JavaScript,可以对 SVG 图形进行更加自由和复杂的动画操作。JavaScript 可以对 SVG 元素的各种属性,如位置、大小、颜色、透明度、路径等进行操作,配合定时器和事件监听等方法,实现丰富多彩的 SVG动画。

下面是一个基于 JavaScript 的 SVG 动画示例,实现了一个小球自由落体,碰撞弹跳的效果:

<svg>
  <circle id="ball" cx="50" cy="50" r="20" />
</svg>

<script>
  let ball=document.querySelector("#ball");
  let startPos=50;
  let endPos=200;
  let speed=3; // 设置球下落速度
  let gravity=0.2; // 设置加速度

  function moveBall() {
    let pos=parseFloat(ball.getAttribute("cy"));
    let vel=parseFloat(ball.getAttribute("data-vel")) || 0;

    // 计算球的速度和位置
    vel +=gravity;
    pos +=vel * speed;

    // 碰撞检测
    if (pos + 20 > endPos) {
      pos=endPos - 20;
      vel=-vel * 0.8;
    }

    // 更新球的位置和速度
    ball.setAttribute("cy", pos);
    ball.setAttribute("data-vel", vel);

    // 循环移动球
    if (pos < endPos - 20) {
      window.requestAnimationFrame(moveBall);
    }
  }

  moveBall();
</script>

13. API一览表

14. 总结

总的来说,SVG是一种强大的图形描述语言,具有可缩放性、交互性、可访问性、灵活性和跨平台兼容性等特点和优势。它可以用于创建各种复杂的二维矢量图形和富交互的Web应用,为Web设计和开发提供了更多的可能性。

随着Web技术的不断发展,相信SVG的应用范围还将不断扩大。



原文链接:https://juejin.cn/post/7322344486159106100

端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~

Hello,大家好,我是 Sunday。

当各种框架以及复杂的 JS 知识开始充斥着我们的工作环境时。谁还能够记得,以 CSS 来构建更加良好的用户体验,也是前端的一个重要组成部分。

所以说,今天咱们就来看看 css 的优化方案-终极合集。一共一百条,有点多,适合收藏(点个赞和分享自然更好了)

01. 启动平滑滚动

添加scroll-behavior:smooth到元素中<html>,使整个页面能够平滑滚动。

html{  
    scroll-behavior: smooth;  
  }

02. 链接的属性选择器

此选择器以href属性以“https”开头的链接为目标。

a[href^="https"] {
    color: blue;
}

03. ~用于合并节点

选择作为<h2>同级元素的所有<p>元素。

h2 ~ p {
    color: blue;
}

04. :not()伪类

此选择器将样式应用于不具有类“Special”的 li。

li:not(.special) {
    font-style: italic;
}

05. 响应式排版的视窗单位 vw

使用视区单位(vw, vh, vmin, vmax)可以使字体大小与视区大小相对应。

h1 {
    font-size: 5vw;
}

06. :empty 对于空元素

此选择器以空的<p>元素为目标并隐藏它们。

p:empty {
    display: none;
}

07. 自定义特性(变量)

可以定义和使用自定义特性,以便更轻松地创建主题和进行维护。

:root {
    --main-color: #3498db;
}

h1 {
    color: var(--main-color);
}

08. Object-fit 图像控件的适配性

object-fit 控制替换元素(如<img>)的内容应该如何调整大小。

img {
    width: 100px;
    height: 100px;
    object-fit: cover;
}

09. 简化布局的网格

Css网格提供了一种功能强大的方式来以更直接的方式创建布局。

.container {
    display: grid;
    grid-template-columns: 1fr 2fr 1fr;
}

10. :focus-within 伪类

如果一个元素包含任何带有:focus的子元素,则:focus-Win会选择该元素。

form:focus-within {
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
}

11. 使用Flexbox垂直居中

使用FlexBox可轻松地将内容在容器中水平和垂直居中。

.container {
    display: flex;
    align-items: center;
    justify-content: center;
}

12. 自定义选定内容的突出显示颜色

自定义在网页上选择文本时的突出显示颜色。

::selection {
    background-color: #ffcc00;
    color: #333;
}

13. 设置占位符文本的样式

设置输入字段内占位符文本的样式。

::placeholder {
    color: #999;
    font-style: italic;
}

14. 渐变边界

使用Backback-Clip属性创建渐变边框。

.element {
    border: 2px solid transparent;
    background-clip: padding-box;
    background-image: linear-gradient(to right, red, blue);
}

15. 使用vw实现可变字体大小

根据视口宽度调整字体大小,实现更加响应式的排版。

body {
    font-size: calc(16px + 1vw);
}

16. 使用锥形渐变创建多彩元素

利用锥形渐变创建丰富多彩且动态的背景。

.element {
    background: conic-gradient(#ff5733, #33ff57, #5733ff);
}

17. 使用clamp()函数实现响应式文本

使用clamp()函数设置字体大小的范围,确保在不同屏幕尺寸下的可读性。

.text {
    font-size: clamp(16px, 4vw, 24px);
}

18. 使用font-display: swap;优化字体加载

使用font-display: swap;属性提高网页字体性能,让自定义字体加载时显示备用字体。

@font-face {
    font-family: 'YourFont';
    src: url('your-font.woff2') format('woff2');
    font-display: swap;
}

19. 自定义滚动吸附点

为了实现更顺畅的滚动体验,特别是在图库或滑块中,实现自定义滚动吸附点。

.scroll-container {
    scroll-snap-type: y mandatory;
}

.scroll-item {
    scroll-snap-align: start;
}

20. 使用字体变体设置进行可变字体样式

利用可变字体和font-variation-settings属性对字体的粗细、样式等进行精细调节。

.text {
    font-family: 'YourVariableFont', sans-serif;
    font-variation-settings: 'wght' 500, 'ital' 1;
}

21. 自定义下划线样式

使用border-bottom和text-decoration的组合来自定义链接的下划线样式。

a {
    text-decoration: none;
    border-bottom: 1px solid #3498db;
}

22. 隐藏无障碍文本

使用class sr-only来在视觉上隐藏元素,但保持其对屏幕阅读器的可访问性。

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
}

23. 保持元素纵横比

通过使用padding来保持元素(如图片或视频)的纵横比。

.aspect-ratio-box {
    position: relative;
    width: 100%;
    padding-bottom: 75%; /* 根据需要调整 */
}

.aspect-ratio-box > iframe {
    position: absolute;
    width: 100%;
    height: 100%;
}

24. 选择偶数和奇数元素

使用:nth-child伪类来为交替元素设置样式。

li:nth-child(even) {
    background-color: #f2f2f2;
}

li:nth-child(odd) {
    background-color: #e6e6e6;
}

25. CSS计数器

使用counter-reset和counter-increment属性在列表中创建自动编号。

ol {
    counter-reset: item;
}

li {
    counter-increment: item;
}

li::before {
    content: counter(item) ". ";
}

26. 多重背景图片

使用不同属性为元素应用多个背景图片。

.bg {
    background-image: url('image1.jpg'), url('image2.jpg');
    background-position: top left, bottom right;
    background-repeat: no-repeat, repeat-x;
}

27. 优化文本流畅性的连字符

通过使用hyphens属性允许自动连字符以提高文本的可读性。

p {
    hyphens: auto;
}

28. 使用CSS变量进行动态样式

利用CSS变量创建动态且可重用的样式。

:root {
    --main-color: #3498db;
}

.element {
    color: var(--main-color);
}

29. 键盘导航的焦点样式

改善焦点样式以提高键盘导航和可访问性。

:focus {
    outline: 2px solid #27ae60;
}

30. 平滑渐变过渡

为渐变背景应用平滑过渡效果,增强视觉效果。

.gradient-box {
    background: linear-gradient(45deg, #3498db, #2ecc71);
    transition: background 0.5s ease;
}

.gradient-box:hover {
    background: linear-gradient(45deg, #e74c3c, #f39c12);
}

31. 文本描边效果

为文本添加描边,产生独特的视觉效果。

h1 {
    color: #3498db;
    -webkit-text-stroke: 2px #2c3e50;
}

32. 纯CSS汉堡菜单

创建一个简单的汉堡菜单,无需使用JavaScript。

.menu-toggle {
    display: none;
}

.menu-toggle:checked + nav {
    display: block;
}
/* 在这里添加汉堡菜单图标和菜单样式 */

33. CSS :is()选择器

使用:is()伪类简化复杂的选择器。

:is(h1, h2, h3) {
    color: blue;
}

34. CSS变量中的计算

在CSS变量中进行计算,实现动态样式。

:root {
    --base-size: 16px;
    --header-size: calc(var(--base-size) * 2);
}

h1 {
    font-size: var(--header-size);
}

35. attr()函数用于内容

使用attr

()函数检索和显示属性值。

div::before {
    content: attr(data-custom-content);
}

36. CSS遮罩效果

为图像应用遮罩,创造出独特的效果。

.masked-image {
    mask: url(mask.svg);
    mask-size: cover;
}

37. 混合模式

尝试使用混合模式创建有趣的色彩效果。

.blend-mode {
    background: url(image.jpg);
    mix-blend-mode: screen;
}

38. 纵横比属性

使用纵横比属性简化纵横比盒子的创建。

.aspect-ratio-box {
    aspect-ratio: 16/9;
}

39. shape-outside实现文本环绕

使用shape-outside属性使文本围绕指定形状,实现更动态的布局。

.shape-wrap {
    float: left;
    width: 150px;
    height: 150px;
    shape-outside: circle(50%);
}

40. ch单位用于一致的尺寸

ch单位表示所选字体中字符“0”的宽度,可用于创建一致且响应式的布局。

h1 {
    font-size: 2ch;
}

41. ::marker伪元素

使用::marker伪元素为列表项标记设置样式。

li::marker {
    color: blue;
}

42. element()函数用于背景

使用element()函数动态引用元素作为背景。

.background {
    background: element(#targetElement);
}

43. Flexbox实现粘性底部

使用Flexbox创建粘性底部布局。

body {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

main {
    flex: 1;
}

44. scroll-padding实现平滑滚动

通过调整scroll padding来改善滚动行为。

html {
    scroll-padding: 20px;
}

45. 交互式高亮效果

使用CSS变量创建交互式高亮效果。

.highlight {
    --highlight-color: #e74c3c;
    background-image: linear-gradient(transparent 0%, var(--highlight-color) 0%);
    background-size: 100% 200%;
    transition: background-position 0.3s;
}

.highlight:hover {
    background-position: 0 100%;
}

46. 自定义单选框和复选框样式

无需图像,样式化单选框和复选框。

input[type="radio"] {
    appearance: none;
    -webkit-appearance: none;
    border-radius: 50%;
    width: 16px;
    height: 16px;
    border: 2px solid #3498db;
}

input[type="checkbox"] {
    appearance: none;
    -webkit-appearance: none;
    width: 16px;
    height: 16px;
    border: 2px solid #e74c3c;
}

47. textarea的resize属性

使用resize属性控制textarea的调整大小行为。

textarea {
    resize: vertical;
}

48. 文本渐变效果

使用background-clip和text-fill-color属性为文本创建渐变效果。

.gradient-text {
    background-image: linear-gradient(45deg, #3498db, #2ecc71);
    background-clip: text;
    color: transparent;
}

49. 对长单词使用word-break属性

使用word-break属性控制长单词或没有空格的字符串的断行和换行。

.long-words {
    word-break: break-all;
}

50. font-variation-settings用于可变字体

使用font-variation-settings属性微调可变字体样式。

.custom-font {
    font-family: 'MyVariableFont';
    font-variation-settings: 'wght' 600, 'ital' 1;
}

51. 混合模式用于创意叠加效果

使用混合模式为元素应用叠加效果,创造出有趣的视觉效果。

.overlay {
    mix-blend-mode: overlay;
}

52. 为损坏的图像应用样式

使用:broken伪类为损坏的图像应用样式。

img:broken {
    filter: grayscale(100%);
}

53. CSS形状

使用CSS形状为设计创建有趣的效果。

.shape {
    shape-outside: circle(50%);
}

54. 属性选择器用于子字符串匹配

使用*=操作符的属性选择器进行子字符串匹配。

[data-attribute*="value"] {
    /* 样式 */
}

55. backdrop-filter用于模糊背景

使用backdrop-filter为背景应用模糊效果,实现毛玻璃效果。

.element {
    backdrop-filter: blur(10px);
}

56. CSS环境变量

使用env()函数在CSS中访问环境变量。

.element {
    margin-top: env(safe-area-inset-top);
}

57. CSS属性计数器

使用:nth-child选择器计算特定属性值的出现次数。

[data-category="example"]:nth-child(3) {
    /* 第三次出现的样式 */
}

58. CSS形状实现文本环绕

使用shape-outside结合polygon()函数精确地控制文本围绕不规则形状的布局。

.text-wrap {
    shape-outside: polygon(0 0, 100% 0, 100% 100%);
}

59. 自定义鼠标样式

使用cursor属性更改鼠标样式。

.custom-cursor {
    cursor: pointer;
}

60. HSLA用于透明颜色

使用HSLA值表示透

明颜色,对alpha通道进行更精细的控制。

.transparent-bg {
    background-color: hsla(120, 100%, 50%, 0.5);
}

61. text-orientation实现纵向文本

使用text-orientation属性将文本垂直旋转。

.vertical-text {
    text-orientation: upright;
}

62. font-variant用于小型大写字母

使用font-variant属性应用小型大写字母样式。

.small-caps {
    font-variant: small-caps;
}

63. box-decoration-break用于背景分割

使用box-decoration-break属性控制跨多行断开的元素的背景,实现更灵活的文本环绕。

.split-background {
    box-decoration-break: clone;
}

64. :focus-visible用于特定焦点样式

仅在元素处于焦点且焦点不是由鼠标单击提供时应用样式。

input:focus-visible {
    outline: 2px solid blue;
}

65. text-rendering实现最佳字体呈现

通过text-rendering属性改善文本呈现效果。

.optimized-text {
    text-rendering: optimizeLegibility;
}

66. initial-letter用于大写字母

使用initial-letter为块级元素的第一个字母应用样式。

p::first-letter {
    font-size: 2em;
}

67. overscroll-behavior用于滚动过度

控制用户滚动超出滚动容器边界时的行为。

.scroll-container {
    overscroll-behavior: contain;
}

68. writing-mode实现纵向布局

使用writing-mode属性创建纵向布局。

.vertical-layout {
    writing-mode: vertical-rl;
}

69. ::cue用于HTML5标题样式

使用::cue伪元素为HTML5字幕文本应用样式。

::cue {
    color: blue;
}

70. line-clamp截断多行文本

使用line-clamp属性限制元素中显示的行数。

.truncated-text {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

71. scroll-snap-align

scroll-snap-align属性控制滚动容器内滚动捕捉点的对齐方式,确保对滚动行为进行精确控制,提升用户体验。

.container {
    scroll-snap-type: x mandatory;
}

.item {
    scroll-snap-align: center;
}

72. overscroll-behavior

overscroll-behavior使您可以定义浏览器在滚动超出范围时的处理方式,从而避免不必要的滚动效果,提升整体滚动体验。

.scrollable {
    overscroll-behavior: contain;
}

73. font-kerning

font-kerning允许对字符间距进行微调,通过调整文本元素中字符之间的间距,确保最佳的可读性。

p {
    font-kerning: auto;
}

74. shape-margin

与CSS形状一起使用时,shape-margin指定浮动元素形状周围的边距,可以更精确地控制文本环绕和布局。

.shape {
    shape-margin: 20px;
}

75. scroll-margin

scroll-margin设置滚动容器边缘与滚动内容开始之间的边距,提升用户体验,为滚动提供缓冲空间。

.container {
    scroll-margin-top: 100px;
}

76. tab-size

tab-size属性控制文本区域中制表符的宽度,确保在不同用户代理中一致的显示。

pre {
    tab-size: 4;
}

77. text-align-last

text-align-last决定块级元素中最后一行文本的对齐方式,为多行块文本提供对齐控制。

p {
    text-align-last: justify;
}

78. text-justify

此属性控制文本两端对齐的行为,指定是使用单词间还是字符间距进行文本对齐。

p {
    text-align: justify;
    text-justify: inter-word;
}

79. column-fill

column-fill决定如何在多列布局中分配内容,允许内容依次或平衡分布在列中。

.container {
    column-count: 3;
    column-fill: auto;
}

80. outline-offset

outline-offset调整轮廓与元素边缘之间的空间,不影响布局,为轮廓的外观提供更细致的控制。

button {
    outline: 2px solid blue;
    outline-offset: 4px;
}

81. font-variant-numeric

此属性允许精细控制数字字体渲染,启用特性如数字大小写和分数、序数指示器等。

p {
    font-variant-numeric: lining-nums;
}

82. font-optical-sizing

启用或禁用字体光学大小调整,以调整字符的间距和比例,实现在不同字体大小下更好的视觉和谐。

p {
    font-optical-sizing: auto;
}

83. text-decoration-thickness

精确控制文本装饰(如下划线、上划线和删除线)的粗细,实现精细化定制。

p {
    text-decoration-thickness: 2px;
}

84. text-decoration-skip-ink

text-decoration-skip-ink属性控制文本装饰(如下划线)在被墨水遮挡的情况下是否继续绘制,提升可读性。

a {
    text-decoration-skip-ink: auto;
}

85. word-spacing

word-spacing属性控制字词间距,调整文本的紧凑度和可读性。

p {
    word-spacing: 2px;
}

86. hyphenation

通过调整断字点和断字行为,提高文本在窄列中的美观度和可读性。

p {
    hyphens: auto;
}

87. background-blend-mode

background-blend-mode属性允许背景图像与其下方的背景颜色进行混合,产生出独特的视觉效果。

.element {
    background-image: url('image.jpg');
    background-color: #3498db;
    background-blend-mode: multiply;
}

88. text-decoration-color

text-decoration-color属性控制文本装饰的颜色,为链接和装饰文本提供更灵活的样式。

a {
    text-decoration: underline;
    text-decoration-color: red;
}

89. overflow-anchor

overflow-anchor属性指定了在容器的滚动范围内滚动时哪些内容应保持可见,提升用户体验。

.container {
    overflow-anchor: none;
}

90. contain-intrinsic-size

contain-intrinsic-size属性定义了内联大小计算函数的大小,实现更精确的布局控制。

img {
    contain-intrinsic-size: 200px 300px;
}

91. line-gap

line-gap属性定义了元素的行间距,可以为文字和其他行内元素提供更大的空间。

p {
    line-gap: 1.5;
}

92. text-underline-offset

text-underline-offset属性控制文本下划线相对于基线的垂直偏移量,实现更加精确的下划线定位。

a {
    text-decoration: underline;
    text-underline-offset: 3px;
}

93. text-decoration-line

text-decoration-line属性指定要绘制的装饰线的类型,可用于单独控制上划线、下划线、删除线等。

a {
    text-decoration-line: underline overline;
}

94. text-emphasis

text-emphasis属性为文本设置强调标志,用于提高关键字的可读性。

em {
    text-emphasis: filled circle;
}

95. text-orientation

text-orientation属性控制文本的方向,适用于纵向文本和日文排版等情况。

.vertical-text {
    text-orientation: sideways-right;
}

96. background-origin

background-origin属性确定背景图片的起始位置,影响背景图片与边框的相对位置。

.element {
    background-image: url('image.jpg');
    background-origin: content-box;
}

97. counter-set

counter-set属性在使用counter-reset创建的计数器值基础上,显式设置一个新的值。

ol {
    counter-set: section 1;
}

98. hanging-punctuation

hanging-punctuation属性控制标点符号是否在行框之外悬挂,以提高排版的美观度和可读性。

p {
    hanging-punctuation: last allow-end;
}

99. line-break

line-break属性控制文本换行行为,确保在指定的断点处进行断行。

p {
    line-break: anywhere;
}

100. text-justify

text-justify属性指定如何分配额外的空间,以便充分利用容器的宽度。

019年3月1日,vivo发布了旗下全新子品牌iQOO,与以往旗下产品所不同的是,此次发布的全新旗舰手机,在产品性能、设计、价格等多个方面都打破了原有消费者对vivo的印象,以“高性价”的表现方式呈现在世人面前,而性能也达到了目前手机市场的顶尖之列,众人对其可谓是期待满满。iQOO作为vivo旗下的一款全新子品牌旗舰,“生而强悍”的强势宣传语都彰显着其强大之处,但是其表现是否真如传言般强悍呢,除了强悍的性能还有何突出优势?这是一个值得我们一起探讨的问题!

一改传统机身外观 酷炫感十足的变身

iQOO作为一款全新的vivo旗舰品牌,产品包装在延续了原有的长形设计,同时加入了与其相匹配的产品特色,比较有特点的长条形灯效与不规则开箱口的设计,彰显着其与众不同的特点。

iQOO外观设计借鉴了超跑的“Speed Art”的设计语言,将暗夜光轨纹理与3D炫彩玻璃后盖之中,每一根光轨线条采用精湛的技术,通过国外精密的钻石刀在铜柱上雕刻出10um的纹理,然后经过复杂的工艺在光学菲林上转印纹路,再通过光学镀膜机把700纳米厚的二氧化硅等材料蒸发到菲林上,从不同的角度有着不同的工艺之美,透露着其特有的速度与力量的效果,呈现出低调中的个性,观赏感与辨识度极强。

科技视讯入手的这款是12GB+256GB“猛兽版”骑士黑版本,在机身表面还加入了碳纤维纹理,握持时会感受到不错的阻尼感,触摸时既有金属的质感,又有玻璃的细腻,上手非常舒适。

另外机身背面的中间还增加了一个隐藏式1680万色的LED灯带,并且上方印着斜体的“MONSTER INSIDE”字符标识,与背部的纹理融为一体,呈现出更加酷炫与速度疾驰的感觉,而且LED灯效的加入也带来了非常炫酷的灯光体验,此LED灯在来电、通话、通知、充电、音乐、Jovi等场景都可迸发出不一样的闪亮灯效,激发一颗电竞之心。

iQOO的后置三摄与“iQOO”的品牌字样标识分别排列在背面的左侧上下位置,处于同一竖列线条,保持了机身的协调之美。另外iQOO还增加了NFC功能,将其识别区域设置在背面的上半部分,有效提升日常“刷手机”时的NFC识别准确率,在日常生活中可以提供更为灵敏、便利的NFC识别体验。

机身左右边框还增加了超跑腰线设计,通过将侧边框挖出两条横槽,类似于跑道的设计,使得机身从侧边观感更为纤薄,常见的电源键、音量键等按键也集成在边框的跑道之中,同时按键上方也增加了车轮纹理,按压感极为舒适。

另外骑士黑版本的iQOO机身电源键采用了鲜艳的亮橘色设计,与机身整体的黑色呈现出强烈的对比,点睛之笔的设计,让手机显得更为高端一些。

最令人惊喜的是,iQOO在机身右侧中框两端配备了电竞手机才配备的隐藏游戏压感按键,可实现类如手柄的RB、LB键的操作功能,在“吃鸡”类游戏中能够实现“四指操作”,宛如自带“物理外挂”的存在。


iQOO并没有增加红外传感器设计,无法满足手机变身遥控器的需求,虽然日常此功能使用频率并不高,但是依旧感觉有些许遗憾,机身的顶端仅有常见的3.5mm耳机孔与降噪麦克风孔。

机身的底端则是常见的扬声器、麦克风以及Type-C插口,无论正反都可以很好与电源适配器相匹配,设计的风格较为简洁,保持了其根本稳中带酷的基调。


6.41英寸水滴FHD+显示屏 第六代屏幕指纹解锁加持

iQOO的手机正面搭载了一块6.41英寸水滴屏,正面造型设计较为简洁,并尽可能减少机身正面元器件对屏幕的占有,采用19.5:9屏幕比例设计,机身观感极为修长,除了带来高达91.7%的屏占比,同时也呈现出更为宽广的画面效果。

屏幕采用了AMOLED的升级版的Super AMOLED材质,AMOLED屏幕分为三层:显示屏幕、触摸感应面板和最外面的那层玻璃,Super AMOELD则是取消了中间的触摸感应面板,将AMOLED感应层做在了屏幕之上,以此带来的好处就是操控更灵敏,再加上三星自研的mDNIe引擎,使得Super AMOLED屏幕看起来非常绚丽,另外屏幕分辨率为2340x1080,屏幕对比度60000:1,并且可支持数码电影院的100%DCI-P3,可提供更为鲜艳、亮丽、色彩丰富的画面效果,屏幕观感通透且舒适。

为了带来更大的屏占比,iQOO将前置双核1200万像素的摄像头集成在“水滴”之中,并同时将听筒与上边框相结合,形成隐藏式听筒,进一步减少器件对屏幕的占有,提高屏幕可视视野。

除了机身额头的优化之外,iQOO机身边框下巴同样进行了缩减,采用COF封装工艺将下边框缩减至极窄范围内,在保证不会产生误触的同时,带来更窄的边框设计,让屏幕视觉观感更为震撼。

另外iQOO依托vivo近几年不断进步的科研力量,搭载了时下前沿的屏幕指纹解锁技术,在超光感屏幕下方加入了屏幕指纹识别模块。此次iQOO全新搭载的屏幕指纹解锁技术不仅融合了vivo前五代技术,还加入了超过千万台的屏幕指纹解锁数据,同时结合了高通骁龙855的新一代DSP硬件加速算法,实际解锁体验得到了进一步提升,360°指纹解锁无压力。

在使用指纹识别功能时,大家仅需进入手机设置中录入指纹,通过不断重复移动、放置手指位置,从而提高手指的识别区域,进而体验更灵敏的指纹解锁方式。

除了可通过屏下指纹进行解锁之外,iQOO还可通过人脸识别,可在双手不便时带来更便利的解锁体验,人脸解锁的灵敏度并没有因为受到前置摄像头区域的缩小而改变,实际解锁与往常无异。人脸信息录入的方法与其它手机相同,只需进入解锁界面,选择录入面部信息并随后开启面部解锁功能即可。


残暴的高通骁龙855芯片 众多物理外挂加持

生而强悍的iQOO在性能上不可谓是非常强悍,作为此品牌的第一款机型,处理器采用新一代7nm制程工艺的高通骁龙855处理器,CPU搭载定制设计Kryo485架构内核,最高主频可达2.84Ghz,CPU单核性能提升45%。GPU采用全新的Adreno640,图形渲染速度提升20%,性能再战巅峰之巅。

同时iQOO还配备了12GB+256GB大内存,其中运行内存采用的是LPDDR4X规格,可保证长时间提供流畅用机体验,配以骁龙855处理器等强悍的硬件性能支撑,足以可用“完虐”二字来应对日常的游戏、观影以及多任务运行等多个方面体验。

在安兔兔性能跑分中获得369130分,其中CPU120302分,GPU156018分,在性能排行榜中排名第二,位于同样搭载骁龙855芯片的小米9与联想Z5 Pro GT版之间。

在geekbench4跑分评测中单核3471分,多核11062分,在RenderScript性能评测中获得7223分,与搭载骁龙855芯片的其它手机大致相同。

在鲁大师性能评测中故意的360581分,整体性能超越99%的对手,其中CPU为118681分,GPU为1544375分,在性能排行中位于第一位。在体验评测中获得139.58分,在反应浏览器性能的HTML5评测中获得45856分。

在鲁大师AI性能评测中获得48590分,在所有的机型中排名第1,超越99%的其它手机,高通骁龙855芯片的AI性能此次也得以提升,是上一代的3倍之多,可为日常的AI智能体验提供强劲的硬件基础。

除了强大的硬件支撑之外,iQOO系统还添加了全新的vivo Multi-Turbo软件方面的优化,除了可支持原有的Game Turbo游戏专属加速之外,此次还新增了Net Turbo网络加速,在游戏延时大或者Wi-Fi质量差时,会自动将网络切换到4G网络,以保证游戏的最佳网速供应。另外游戏体验时,Center Turbo处理器加速会优化后台运行程序资源,从而保证游戏的CPU与内存资源都保持在最大情况下,从而体验更为畅快的游戏体验。

另外iQOO系统还增加了游戏魔盒,可通过屏蔽游戏干扰、降低功耗、提升游戏性能等多个方面,营造出更适合游戏体验的环境。另外在游戏空间也可观察手机CPU、温度、网络负载等各种情况,做到心有所属。

机身的温度一直是影响游戏体验的重要因素之一,过热很容易引发处理器性能下降,从而导致游戏体验卡顿、不流畅等现象的发生。针对此类问题,iQOO加入了“超级液冷散热”技术,将机身背面内部增加了由万级导热系数热管、可固化导热凝胶、高导热铝合金框架、多层复合石墨热膜共同组成的多层散热结构,通过高温蒸发吸热、低温液化放热的原理达到快速降温效果,在长时间游戏、边充边玩等容易发热场景下,可有效控制机身温度情况,保证手机性能属于最佳状态。

在《王者荣耀》游戏体验时,得益于高通骁龙855带来的骁龙Elite Gaming、Vulkan1.1图形库以及Super AMOLED超感显示屏的加持,在游戏体验时画面以及角色的质感更为细腻、丰富,19.5:9的视野更为宽广,游戏可以达到高响应率与更精确、速度的操作体验。

另外当达到三杀、五杀等激情时刻时,背面的Monster Halo灯效会迸发光芒,营造更激情的游戏快感。

在开启高帧率游戏模式下,游戏的FPS保持在59的极高水准,而且帧率的波动幅度非常之小,仅有1.30帧,并且FPS帧数维持在稳定的规律状态,整体的体验极为顺畅,把玩之后机身的温度并没有发生明显变化,机身温度一直保持在正常状态。

在吃鸡类游戏中,横屏体验绝地求生之《刺激战场》游戏时,iQOO右侧边配备的Monster Touch压感按键可实现“射击”、“开枪”等操作,边走边压枪的高强度“四指操作”也可轻松实现。

游戏界面时可先从屏幕左侧划出游戏电竞快捷操作界面,选择新增的压感按键功能,通过调整“A”“B”按键的位置以及压感灵敏度,即可感受物理“外挂”般的“吃鸡”游戏体验。

另外iQOO机身还配备了专业线性马达,可将游戏枪声转换为震动效果,无论是视觉、听觉还是触觉都沉浸式感受,游戏体验更逼真。

《刺激战场》的游戏画面品质与帧数设置可达到最高的HDR高清、超高标准,体验更逼真的游戏环境。

整体的游戏FPS保持在39数值(最高40),平均波动在0.97帧,游戏的体验较为顺畅,无论是开车、跑毒、拾取都极为顺畅。尤其在压枪过程中,得益于Monster Touch压感按键的存在,压枪极为稳定,可以快速击杀敌人,轻松吃鸡。

4000mAh大电池+44W超级闪充 续航能力强悍无敌

除了强悍的性能之外,手机续航能力也是大家最关心的问题,智能手机的续航能力一直是短板。iQOO在设计时充分考虑续航问题,搭载一个4000mAh的大容量电池,即便搭载6.41英寸大显示屏,可获得平均13.5小时的长时间续航体验,满足一天正常使用需求完全没问题。

在充电方面,iQOO做了重大的创新与进化,iQOO充电方式采用vivo Super FlashCharge电荷泵充电技术,同时还引入了Flash Fast Charge充电算法优化技术,可支持44W超快闪充技术,在提升速度的同时降低了充电时的发热,特别采用了3C电芯,峰值充电电流高达近8A,息屏状态内可以在5分钟内实现最高680mAh的电池增长,在iQOO的4000mAh大电池下,极速充至17%,肉眼可见的充电速度,只需45分钟即可将电量充满至100%。

iQOO在数据线设计方面也同样煞费苦心,充电线采用创新L型+胶囊设计,设计风格更为圆润光滑,另外创新的L型设计在横屏握持手机时,不会造成以往的不顺手现象,再搭配其44W超级闪充,边充边玩更畅快。

后置超广角AI三摄 延续vivo美颜拍摄基因

iQOO后置搭载了索尼旗舰级的双核1200万IMX363主摄、1300万像素超广角镜头与一个200万像素的景深摄像头,并且拥有120°超大视野的拍照能力,对焦速度极快。同时搭载的AI智能场景识别功能,可根据不同拍摄的景物自动识别拍照模式,通过系统自我优化,利用AI Turbo 具备的长期学习能力,AI场景识别不仅能对夜景、运动、抖动和逆光这些场景识别并分别调整,更能够识别照片中的内容,人像、美食、鲜花等,并且有针对性的进行智能调整,从而拍摄出更符合当前场景的意境照片。

实际拍摄样张如下:

另外iQOO的超广角拍摄可在有限拍摄位置,拍摄出更为宽广的画面效果,更能凸显拍摄景物的全景面貌以及震撼的拍摄效果,画面两侧的畸变形状也可以得到很好的控制。

▲正常拍摄模式

▲广角拍摄模式

在拍摄暗光环境景物时,iQOO具备高达 12.3EV的动态范围,传感器单个像素面积更提升至1.4μm,搭配f/1.79超大光圈,都为夜景、暗光等拍摄环境下的稳定清晰成像提供强大的硬件支持。配合其连续拍摄12-16帧的多帧降噪合成高品质技术,在逆光、弱光情况下可拍摄出明亮通透的照片效果,极大还原了照片细节,保证暗部曝光正确的同时,明部的细节也得到保留,实际表现较为不错。

在人像美颜拍摄方面,一直是vivo强项!此次iQOO在拍照功能上还配置了AI美颜,这一功能可以轻松调整面部容貌,包括削脸、瘦脸、瘦鼻、长鼻、大眼、眼距、嘴型、下巴、额头等,让爱美人士解锁更多拍摄模式,照片效果更理想。

iQOO前置搭载的双核1200万像素摄像头,同样具备了强大的拍摄能力,在人像拍摄以及效果处理方面,都有着独到之处,拍摄出的自拍效果极易捕获爱美人士的芳心,算是保留了vivo的美颜招牌。

全新Funtouch OS9 熟悉的简洁操作系统

iQOO搭载的是全新基于Android9开发的Funtouch OS9操作系统,相比上一代Funtouch OS系统有了很大的改变,最直接的感受系统界面变的更为简洁,界面的滑动及操作变得更为畅快,而且具备一种科技感和速度感。再配以高通骁龙855旗舰芯片的强大性能,为日常流畅系统体验提供了强劲的性能支撑。

在系统导航方面,iQOO可支持适配全面屏操作的导航手势,减少导航键对屏幕的占有,从界面底部三个区域向上滑动,可分别调出控制中心、返回待机、返回上一级界面,整体的操作体验较为顺畅,而且导航手势的设计也较为人性化,可极为快速的熟练上手操作。

另外在智能体验方面iQOO同样带来了不少细节的贴心设计,比如隔空解锁与智能提醒功能。进入手机智能体感设置界面,开启隔空解锁功能,即可无锁屏密码且点亮屏幕时,手掌从手机顶部上方(3cm-5cm)处拂过即可解锁,有种特殊的魔术感。另外开启智能提醒功能之后,拿起手机即可获得未接来电和未读信息的提醒,更为贴心。

最贴心的还是要属Jovi语音助手功能,iQOO搭载从硬件到软件全面升级的Jovi语音助手,可智能的识别语音指令,达到快速的命令执行。除此之外,最欢喜的还是其“我的教学命令”功能,可通过教会Jovi非出厂应用或命令的新操作,做到真正懂你所需的智能语音体验。

iQOO全系配备了NFC-eSE芯片功能,可满足NFC刷公交等便利的手机支付体验,在使用时可通过vivo 钱包开通vivo公交服务,然后在使用时只需把手机贴近公交刷卡机或者地铁闸机,即可享受手机刷卡乘车的便捷体验。

总的来说,iQOO作为第一款全新vivo子品牌旗舰机,搭载的硬核855高通骁龙旗舰芯、LPDDR4X内存规格、超级液冷技术、第六代屏幕指纹技术、Monster Touch压感按键、4000mAh大电池以及44W超级闪充等众多黑科技加持,可谓是亮点多多,而后置广角三摄、前置双核1200万像素,NFC功能的加入又为其增分不少,最重要仅2998元的售价无疑让它在手机市场变得更有竞争力。