SVG on veebisaidi ikoonide jaoks parim vorming selles pole kahtlust. See võimaldab teil saada teravaid ikoone olenemata ekraani pikslite tihedusest, saate muuta SVG stiile hõljutades ja saate isegi ikoone animeerida CSS-i või JavaScriptiga.
SVG-d lehele lisamiseks on palju võimalusi ning igal tehnikal on oma eelised ja puudused. Viimased paar aastat olen kasutanud Sassi funktsiooni, et importida oma ikoonid otse oma CSS-i ja vältida HTML-i märgistuse sassi ajamist.
Mul on Sassi loend kõigi ikoonide lähtekoodidega. Seejärel kodeeritakse iga ikoon Sassi funktsiooniga andme-URI-sse ja salvestatakse a kohandatud vara lehe juurtes.
TL; DR
Siin on mul teie jaoks Sassi funktsioon, mis loob SVG ikooniteegi otse teie CSS-is.
SVG lähtekood koostatakse funktsiooniga Sass, mis kodeerib need andme-URI-sse ja salvestab seejärel ikoonid CSS-i kohandatud atribuutidesse. Seejärel saate kasutada mis tahes ikooni kõikjal oma CSS-is, nagu oleks see väline pilt.
See on näide otse minu isikliku saidi koodist:
.c-filters__summary h2:after {
content: var(--svg-down-arrow);
position: relative;
top: 2px;
margin-left: auto;
animation: closeSummary .25s ease-out;
}
Demo
Sass struktuur
/* All the icons source codes */
$svg-icons: (
burger: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0...'
);
/* Sass function to encode the icons */
@function svg($name) {
@return url('data:image/svg+xml, #{$encodedSVG} ');
}
/* Store each icon into a custom property */
:root {
@each $name, $code in $svg-icons {
--svg-#{$name}: #{svg($name)};
}
}
/* Append a burger icon in my button */
.menu::after {
content: var(--svg-burger);
}
Sellel tehnikal on nii plusse kui ka miinuseid, seega võtke neid enne selle lahenduse rakendamist oma projektis arvesse:
Plusse
- SVG-failide jaoks pole HTTP-päringuid.
- Kõik ikoonid on salvestatud ühes kohas.
- Kui teil on vaja ikooni värskendada, ei pea te iga HTML-i mallifaili üle vaatama.
- Ikoonid salvestatakse vahemällu koos teie CSS-iga.
- Saate ikoonide lähtekoodi käsitsi redigeerida.
- See ei saasta teie HTML-i täiendava märgistuse lisamisega.
- CSS-iga saate siiski muuta ikooni värvi või mõnda aspekti.
Miinused
- CSS-iga ei saa SVG teatud osa animeerida ega värskendada.
- Mida rohkem ikoone teil on, seda raskem on teie CSS-i kompileeritud fail.
Kasutan seda tehnikat enamasti ikoonide, mitte logode või illustratsioonide jaoks. Kodeeritud SVG on alati raskem kui selle algne fail, nii et laadin oma keerulise SVG ikkagi koos välise failiga või või minu CSS-is koos
url(path/to/file.svg)
.
SVG kodeerimine andmete URI-sse
SVG kodeerimine andmete URI-dena pole uus. Tegelikult Chris Coyier kirjutas postituse rohkem kui 10 aastat tagasi, et selgitada, kuidas seda tehnikat kasutada ja miks peaksite (või ei tohiks) seda kasutada.
Andme-URI-ga CSS-is SVG-d saab kasutada kahel viisil.
- Välise pildina (kasutades
background-image,
ääris-pilt,
loendi stiilis pilt,…) - Pseudoelemendi sisuna (nt
::before
or::after
)
Siin on põhinäide, mis näitab, kuidas neid kahte meetodit kasutada.
Selle konkreetse teostuse peamine probleem on see, et iga kord, kui vajate uut ikooni, peate SVG käsitsi teisendama ja see pikk loetamatu koodijada CSS-is ei ole tegelikult meeldiv.
Siin tuleb appi Sass!
Sassi funktsiooni kasutamine
Sassi kasutades saame oma elu lihtsamaks muuta, kopeerides oma SVG lähtekoodi otse oma koodibaasi, lastes Sassil neid korralikult kodeerida, et vältida brauseri vigu.
See lahendus on enamasti inspireeritud olemasolevast funktsioonist, mille on välja töötanud Threespot Media ja mis on saadaval riigis nende hoidla.
Siin on selle tehnika neli sammu:
- Looge muutuja kõigi loetletud SVG-ikoonidega.
- Loetlege kõik märgid, mis tuleb andme-URI jaoks vahele jätta.
- Rakendage funktsioon SVG-de kodeerimiseks andme-URI-vormingusse.
- Kasutage koodis oma funktsiooni.
1. Ikoonide loend
/**
* Add all the icons of your project in this Sass list
*/
$svg-icons: (
burger: ''
);
2. Paotavate märkide loend
/**
* Characters to escape from SVGs
* This list allows you to have inline CSS in your SVG code as well
*/
$fs-escape-chars: (
' ': '%20',
''': '%22',
'"': '%27',
'#': '%23',
'/': '%2F',
':': '%3A',
'(': '%28',
')': '%29',
'%': '%25',
'': '%3E',
'': '%5C',
'^': '%5E',
'{': '%7B',
'|': '%7C',
'}': '%7D',
);
3. Kodeerimisfunktsioon
/**
* You can call this function by using `svg(nameOfTheSVG)`
*/
@function svg($name) {
// Check if icon exists
@if not map-has-key($svg-icons, $name) {
@error 'icon “#{$name}” does not exists in $svg-icons map';
@return false;
}
// Get icon data
$icon-map: map-get($svg-icons, $name);
$escaped-string: '';
$unquote-icon: unquote($icon-map);
// Loop through each character in string
@for $i from 1 through str-length($unquote-icon) {
$char: str-slice($unquote-icon, $i, $i);
// Check if character is in symbol map
$char-lookup: map-get($fs-escape-chars, $char);
// If it is, use escaped version
@if $char-lookup != null {
$char: $char-lookup;
}
// Append character to escaped string
$escaped-string: $escaped-string + $char;
}
// Return inline SVG data
@return url('data:image/svg+xml, #{$escaped-string} ');
}
4. Lisage oma lehele SVG
button {
&::after {
/* Import inline SVG */
content: svg(burger);
}
}
Kui olete neid samme järginud, peaks Sass teie koodi õigesti kompileerima ja väljastama järgmise:
button::after {
content: url("data:image/svg+xml, %3Csvg%20xmlns=%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox=%270%200%2024.8%2018.92%27%20width=%2724.8%27%20height=%2718.92%27%3E%3Cpath%20d=%27M23.8,9.46H1m22.8,8.46H1M23.8,1H1%27%20fill=%27none%27%20stroke=%27%23000%27%20stroke-linecap=%27round%27%20stroke-width=%272%27%2F%3E%3C%2Fsvg%3E ");
}
Kohandatud atribuudid
Nüüd juurutatud Sass svg()
funktsioon töötab suurepäraselt. Kuid selle suurim viga on see, et ikoon, mida on koodis mitmes kohas vaja, dubleeritakse ja see võib teie kompileeritud CSS-faili kaalu oluliselt suurendada!
Selle vältimiseks saame salvestada kõik oma ikoonid CSS-i muutujad ja kasutage kodeeritud URI iga kord väljastamise asemel viidet muutujale.
Jätame sama koodi, mis meil varem oli, kuid seekord väljastame esmalt kõik Sassi loendi ikoonid oma veebilehe juure:
/**
* Convert all icons into custom properties
* They will be available to any HTML tag since they are attached to the :root
*/
:root {
@each $name, $code in $svg-icons {
--svg-#{$name}: #{svg($name)};
}
}
Nüüd selle asemel, et helistada svg()
funktsiooni iga kord, kui vajame ikooni, peame kasutama muutujat, mis loodi --svg
eesliide.
button::after {
/* Import inline SVG */
content: var(--svg-burger);
}
SVG-de optimeerimine
See meetod ei paku teie kasutatava SVG lähtekoodi optimeerimist. Veenduge, et te ei jätaks tarbetut koodi; vastasel juhul kodeeritakse need samuti ja suurendavad teie CSS-faili suurust.
Te saate vaadata see suurepärane nimekiri tööriistu ja teavet selle kohta, kuidas SVG-d õigesti optimeerida. Minu lemmiktööriist on Jake Archibald's SVGOMG — lihtsalt lohistage oma fail sinna ja kopeerige väljastatud kood.
Boonus: ikooni värskendamine hõljutades
Selle tehnikaga ei saa me CSS-iga valida SVG konkreetseid osi. Näiteks ei saa seda kuidagi muuta fill
ikooni värv, kui kasutaja hõljutab nuppu. Kuid on mõned nipid, mida saame CSS-iga kasutada, et saaksime oma ikooni välimust siiski muuta.
Näiteks kui teil on must ikoon ja soovite, et see hõljutaks valgena, võite kasutada invert()
CSS-filter. Samuti saame mängida hue-rotate()
filter.
See ongi!
Loodan, et see väike abifunktsioon on teie enda projektides kasulik. Andke mulle teada, mida te sellest lähenemisviisist arvate – tahaksin teada, kuidas saaksite seda paremaks muuta või teisiti lahendada!