mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-03 17:58:55 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			347 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			347 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
SVG Guidelines
 | 
						|
==============
 | 
						|
 | 
						|
Pros and cons of SVG for images
 | 
						|
-------------------------------
 | 
						|
 | 
						|
When used as a document format there is usually a compelling reason that
 | 
						|
makes SVG the only solution. When used as an `image
 | 
						|
format <https://developer.mozilla.org/en-US/docs/Web/SVG/SVG_as_an_Image>`__,
 | 
						|
it is sometimes less obvious whether it would be best to use SVG or a
 | 
						|
raster image format for any given image. The vector format SVG and
 | 
						|
raster formats like PNG both have their place. When choosing whether or
 | 
						|
not to use SVG it is best to understand the advantages and disadvantages
 | 
						|
of both.
 | 
						|
 | 
						|
File size
 | 
						|
   Whether SVG or a raster format will produce a smaller file for a
 | 
						|
   given image depends very much on the image. For example, consider an
 | 
						|
   image of a path with a gradient fill. The size of an SVG of this
 | 
						|
   image will be the same regardless of the dimensions of the image. On
 | 
						|
   the other hand the size of a raster file of the same image will
 | 
						|
   likely vary tremendously depending on the dimensions of the image
 | 
						|
   since the larger the dimensions the more pixel data the file needs to
 | 
						|
   store. At very small dimensions (the extreme case being 1px x 1px)
 | 
						|
   the raster file will likely be much smaller than the SVG file since
 | 
						|
   it only needs to store one pixel of data. At large dimensions the
 | 
						|
   raster file may be much larger than the SVG file.
 | 
						|
Scalability, with caveats
 | 
						|
   One of the primary advantages of SVG is that as it is scaled it does
 | 
						|
   not pixelate. However, this is not to say that it always does away
 | 
						|
   with the need to have a collection of raster images for display at
 | 
						|
   different scales. This can be particularly true for icons. While SVG
 | 
						|
   may scale well enough for flat-ish icons without a lot of detail, for
 | 
						|
   icons that try to pack in a lot of detail graphic artists generally
 | 
						|
   `want to be able to pixel
 | 
						|
   tweak <https://www.pushing-pixels.org/2011/11/04/about-those-vector-icons.html>`__.
 | 
						|
Performance
 | 
						|
   While SVG provides a lot of flexibility in terms of scaling,
 | 
						|
   themability, etc. this flexibility depends on doing computations for
 | 
						|
   SVG images at the time they're displayed, rather than at the time the
 | 
						|
   author creates them. Consider an image that involves some complex
 | 
						|
   gradients and filters. If saved as a raster image then the work to
 | 
						|
   rasterize the gradients and filters takes place on the authors
 | 
						|
   computer before the result is stored in the raster file. This work
 | 
						|
   doesn't need to be redone when the image is displayed on someone
 | 
						|
   else's computer. On the other hand, if the image is saved as an SVG
 | 
						|
   image then all this work needs to be done each time the SVG is
 | 
						|
   displayed on someone else's computer. This isn't to say that SVG
 | 
						|
   images are always slower than raster equivalents. In fact it can be
 | 
						|
   faster to send vector information from an SVG to a user's GPU than it
 | 
						|
   is to extract raster data from an equivalent raster image. And even
 | 
						|
   when an SVG image is slower than a raster equivalent, the difference
 | 
						|
   is usually not noticeable. However, just don't fall into the trap of
 | 
						|
   thinking that SVGs are faster than equivalent raster images, or vice
 | 
						|
   versa. Once again, "it depends".
 | 
						|
 | 
						|
Authoring guidelines
 | 
						|
--------------------
 | 
						|
 | 
						|
A lot of SVG files (particularly those generated by SVG editors) ship
 | 
						|
without being cleaned up and can contain a ton of junk that bloats the
 | 
						|
file size and slows down rendering. In general the best way to combat
 | 
						|
this is to first run SVG files through a linter such as
 | 
						|
`svgo <https://github.com/svg/svgo>`__ (see the Tools section below).
 | 
						|
However, when authoring SVGs by hand here are some best practices to
 | 
						|
help keep them lightweight. These rules are based on some real examples
 | 
						|
seen in Mozilla's code.
 | 
						|
 | 
						|
Basics
 | 
						|
~~~~~~
 | 
						|
 | 
						|
-  Two spaces indenting
 | 
						|
