SVG颜色、渐变和填充

颜色

RGB和HSL都是CSS3支持的颜色表示方法,一般普遍使用是RGB。PS:HSL浏览器兼容。

RGB

RGB即是代表红、绿、蓝三个通道的颜色,通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的。

表示方式 取值范围 优点 缺点
rgb(r, g, b)
[0, 255]

每个分量


显示器容易分析,

目前的显示器大都是采用了RGB颜色标准

不符合人类描述颜色的习惯
#rrggbb 00 - FF

十六进制正整数

   

例子:

HSL

HSL即是代表色相,饱和度,亮度三个通道的颜色,通过对色相(H)、饱和度(S)、亮度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。

表示方式 取值范围 优点
hsl(h, s%, l%)
h:[0, 359]

s,l:[0, 100]

符合人类描述颜色的习惯

例子:

互相转换的原理

互相转换的原理挺复杂,就不多说。

用js实现RGB与HSL的互相转换,可查看:http://www.zhangxinxu.com/wordpress/2010/03/javascript-hex-rgb-hsl-color-convert/

透明度

设置颜色的透明度,有两种方法:

1. rgb(r, g ,b ,a)和hsl(h, s%, l%, a) 表示带透明度的颜色。

2. opacity属性表示元素的透明度。

PS:a和opacity的取值范围:[0, 1]

渐变

渐变是一种从一种颜色到另一种颜色的平滑过渡,两种主要渐变是线性渐变和径向渐变。

线性渐变

<linearGradient> 可用来定义 SVG 的线性渐变,主要是定义方向和颜色。

<linearGradient> 标签一般嵌套在 <defs> 的内部。 (SVG的<defs>元素用于预定义(不会显示)一个元素使其能够在SVG图像中重复使用。)

渐变方向

方向 参数
水平 当 y1 和 y2 相等,而 x1 和 x2 不同时
垂直 当 x1 和 x2 相等,而 y1 和 y2 不同时
角形 当 x1 和 x2 不同,且 y1 和 y2 不同时

示例:

<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
     <defs>
          <linearGradient id="orange_red" x1="0%" y1="0%" x2="100%" y2="0%">
               <stop offset="0%" stop-color="blue"/>
               <stop offset="50%" stop-color="orange"/>
               <stop offset="100%" stop-color="red"/>
          </linearGradient>
     </defs>
     <ellipse cx="200" cy="190" rx="80" ry="50" style="fill:url(#orange_red)"/>
</svg>

效果:

代码解析:

1. <linearGradient> 标签的 id 属性可为渐变定义一个唯一的名称。

