Підготовка SVG для використання в Інтернеті це дуже простий процес, не складніший за експорт JPEG або PNG . Використовуйте будь-який звичний для вас графічний редактор (Illustrator, Sketch, Inkscape [безкоштовний] тощо [або навіть Photoshop, якщо ви використовуєте шари з формами]) з тим розміром зображення, який ви плануєте використовувати. Зазвичай я працюю в Ілюстраторі, тому я поясню деякі способи підготовки файлів у цій програмі, але взагалі вони застосовні і для будь-якої іншої програми. Вам, можливо, варто перевести текст у криві, оскільки шрифт, швидше за все, неправильно відображатиметься, якщо, звичайно, ви не плануєте стилізувати їх за допомогою веб-шрифту, який використовується на сторінці (що можливо!). Не варто також перетворювати всі об'єкти на єдині форми, особливо якщо у вас є обведення, яким необхідно буде керувати на сторінці, тим більше перетворення об'єктів часто не зменшує розмір файлу. Будь-які імена, надані групам або шарам, будуть додані до SVG як ID елемента. Це досить зручно для стилізації, але трохи збільшить загальний розмірфайлу.
Перед тим, як зробити експорт, необхідно перевірити, чи всі зображення знаходяться в цілісній піксельній сітці (тобто, наприклад, не 23.3px × 86.8px ). Інакше скоріш за все зображення не вистачатиме чіткості і частина зображення обріжеться. В Ілюстраторі це можна зробити наступним чином: Object > Artboards > Fit to Artwork Bounds . Потім тиснемо save as і вибираємо SVG і залишаємо налаштування за замовчуванням. Тут можна зробити невелику оптимізацію, але насправді не варто, тому що далі ми застосовуватимемо різні покращуючі прийоми, тому зараз ми не витрачатимемо марно час на ці налаштування.
Прийоми зменшення розмірів файла.
(Дивіться по оптимізації)
Щоб досягти найменшого розміру SVG, логічно видалити з нього все зайве. Найбільш відома та корисна програма(за Крайній мірія так думаю) для обробки SVG це SVGO. Вона видаляє весь не потрібний код. Але! Будьте уважні, використовуючи цю програму, якщо плануєте керувати SVG за допомогою CSS / JS , оскільки вона може занадто сильно почистити код, що ускладнить подальші зміни. Зручність SVGO ще й у тому, що її можна включити в процес автоматичного складання проекту, але можна також використовувати GUIякщо хочеться.
Розбираючись докладніше з правильним видаленнямвсього непотрібного, ми можемо зробити ще дещо в графічному редакторі. Спершу потрібно переконатися, що використовується настільки мало контурів/форм, наскільки це можливо, так само як і точок цих контурів. Можна об'єднувати та спрощувати все, що піддається спрощенню, та видалити все непотрібні точки. В Ілюстраторі є плагін VectorScribe з інструментом Smart Remove Brush Tool, який допоможе видалити крапки і при цьому залишити загальну формутой самий.
Попередня оптимізація
Smart Remove Brush Tool видалив точки
Далі збільшуватимемо зображення. В Ілюстраторі зручно включити перегляд з піксельною сіткою View > Pixel Preview і перевірити, як розташовуються контури. Щоб розмістити контури по сітці, знадобиться небагато часу, але ці зусилля окупляться і дозволять досягти чіткішого рендерингу (краще звернути на це увагу заздалегідь).
Крапки поза сіткою
Вирівнювання по сітці
Якщо є два і більше об'єкти для вирівнювання, варто видалити всі непотрібні перекриття. Іноді навіть якщо контури ретельно вирівняні, можна побачити тонку білу лінію. Щоб запобігти такому, можна трохи накласти об'єкти один на одного у місцях перекриття. Важливо: SVG z-index має певний порядок, який залежить від об'єкта, що знаходиться знизу, тому варто помістити верхній об'єкт у нижню частину файлу в коді.
І, нарешті, останнє, але важливе, те, що зазвичай забувають - це активувати gzip стиск SVG на вашому сайті в.htaccess файлі.
AddType image/svg+xml svg svgz
Як приклад того, наскільки ефективна ця техніка, я скористаюся оригінальним логотипом Breaking Borders і оптимізую його таким чином: збільшую розмір до того, яким він має бути; упорядкую контури; видалю максимально можливу кількість точок; пересунення крапки на цілочисленні пікселі; зсуну всі області перекриттів і відправлю це все в SVGO.
Оригінал: 1,413b
Після оптимізації: 409b
У результаті розмір файлу став меншим на ~71% (і на ~83% при стисканні)
На сьогоднішній день існує вже не один спосіб створювати анімацію SVG. Це можна зробити за допомогою тега, який вставляється прямо в код SVG. Існують спеціальні бібліотеки, такі як Snap.svg або SVG.js .
Ми розглянемо трохи інший підхід: за допомогою вбудованого SVG (SVG коду прямо в HTML) та анімації окремих частинпрямо через CSS.
Я нещодавно поекспериментував з цим методом, у проекті для моєї альма-матер Wufoo , так, щоб трохи освіжити у пам'яті тему, яку ми тут розглядатимемо.
У моїх останніх проектах SVG використовувалися рідко, тому, думаю, ця стаття є чудовою нагодою приділити йому більше уваги.
Остаточний вид анімації дуже простий. Ось як вона виглядає:
Подивитись на CodePen
Розгляньмо, як це робиться.
1. Складаємо список елементів, які ми будемо використовувати
Може здатися, що тут багато роботи на зразок як намалювати сову, але ця стаття присвячена анімації, так що з графікою давайте розберемося якнайшвидше.
Мій план полягав у тому, щоб зробити супер просту рекламу Wufoo , використовуючи їх класичний логотип, кольори та Корпоративний стиль. А потім додати трохи креативу:
- Створити ефект, ніби букви тікають зі сторінки. Wufoo - це веселе слово, нехай літери також будуть веселими;
- За день до цього ми розробили дизайн футболки, на лицьовій стороні якої був зображений динозавр, а на задній напис: « Швидкий. Розумний. Грізний». Це риси, які притаманні і динозаврам, і Wufoo. Не кажучи вже про те, що ми обіграли слово FORMidble (грізний). Тому я захотів зробити так, щоб в анімаційному блоці з'являлися та зникали ці слова;
- Щоб зв'язати ці слова з динозавром, у нас з'являтиметься голова T-Рексу, а потім швидко зникатиме. При цьому виводитиметься слово «Швидкий», що буде ще однією цікавою сполучною ланкою для елементів.
- Всі ці елементи я завантажив у Illustrator:
Зверніть увагу, як окреслено тексти логотипу та слогану. Це означає, що вони є просто векторними фігурами, і до них легко можна застосовувати ефекти як у SVG, так і в
Текст, який Ви бачите, «Швидкий. » так залишається в Illustrator у форматі тексту.
Коли я збережу файл у Illustrator , напис залишиться елементом.
2. Зберігаємо у форматі SVG
Illustrator підтримує функцію збереження у форматі SVG:
Ви можете відкрити цей SVG-файл у редакторі коду і побачити в ньому код SVG:
3. Вичищаємо SVG, задаємо класи для фігур
Ви можете пропустити код через SVGO , щоб оптимізувати його та прибрати непотрібні елементитипу DOCTYPE тощо.
Але нам зараз важливіше задати різні імена класів для фігур, таким чином ми зможемо вибрати їх у CSS і робити різні дії!
4. Вставляємо SVG
Ви можете скопіювати цей SVG-код і вставити його прямо в HTML, у місце, де ви хочете виводити блок. Але це лише примітивний шаблон.
Ви можете зробити щось на зразок цього:
5. Анімація!
Тепер всі ці фігури загнані в DOM , і ми можемо їх позиціонувати і задавати стилі, як і для будь-якого іншого елемент HTML. Давайте зробимо це.
Припустимо, ми хочемо використовувати 10-секундну часову шкалу:
Спочатку випадають і зникають слова
Перше, що ми хочемо зробити, це вивести по черзі слова « Швидкий. Розумний. Грізний.» Кожне слово відображатиметься протягом однієї секунди.
Так ми створюємо анімацію, де показ кожного слова займає 10% часу:
@keyframes hideshow ( 0% ( opacity: 1; ) 10% ( opacity: 1; ) 15% ( opacity: 0; ) 100% ( opacity: 0; ) )
Потім вказуємо перше слово та тривалість усієї анімації в 10 секунд (10% з яких становить 1 секунда):
Text-1 ( animation: hideshow 10s ease infinite; )
Наступні два слова спочатку будуть прихованими (opacity: 0; ), а потім використовуємо ту ж анімацію, тільки із затримкою в часі, щоб наступні слова виводилися трохи згодом:
Text-2 ( opacity: 0; animation: hideshow 10s 1.5s ease infinite; ) .text-3 ( opacity: 0; animation: hideshow 10s 3s ease infinite; )
Додаткові 0,5 секунди потрібні для того, щоб встановити інтервал між виведенням кожного наступного слова.
Стрибуючі літери
Як тільки ми задали анімацію для цього елемента, приступаємо до ефектів для літер у слові Wufoo, які повинні стрибати убік ось так:
Хитрість тут у тому, що ми створюємо анімаційний ефект, Що триває всього 5 секунд, але запускаємо його один раз вперед, а потім у зворотному напрямку.
Таким чином, він відповідатиме нашому 10-секундному графіку, і розташовуватиметься посередині шкали часу. Нам залишається тільки встановити параметри для прокручування ефекту анімації в одному напрямку, тому що при зворотній прокрутцівін просто повернеться на вихідну позицію.
Ефекти для кожної літери мають невелику затримку в часі, тому вони переміщаються не всі одночасно, а одна за одною:
Wufoo-letter ( animation: kaboom 5s ease alternate infinite; &:nth-child(2) ( animation-delay: 0.1s; ) &:nth-child(3) ( animation-delay: 0.2s; ) &:nth- child(4) ( animation-delay: 0.3s; ) &:nth-child(5) ( animation-delay: 0.4s; ) ) @keyframes kaboom ( 90% ( transform: scale(1.0); ) 100% ( transform : scale(1.1); ) )
Наведений вище SCSS-код - це просто коротка версія, він не включає префіксів (які знадобляться вам на практиці).
Я думаю, що animation-delay це властивість, яка була б корисною взяти з оригінального CSS . Це виглядало б акуратніше, коли літери зсуваються з невеликою затримкою.
І нарешті, динозавр
Після того, як у блоці промайнули ці написи, знизу виїжджає голова динозавра. Незважаючи на те, що фігура динозавра складається з великої кількостіелементів, ми можемо позиціонувати їх усі разом за допомогою тега позиціонування (група), який містить у собі всі ці елементи.
Оскільки для позиціонування анімації ефективніше використовувати перетворення, ми зробимо це за допомогою keyframes :
@keyframes popup ( 0% ( transform: translateY(150px); ) 34% ( transform: translateY(20px); ) 37% ( transform: translateY(150px); ) 100% ( transform: translateY(150px); ) )
Ми хочемо, щоб цей фрагмент анімації виводився в «останні» приблизно 3 секунди. Цей цикл насправді працює всі 10 секунд, але власне видимі ефекти ви спостерігатимете протягом останніх 3 секунд.
Коли translateY (150 пікселів) застосований в ефекті, динозавр переміщається так далеко вниз поза полем блоку, що ви його не бачите.
Але протягом 37% часу цієї анімації (близько 3 секунд) ви бачите, що він повільно рухається вгору, а потім швидко забирається вниз.
Коли ми застосуємо цю анімацію, ми переконаємося, що:
- Динозавр спочатку прихований;
- Виведення цього фрагмента анімації затримується в часі, так що він починається відразу після того, як літери в слові логотипу закінчили свій танець (зробили змішання убік і повернулися на місце).
Trex (transform: translateY(150px); animation: popup 10s 6.5s ease infinite; )
Динозавр падає вниз саме в останню секунду так, щоб відразу після цього в блоці знову з'явилося слово «Швидкий» (інтервал відтворення анімації встановлений на infinite, щоб вона запускалася по колу знову і знову). Це приносить трохи веселої синергії.
6. Робимо блок клікабельним/інтерактивним оголошенням
Одною з корисних особливостей SVG є можливість масштабувати об'єкти до будь-якого розміру без втрати якості.
Для створення вбудованого блоку SVG із збереженням оригінальної якості зображень ми можемо використовувати техніку ol' padded box .
.wufoo-ad-wrap ( height: 0; padding-top: 100%; position: relative; ) .wufoo-ad ( position: absolute; top: 0; left: 0; width: 100%; height: 100%; )Ідея полягає в тому, що обгортка завжди буде набувати форми квадрата, відштовхуючись від значення його ширини. Потім ми задаємо абсолютні значенняпозиції SVG усередині цього ідеального квадрата, розміри якого підганяються, виходячи із ширини.
Оскільки це оголошення (яке, звичайно, має бути клікабельним), то як контейнер, що містить, замість
Підготував: Євген Рижков Дата публікації: 27.08.2010
Останнє оновлення: 17.11.2010
Завдання
Відобразити SVG-зображення на сторінці HTML.
Існує кілька способів це зробити, але не всі з них кроссбраузерні.
SVG через iframe
Наявність кадру для багатьох вже ставить хрест цим способом. Нині є досконаліші способи вирішення цього завдання. До того ж у такому вигляді не вдасться реалізувати прозорі зображення (фрейм має фон), а також немає доступу із зовнішніх скриптів до елементів малюнка.
SVG через об'єкт
Маємо: валідний чистий код, альтернативний текст, де можна забезпечити користувача інструкцією, що робити, якщо він не бачить картинки (наприклад, відправити на сайт нормального браузера або дати посилання на плагін, встановлення якого йому допоможе). Таке використання підтримує прозорість у SVG зображенні (щоправда в IE тут проблема: прозорі ділянки будуть залиті білим). З мінусів: немає можливості впливати на зображення зовнішніми скриптами (з HTML), тільки тими, що знаходяться в самому SVG-файлі.
Метод хороший для фонових зображень або будь-яких статичних картинок.
SVG через embed
Такий спосіб нібито дозволяє взаємодіяти скриптам в HTML із вмістом SVG-файлу (мені поки що такого досягти не вдалося). Для IE має атрибут wmode (
Цей спосіб зараз має велику популярність.
SVG у HTML коді
- слід звернути увагу на використовуваний простір імен: xmlns:svg="http://www.w3.org/2000/svg">;
- документ має бути саме у xhtml форматі (локально – це файл із розширенням.xhtml)
- з кросбраузерністю у цього методу погано. Особливо погана реакція IE;
- html код стає нереально брудним.
Нині цей метод краще не використовувати.
Нотатка
IE, включаючи версії 8, не підтримує SVG. Тоді Microsoft активно просував свій формат — VML. Тому з цим браузером доведеться повозитись, щоб побачити і там SVG-зображення (про це детальніше в наступних статтях).
Світле майбутнє
Мабуть, у найближчому майбутньому формат SVG грунтовно ввійде у життя веб-розробників. На підтвердження цього вже зараз можна зустріти опис цікавих способів впровадження SVG. За заявами розробників браузерів, нові версії їх творів будуть підтримувати частину або все з наведених нижче способів інтеграції SVG.
9 відповідей
Таким чином не можна змінити колір зображення. Якщо ви завантажите SVG як зображення, ви не зможете змінити спосіб його відображення за допомогою CSS або Javascript у браузері.
Якщо ви хочете змінити зображення SVG, ви повинні завантажити його за допомогою
Якщо ви хочете використовувати методи на сторінці, вам потрібна бібліотека Modernizr, де ви можете перевірити підтримку SVG та умовно відобразити або не використовувати запасне зображення. Потім ви можете вбудувати SVG і застосувати потрібні стилі.
#time-3-icon ( fill: green; ) .my-svg-alternate ( display: none; ) .no-svg .my-svg-alternate ( display: block; width: 100px; height: 100px; background-image : url(image.png);
Ви можете вбудувати SVG, позначити ваше резервне зображення ім'ям класу (my-svg-alternate):
А в CSS використовуйте клас no-svg від Modernizr (CDN: http://ajax.aspnetcdn.com/ajax/modernizr/modernizr-2.7.2.js), щоб перевірити підтримку SVG. Якщо підтримка SVG відсутня, блок SVG буде ігноруватися, і зображення буде відображатися, інакше зображення буде видалено з дерева DOM (display: none):
My-svg-alternate ( display: none; ) .no-svg .my-svg-alternate ( display: block; width: 100px; height: 100px; background-image: url(image.png); )
Потім ви можете змінити колір вашого вбудованого елемента:
#time-3-icon ( fill: green; )
Щоб змінити колір будь-якого SVG, можна безпосередньо змінити код svg , відкривши файл svgв будь-якому текстовому редакторі . Код може виглядати так:
Ви можете помітити, що є деякі теги XML, такі як шлях, коло, багатокутник і т.д.. Там ви можете додати свій власний колір за допомогою атрибуту style. Подивіться на наведений нижче приклад
Додайте атрибут стилю до всіх тегів, щоб ви могли отримати свій SVG потрібного кольору
Кроки, яким я слідую, щоб змінити будь-який колір SVG:
- Спочатку додайте зображення SVG за допомогою тегів img
- Використовуйте наступний щоб перетворити будь-який код кольори HEX для фільтрації:
Наприклад, висновок для # 00EE00:
Filter: invert(42%) sepia(93%) saturate(1352%) hue-rotate(87deg) brightness(119%) contrast(119%);
Найпростіший спосіб - створити шрифт із SVG, використовуючи службу, наприклад https://icomoon.io/app/#/select або таку. завантажте SVG, натисніть "згенерувати шрифт", увімкніть файли шрифтів та css у свій бік і просто використовуйте та створюйте його, як і будь-який інший текст. Я завжди використовую його так, бо він спрощує стилізацію.
РЕДАГУВАТИ:Як згадувалося в статті, прокоментованої символами @CodeMouse92, зіпсованими скріншотами (і, можливо, погано для SEO). Тож скоріше дотримуйтесь SVG.
Тільки SVG з інформацією про шлях. Ви не можете зробити це із зображенням... як шлях ви можете змінити штрих і заповнити інформацію, і все готове. як ілюстратор
Отже: з допомогою CSSви можете перезаписати значення fill шляху
Path ( fill: orange; )
але якщо ви хочете більш гнучкий спосіб, як ви хочете змінити його з текстом, коли є деякий ефект зависання.
Path ( fill: currentcolor; )
body ( background: #ddd; text-align: center; padding-top: 2em; ) .parent ( width: 320px; height: 50px; display: block; transition: all 0.3s; cursor: pointer; padding: 12px; box -sizing: border-box; ) /*** desired colors for children ***/ .parent( color: #000; background: #def; ) .parent:hover( color: #fff; background: #85c1fc; ) .parent span( font-size: 18px; margin-right: 8px; font-weight: bold; font-family: "Helvetica"; line-height: 26px; vertical-align: top; ) .parent svg( max-height : 26px; width: auto; display: inline; ) /**** magic trick *****/ .parent svg path( fill: currentcolor; )
Перед тим як почати розмову про анімацію SVG, давайте розберемося, що таке SVG.
S
calable
V
ector
G
raphics -
масштабована розмітка в
векторної графіки. Призначена для опису двовимірної векторної та змішаної векторно/растрової графіки формат XML. Дозволяє задати будь-яку фігуру компактним рядком, який описує шлях від початкової точки до кінцевої через будь-які проміжні координати.
Формат SVG має ряд переваг:
SVG - векторний формат, а це дозволяє масштабувати зображення без втрати якості.
Текст у графіку SVGне є зображенням, тому його можна виділяти та копіювати, він індексується пошуковими машинами.
SVG - відкритий стандарт, тобто користувач може змінити малюнок, змінивши зміст файлу SVG.
Сумісність із таблицями стилів (CSS), які використовуються для опису зовнішнього виглядусторінок сайтів.
Анімація реалізована у SVG за допомогою мови SMIL. Елементи можна керувати за допомогою JavaScript.
І кілька недоліків, куди ж без них:
-
Складність використання у великих картографічних програмах. Дрібні деталі описувати дуже трудомістко.
Чим більше зображення дрібних деталей, тим швидше зростає розмір SVG-даних.
Приклад коду SVG:
Виконання цього коду:
У цьому зображенні можна просто змінити параметри коду. Наприклад - картинка із зображенням займає 35.5 КБ, а код SVG - 426 байт.
І ось ми плавно підійшли до розмови про використання SVG-анімації (SMIL). SVG-графіку можна анімувати за допомогою кількох анімаційних елементів. Наприклад, з використанням таблиць стилів CSS.
То навіщо ж розробнику використовувати SMIL? Є деякі властивості SVG, які неможливо змінити та анімувати за допомогою CSS. Наприклад, атрибут d=””, де знаходиться набір даних, що визначають форму елемента. Неможливі анімації на CSS можна заповнити з допомогою JavaScript. Для цього є низка бібліотек. Це буде доцільно, якщо браузер (наприклад Opera Mini) не підтримує анімацію SMIL.
Цільовий об'єкт анімації задається за допомогою xlink:href.
Якщо атрибут xlink:href не заданий, цільовим елементом стає батьківський елемент:
Атрибут attributeName використовується для вказівки імені атрибута, який анімуватиметься. Наприклад, якщо необхідно анімувати положення центру фігури на осі Y, необхідно задати “сy” як значення атрибута attributeName.
Ось код, який дозволяє анімувати рух по осі Y синього кола з попереднього прикладу:
Протягом 5 секунд (dur="5s"), після натискання на синє коло (begin="click"), він рухатиметься по осі Y, починаючи з точки from="300" в точку to="100". Після виконання - анімація зупиниться у кінцевій точці (fill="freeze"). Щоб встановити нескінченне повторення анімації, достатньо додати атрибут repeatCount="indefinite".
Також можна задати початок виконання анімації після завантаження сторінки. Або ж підключити функцію після деякого часу після завантаження, додати анімацію елемента сторінки із затримкою після кліка тощо.
Насправді SVG-анімація дуже велика тема. Можна написати величезну статтю з прикладами коду та їх виконанням, проте деякі можливості залишаються недоступними. У тому числі – анімація тексту. Але це вже зовсім інша історія, досліджувати яку ми будемо у наступних статтях блогу.