-  No useless whitespaces or line breaks (see below for more details)
 | 
						|
-  Adding a license header
 | 
						|
-  Use double quotes
 | 
						|
 | 
						|
Whitespace and line breaks
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
Whitespace
 | 
						|
^^^^^^^^^^
 | 
						|
 | 
						|
In addition to trailing whitespace at the end of lines, there are a few
 | 
						|
more cases more specific to SVGs:
 | 
						|
 | 
						|
-  Trailing whitespaces in attribute values (usually seen in path
 | 
						|
   definitions)
 | 
						|
-  Excessive whitespace in path or polygon points definition
 | 
						|
 | 
						|
Whitespace examples
 | 
						|
^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
This path:
 | 
						|
 | 
						|
.. code:: html
 | 
						|
 | 
						|
   <path d=" M5,5    L1,1z ">
 | 
						|
 | 
						|
can be cut down to this:
 | 
						|
 | 
						|
.. code:: html
 | 
						|
 | 
						|
   <path d="M5,5 L1,1z">
 | 
						|
 | 
						|
Similarly, this polygon:
 | 
						|
 | 
						|
.. code:: html
 | 
						|
 | 
						|
   <polygon points="  0,0   4,4  4,0  "/>
 | 
						|
 | 
						|
can be cut down to this:
 | 
						|
 | 
						|
.. code:: html
 | 
						|
 | 
						|
   <polygon points="0,0 4,4 4,0"/>
 | 
						|
 | 
						|
Line breaks
 | 
						|
^^^^^^^^^^^
 | 
						|
 | 
						|
You should only use line breaks for logical separation or if they help
 | 
						|
make the file readable. You should avoid line breaks between every
 | 
						|
single element or within attribute values. It's recommended to put the
 | 
						|
attributes on the same line as their tag names, if possible. You should
 | 
						|
also put the shortest attributes first, so they are easier to spot.
 | 
						|
 | 
						|
Unused tags and attributes
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
Editor metadata
 | 
						|
^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Vector editors (Inkscape, Adobe Illustrator, Sketch) usually add a bunch
 | 
						|
of metadata in SVG files while saving them. Metadata can mean many
 | 
						|
things, including:
 | 
						|
 | 
						|
-  The typical "Created with *editor*" comments
 | 
						|
-  Non-standard editor specific tags and attributes (``sketch:foo``,
 | 
						|
   ``illustrator:foo``, ``sopodi:foo``, …)
 | 
						|
-  The `XML
 | 
						|
   namespace <https://developer.mozilla.org/en-US/docs/Web/SVG/Namespaces_Crash_Course>`__
 | 
						|
   definition that comes with the latter (``xmlns:sketch``,
 | 
						|
   ``xmlns:sopodi``, …)
 | 
						|
 | 
						|
Other metadata
 | 
						|
^^^^^^^^^^^^^^
 | 
						|
 | 
						|
In addition to non-standard editor metadata, standard compliant metadata
 | 
						|
also exists. Typical examples of this are ``<title>`` and ``<desc>``
 | 
						|
tags. Although this kind of data is supported by the browser, it can
 | 
						|
only be displayed when the SVG is opened in a new tab. Plus, in most of
 | 
						|
the cases, the filename is quite descriptive So it's recommended to
 | 
						|
remove that kind of metadata since it doesn't bring much value.
 | 
						|
 | 
						|
You shouldn't include DOCTYPEs in your SVGs either; they are a source of
 | 
						|
many issues, and the SVG WG recommends not to include them. See `SVG
 | 
						|
Authoring
 | 
						|
guidelines <https://jwatt.org/svg/authoring/#doctype-declaration>`__.
 | 
						|
 | 
						|
Avoid the use of CDATA sections
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
`CDATA
 | 
						|
sections <https://developer.mozilla.org/en-US/docs/Web/API/CDATASection>`__
 | 
						|
are used to avoid parsing some text as HTML. Most of time, CDATA isn't
 | 
						|
needed, for example, the content in ``<style>`` tags doesn't need to be
 | 
						|
wrapped in a CDATA section as the content inside the tag is already
 | 
						|
correctly parsed as CSS.
 | 
						|
 | 
						|
Invisible shapes
 | 
						|
^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
There are two kinds of invisible shapes: The off-screen ones and the
 | 
						|
uncolored ones.
 | 
						|
 | 
						|
The offscreen shapes are hard to spot, even with an automated tool, and
 | 
						|
