אחד היתרונות הגדולים של SVG הוא האפשרות לשנות לו את הצבע דרך CSS.
אבל כדי לעשות את זה, אנחנו צריכים שהוא יהיה מוטמע בתוך הקוד שלנו ולא כקובץ שמפנים אליו את ה-SRC.
אם נטמיע בכל רכיב שלנו בפרויקט את הקוד של ה-SVG הוא יראה מכוער ולא קל לתחזוקה.
אל דאגה! 🎃 בשביל זה אנחנו כאן.
ניצור קובץ או קבצים שיחזיקו את הקוד של ה-SVG וייצאו אותם כמשתנים
export const approve = ` <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 7.9374998 7.9375002" version="1.1"> <title>approve</title> <defs/> <metadata> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title>approve</dc:title> </cc:Work> </rdf:RDF> </metadata> <g> <path d="M 1.7629193,4.2510784 0.57052571,3.8668785 3.1661113,7.4259435 7.4414062,0.28938802 3.1661113,5.7291038 Z" style="fill:inherit;stroke:inherit;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" /> </g> </svg> ` export const cancel = ` <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 7.9374998 7.9375002" version="1.1"> <title>approve</title> <defs/> <metadata> <rdf:RDF> <cc:Work rdf:about=""> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> <dc:title>approve</dc:title> </cc:Work> </rdf:RDF> </metadata> <g> <path d="M 1.7629193,4.2510784 0.57052571,3.8668785 3.1661113,7.4259435 7.4414062,0.28938802 3.1661113,5.7291038 Z" style="fill:inherit;stroke:inherit;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" /> </g> </svg> `
מה עושים?
- מיצרים/מורידים/קונים מהרשת או כל מקור אחר, קובץ SVG.
- פותחים את הקובץ עם notepad ומעתיקים את התוכן שלו מהתגית הפותחת ועד הסוגרת של SVG
- מגדירים בקובץ שלנו משתנה, מחצינים אותו ומוסיפים את התוכן שהעתקנו בתוך backticks (הכפתור טילדה ~).
- יש למחוק מהקוד CLASS ו-ID
- בכל מקום שיש fill או stroke יש לשנות את הערך ל-inherit.
הרעיון הוא לבטל עיצוב פנימי של ה-SVG ולהפנות אותו להורשה מהמעטפת.
במקרה שלנו, שימו לב שיש 2 משתנים אבל העתקתי את אותו תוכן SVG, כך שיתקבל אותו אייקון אז להיבהל 😎
סיימנו לטפל בצד של ה-SVG, עכשיו אנחנו צריכים למשוך אותם לרכיבים ששם הם צריכים להופיע.
נראה רכיב לדוגמה
import { Component, OnInit } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import * as svgIcons from '../../../share/svgs/icons-svg'; @Component({ selector: 'app-popup-slogan', templateUrl: './slogan-popup.component.html', styleUrls: ['./slogan-popup.component.scss'] }) export class SloganPopupComponent implements OnInit { cancel: SafeHtml; approve: SafeHtml; constructor(private sanitizer: DomSanitizer) { this.cancel = this.sanitizer.bypassSecurityTrustHtml(svgIcons.cancel); this.approve = this.sanitizer.bypassSecurityTrustHtml(svgIcons.approve); } }
בצד ה-HTML
<div class="action-wrapper"> <button class="submit" type="button" (click)="onSave()" [disabled]="!form.valid"> <span class="icon" [innerHtml]="approve"></span>אישור</button> <button class="cancel" type="button" (click)="onCancel()"> <span class="icon" [innerHtml]="cancel"></span>ביטול</button> </div>
TS
שורה 2:
בגלל שיש לאנגולר מנגנון שהתפקיד שלו לסנן (למחוק) במקומות מסויימים תוים מסויימים כדי לשמור על האתר ולהקשות על פריצה או נזק , אנחנו צריכים להגיד לו שהמידע שיש במשתנה מסויים תקין.
אם לא נשתמש בזה, הוא ינסה ל-"נקות" את ה-SVG ובכך לגרום לא להפסיק לעבוד.
שורה 3:
נמשוך את כל המשתנים מהקובץ ונכניס אותם תחת משתנה בשם svgIcons או כל שם אחר שתרצו.
שורה 10-11:
יצרנו משתנים מסוג safeHtml
שורה 12:
מגדירים את DomSanitizer כדי שנוכל להשתמש בו
שורה 13-14:
מאכלסים את המשתנים שלנו עם הקוד של -SVG, שימו לב שאנחנו אומרים לאנגולר לא להפעיל את האבטחה על המשתנים האלו ובמילים אחרות, לקבל אותם כמו שהם ללא בדיקה.
חשוב להבין את זה ולא להשתמש בכל מקום בזה כדי לא לגרום לפירצת אבטחה באתר (בטח לא לעשות את זה על מידע שמגיע מהמשתמש או חשוף אליו).
HTML
שורה 3,5 :
אנחנו מזריקים את התוכן של המשתנים כ-HTML על מנת שהדפדפן יטפל בתגיות ולא יתיחס אליהם הטקסט פשוט.
סיימנו עם החלק המסובך וכל מה שנשאר הוא ה-CSS
svg { width: 100%; height: 100%; } .icon { width: 20px; height: 20px; display: inline-block; fill: red; stroke: blue; }
אפשר לעשות שינויים ל-fill ול-stroke בדיוק כמו שהייתם עושים לכל תגית אחרת.