2. fill:url(#orange_red) 属性把ellipse元素链接到此渐变。

3. <linearGradient> 标签的 x1、x2、y1、y2 属性可定义渐变的开始和结束位置。

4. 渐变的颜色范围可由两种或多种颜色组成。每种颜色通过一个 <stop> 标签来规定。offset 属性用来定义渐变的开始和结束位置。

注意:

gradientUnits,它定义了渐变使用的坐标单位。这个属性有2个可用值:userSpaceOnUse和objectBoundingBox(默认值)。

名称 单位 使用坐标系 描述
objectBoundingBox(默认值) 百分比 自身坐标系 基于渐变元素的长宽的百分比。
userSpaceOnUse 数值 原始坐标系 相对原始坐标系的数值(绝对值)。

为了让userSpaceOnUse的效果跟objectBoundingBox一致,那上面代码需变成

<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
     <defs>
          <linearGradient id="orange_red" x1="120" y1="120" x2="300" y2="120" gradientUnits="userSpaceOnUse">
               <stop offset="0%" stop-color="blue"/>
               <stop offset="50%" stop-color="orange"/>
               <stop offset="100%" stop-color="red"/>
          </linearGradient>
     </defs>
     <ellipse cx="200" cy="200" rx="80" ry="50" style="fill:url(#orange_red)"/>
</svg>

PS:不同的部分是橙色部分,这部分需要根据图形在原始坐标系的位置算出来,还是比较麻烦。

径向渐变

<radialGradient> 可用来定义 SVG 的径向渐变,主要是定义方向和颜色。

渐变方向

cx、cy 和 r 属性定义外圈,而 fx和fy 定义内圈(可认为是往哪聚焦) 。

名称 描述 默认值
cx 渐变的中心点x位置 50%
cy 渐变的中心点y位置 50%
r 渐变的半径 50%
fx 渐变的焦点 0%
fy 渐变的焦点 0%

示例:

<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
     <defs>
          <radialGradient id="orange_red" cx="20%" cy="40%" r="50%" fx="50%" fy="50%">
               <stop offset="0%" stop-color="blue"/>
               <stop offset="50%" stop-color="orange"/>
               <stop offset="100%" stop-color="red"/>
          </radialGradient>
     </defs>
     <circle cx="200" cy="200" r="80" style="fill:url(#orange_red)"/>
</svg>

效果:

PS:radialGradient也有gradientUnits参数。

填充

SVG的填充可以用一个SVG元素,也可以是位图图像,通过<pattern>元素在x轴或y轴方向以固定的间隔平铺。

示例:

<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
     <defs>
          <pattern id="grid" x="100" y="100" width="0.2" height="0.2">
               <circle cx="10" cy="10" r="5" fill="red"></circle>
               <polygon points="30 10 60 50 0 50" fill="green"></polygon>
          </pattern>
     </defs>
    <rect x="100" y="100" width="400" height="300" fill="url(#grid)" stroke="blue"></rect>
</svg>

效果:

参数

名称 描述 默认值
x 填充图案的x偏移量,来自左上角 0
y 填充图案的y偏移量,来自左上角 0
width 填充图案的宽度 0
height 填充图案的高度 0
patternUnits 设置pattern的使用单位 objectBoundingBox
patternContentUnits 设置pattern内图案的使用单位 userSpaceOnUse

PS:patternUnits和patternContentUnits的取值都一样,userSpaceOnUse和objectBoundingBox,只不过默认值不一样。

使用位图示例

<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
     <defs>
          <pattern id="pattern-image" x="0" y="0" width="0.2" height="0.2">
               <image xlink:href="face.gif" x="0" y="0" width="50" height="50"></image>
          </pattern>
     </defs>
    <rect x="100" y="100" width="400" height="300" fill="url(#pattern-image)" stroke="blue"></rect>
</svg>

效果:

代码地址

想看文章的代码示例,可以到我的Github下载:https://github.com/codingforme/code-learn/tree/master/svg

参考文献

1. http://www.w3school.com.cn/svg/svg_grad_linear.asp

2. http://www.cnblogs.com/lhweb15/p/5489699.html

3. https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Patterns

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5971781.html

时间: 2024-10-03 02:41:18

SVG颜色、渐变和填充的相关文章

VC 实现视图区背景颜色渐变填充

[cpp] view plaincopy void CSTest1View::OnDraw(CDC* pDC) { CSTest1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CRect rcClient; GetClientRect(&rcClient); rcClient.DeflateRect(5,5,5,5); if(m_nMode==0) { TRIV

iOS 动画绘制线条颜色渐变的折线图

效果图 .................... 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图.折线图可以更加直观的表示数据的变化.网络上有很多绘制折线图的demo,有的也使用了动画,但是线条颜色渐变的折线图的demo少之又少,甚至可以说没有.该Blog阐述了动画绘制线条颜色渐变的折线图的实现方案,以及折线图线条颜色渐变的实现原理,并附以完整的示例. 成果 本人已将折线图封装到了一个UIView子类中,并提供了相应的接口.该自定义折线图视图,基本上可以适用于大部分

渐变和填充02

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import  * from PyQt4.Qt import * from PyQt4 import QtGui, QtCore from PyQt4.QtCore import * import sys #色轮(color wgeel),概念:一个带有颜色的圆盘 class Painterd(QWidget): def __ini

渐变和填充01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #渐变和填充 #说明 """ 简单来说就是可以把几种颜色混合在一起,让它们能够自 然地过渡,而不是一下子变成另一种颜色.渐变的算法比较复杂,写得不好的话效率会很低, 好在很多绘图系统都内置了渐变的功能, Qt  也不例外.渐变一般是用在填充里面的,所以, 设置渐变是在 QBrush 里面. """ #在qt中3种渐变

code实现透明度渐变和颜色渐变的view

最近用code写了些view上的渐变效果,使得app的UI特效不必全部依赖美工出的图片. 效果如下: 主要用到了Layer上的渐变层,核心代码如下,关于CALaer的使用可参考 //Transparent Gradient Layer - (void) insertTransparentGradient { UIColor *colorOne = [UIColor colorWithRed:(33/255.0) green:(33/255.0) blue:(33/255.0) alpha:0.0

鼠标在字体上移动,字体颜色渐变

这里的传参方法跟本博客中javascript"鼠标移入移出背景色渐变"中的传参方式相同,我贴的代码是全部都有的,大家可以复制过去直接看效果,有更好的建议的望留言…… <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>鼠标在字体上移入移出字体颜色渐变</title> <style&g

自定义控件之圆形颜色渐变进度条--SweepGradient

前几天在群里面有人找圆形可颜色渐变进度条,其中主要的知识点是SweepGradient: mSweepGradient = new SweepGradient(240, 360, new int[] { Color.CYAN, Color.DKGRAY, Color.GRAY, Color.LTGRAY, Color.MAGENTA, Color.GREEN, Color.TRANSPARENT, Color.BLUE }, null); 如上:第三个参数为渐变颜色内容,前两个是坐标信息,240

CSS 实现背景色渐变和文字颜色渐变

1. 背景色渐变 A . linear-gradient:用线性渐变创建图像. 语法:<linear-gradient> = linear-gradient([ [ <angle> | to <side-or-corner> ] ,]? <color-stop>[, <color-stop>]+) 下述值用来表示渐变的方向,可以使用角度或者关键字来设置: <angle>:用角度值指定渐变的方向(或角度). to left: 设置渐变为

CAGradientLayer颜色渐变器

使用CAGradientLayer可以实现颜色的渐变, 我们先看下头文件 @interface CAGradientLayer : CALayer @property(nullable, copy) NSArray *colors;//颜色渐变的数组 @property(nullable, copy) NSArray<NSNumber *> *locations;//渐变颜色的区间分布,locations的数组长度和color一致,默认是nil,会平均分布 @property CGPoint

颜色渐变CSS

颜色渐变CSS IE系列 filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr='#FF0000',endColorStr='#F9F900',gradientType='0'); 参数:startColorStr起始颜色 endColorStr结束颜色 gradientType为0时代表垂直,为1时代表水平 Firefox background: -moz-linear-gradient(top, #FF0000, #