are usually context aware. Those kinds of shapes are visible but off the
 | 
						|
`SVG view
 | 
						|
box <https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox>`__.
 | 
						|
Here's `an
 | 
						|
example <https://hg.mozilla.org/mozilla-central/diff/9fb143f3b36a/browser/themes/shared/heartbeat-star-lit.svg>`__
 | 
						|
of a file with offscreen shapes.
 | 
						|
 | 
						|
On the other hand, the uncolored ones are easier to spot, since they
 | 
						|
usually come with styles making them invisible. They must meet two
 | 
						|
conditions: they must be devoid of any fill (or a transparent one) or
 | 
						|
stroke.
 | 
						|
 | 
						|
Unused attributes on root ``<svg>`` element
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
The root ``<svg>`` element can also host many useless attributes. Here's
 | 
						|
an
 | 
						|
`example <https://hg.mozilla.org/mozilla-central/diff/2d38fecce226/browser/components/loop/content/shared/img/icons-10x10.svg>`__
 | 
						|
taking into account the list below:
 | 
						|
 | 
						|
-  ``version``
 | 
						|
-  ``x="0"`` and ``y="0"``
 | 
						|
-  ``enable-background`` (unsupported by Gecko and now deprecated by the
 | 
						|
   Filter Effects specification)
 | 
						|
-  ``id`` (id on root element has no effect)
 | 
						|
-  ``xmlns:xlink`` attribute when there are no ``xlink:href`` attributes
 | 
						|
   used throughout the file
 | 
						|
-  Other unused `XML
 | 
						|
   Namespace <https://developer.mozilla.org/en-US/docs/Web/SVG/Namespaces_Crash_Course>`__
 | 
						|
   definitions
 | 
						|
-  ``xml:space`` when there is no text used in the file
 | 
						|
 | 
						|
Other
 | 
						|
^^^^^
 | 
						|
 | 
						|
-  Empty tags, this may be obvious, but those are sometimes found in
 | 
						|
   SVGs
 | 
						|
-  Unreferenced ids (usually on gradient stops, but also on shapes or
 | 
						|
   paths)
 | 
						|
-  ``clip-rule`` attribute when the element *is not* a descendant of a
 | 
						|
   ``<clipPath>``
 | 
						|
-  ``fill-rule`` attribute when the element *is* a descendant of a
 | 
						|
   ``<clipPath>``
 | 
						|
-  Unreferenced/Unused clip paths, masks or defs
 | 
						|
   (`example <https://hg.mozilla.org/mozilla-central/diff/2d38fecce226/toolkit/themes/shared/reader/RM-Plus-24x24.svg>`__)
 | 
						|
 | 
						|
Styling
 | 
						|
~~~~~~~
 | 
						|
 | 
						|
Styling basics
 | 
						|
^^^^^^^^^^^^^^
 | 
						|
 | 
						|
-  Privilege short lowercase hex for colors
 | 
						|
-  Don't use excessive precision for numeric values (usually comes from
 | 
						|
   illustrator)
 | 
						|
-  Use descriptive IDs
 | 
						|
-  Avoid inline styles and use class names or SVG attributes
 | 
						|
 | 
						|
Styling examples
 | 
						|
''''''''''''''''
 | 
						|
 | 
						|
Here are some examples for excessive number precision:
 | 
						|
 | 
						|
-  5.000000e-02 → 0.05 (as seen
 | 
						|
   `here <https://hg.mozilla.org/mozilla-central/diff/2d38fecce226/browser/themes/shared/devtools/images/tool-network.svg#l1.31>`__)
 | 
						|
-  -3.728928e-10 → 0 (as seen
 | 
						|
   `here <https://hg.mozilla.org/mozilla-central/diff/2d38fecce226/browser/themes/shared/aboutNetError_alert.svg#l1.12>`__)
 | 
						|
-  translate(0.000000, -1.000000) → translate(0, -1) (as seen
 | 
						|
   `here <https://hg.mozilla.org/mozilla-central/diff/2d38fecce226/browser/themes/shared/heartbeat-icon.svg#l1.13>`__)
 | 
						|
 | 
						|
As for descriptive IDs:
 | 
						|
 | 
						|
-  For gradients: SVG_ID1 → gradient1 (as seen
 | 
						|
   `here <https://hg.mozilla.org/mozilla-central/diff/2d38fecce226/browser/themes/shared/aboutNetError_alert.svg#l1.12>`__)
 | 
						|
 | 
						|
Use of class names
 | 
						|
^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
-  Avoid using a class if that class is only used once in the file
 | 
						|
-  If that class only sets a fill or a stroke, it's better to set the
 | 
						|
   fill/stroke directly on the actual shape, instead of introducing a
 | 
						|
   class just for that shape. You can also use SVG grouping to avoid
 | 
						|
   duplicating those attributes
 | 
						|
-  Avoid introducing variants of the same file (color/style variants),
 | 
						|
   and use sprites instead (with class names)
 | 
						|
 | 
						|
Default style values
 | 
						|
^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
There's usually no need to set the default style value unless you're
 | 
						|
overriding a style. Here are some commonly seen examples:
 | 
						|
 | 
						|
-  ``style="display: none;"`` on ``<defs>`` elements (a ``<defs>``
 | 
						|
   element is hidden by default)
 | 
						|
-  ``type="text/css"`` on ``<style>`` elements
 | 
						|
-  ``stroke: none`` or ``stroke-width: 0``
 | 
						|
 | 
						|
SVG grouping
 | 
						|
~~~~~~~~~~~~
 | 
						|
 | 
						|
Style grouping
 | 
						|
^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Group similarly styled shapes under one ``<g>`` tag; this avoids having
 | 
						|
to set the same class/styles on many shapes.
 | 
						|
 | 
						|
Avoid excessive grouping
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Editors can sometimes do excessive grouping while exporting SVGs. This
 | 
						|
is due to the way editors work.
 | 
						|
 | 
						|
Nested groups
 | 
						|
'''''''''''''
 | 
						|
 | 
						|
Avoid multiple-level nesting of groups, these make the SVG less
 | 
						|
readable.
 | 
						|
 | 
						|
Nested transforms
 | 
						|
'''''''''''''''''
 | 
						|
 | 
						|
Some editors use ``<g>`` tags to do nested transforms, which is usually
 | 
						|
not needed. You can avoid this by doing basic algebra, for example:
 | 
						|
 | 
						|
.. code:: xml
 | 
						|
 | 
						|
   <g transform="translate(-62, -310)"><shape transform="translate(60, 308)"/></g>
 | 
						|
 | 
						|
can be cut down to:
 | 
						|
 | 
						|
.. code:: xml
 | 
						|
 | 
						|
   <shape transform="translate(-2,-2)"/>
 | 
						|
 | 
						|
because: -62+60 = -310+308 = -2
 | 
						|
 | 
						|
Performance tips
 | 
						|
~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
These rules are optional, but they help speeding up the SVG.
 | 
						|
 | 
						|
-  Avoid using a ``<use>`` tag when that ``<use>`` tag is being
 | 
						|
   referenced only once in the whole file.
 | 
						|
-  Instead of using CSS/SVG
 | 
						|
   `transforms <https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform>`__,
 | 
						|
   apply directly the transform on the path/shape definition.
 | 
						|
 | 
						|
Tools
 | 
						|
~~~~~
 | 
						|
 | 
						|
Tools can help to clean SVG files. Note, however that some of the rules
 | 
						|
stated above can be hard to detect with automated tools since they
 | 
						|
require too much context-awareness. To this date, there doesn't seem to
 | 
						|
be a tool that handles all of the above. However, there are some
 | 
						|
utilities that cover parts of this document:
 | 
						|
 | 
						|
-  Mostly complete command line tool: https://github.com/svg/svgo
 | 
						|
-  Alternatives to SVGO:
 | 
						|
 | 
						|
   -  https://github.com/RazrFalcon/svgcleaner
 | 
						|
   -  https://github.com/scour-project/scour
 | 
						|
 | 
						|
-  GUI for command line tool (use with "Prettify code" and "Remove
 | 
						|
   ``<title>``" options on): https://jakearchibald.github.io/svgomg/
 | 
						|
-  Good alternative to SVGO/SVGOMG:
 | 
						|
   https://petercollingridge.appspot.com/svg-editor
 | 
						|
-  Fixes the excessive number precision:
 | 
						|
   https://simon.html5.org/tools/js/svg-optimizer/
 | 
						|
-  Converts inline styles to SVG
 | 
						|
   attributes: https://www.w3.org/wiki/SvgTidy
 | 
						|
-  RaphaelJS has a couple of utilities that may be useful:
 | 
						|
   `raphael.js <https://dmitrybaranovskiy.github.io/raphael/>`__
 |