W E B

Завантаження

Диски для звітності

Корисні контакти

  • Технології веб-розробки та дизайну

Створення SVG-зображення

Повернутися до лабораторної роботи #4.

Створимо простого стилізованого метелика, використовуючи базові SVG-фігури: еліпси та лінії.

1. Почнемо з базової симетричної форми – два крила та тіло.

  • <ellipse> - малює крила. Використовуємо два еліпси, дзеркально розміщені.
  • <rect> - тіло метелика, чорний прямокутник.
  • <path> - вигнуті лінії-усики.
  • opacity="0.6" - надає легкий ефект прозорості.

<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<!--Ліве крило-->
<ellipse cx="70" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />

<!-- Праве крило -->
<ellipse cx="130" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />

<!-- Тіло -->
<rect x="95" y="70" width="10" height="60" fill="black" rx="5" />

<!-- Вусики -->
<path d="M 100 70 Q 90 50 85 60" stroke="black" fill="none" />
<path d="M 100 70 Q 110 50 115 60" stroke="black" fill="none" />
</svg>

2. Додамо метелику візерунки на крила - це можна зробити, намалювавши додаткові форми (наприклад, кружечки або маленькі еліпси) поверх крил.

  • Додано три кола на кожному крилі різного кольору – це простий візерунок.
  • Візерунки є симетричними, щоб зберігати рівновагу.
  • Кольори можна змінювати під власний стиль.
						

<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<!--Ліве крило-->
<ellipse cx="70" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />

<!--Праве крило-->
<ellipse cx="130" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />

<!--ВІЗЕРУНКИ — Ліве крило -->
<circle cx="50" cy="80" r="8" fill="pink" />
<circle cx="60" cy="110" r="6" fill="white" />
<circle cx="80" cy="90" r="5" fill="yellow" />

<!--ВІЗЕРУНКИ — Праве крило -->
<circle cx="150" cy="80" r="8" fill="pink" />
<circle cx="140" cy="110" r="6" fill="white" />
<circle cx="120" cy="90" r="5" fill="yellow" />

<!--Тіло-->
<rect x="95" y="70" width="10" height="60" fill="black" rx="5" />

<!--Вусики-->
<path d="M 100 70 Q 90 50 85 60" stroke="black" fill="none" />
<path d="M 100 70 Q 110 50 115 60" stroke="black" fill="none" />
</svg>

3. Додамо анімацію руху крил, щоб метелик ними "махав". Для цього застосуємо анімацію SVG через тег <animateTransform>, щоб крила помалу рухалися, створюючи ефект помахів.

Як працює анімація

  • Використовується <animateTransform> всередині кожної групи крила.
  • Крила трохи обертаються ліворуч і праворуч навколо центру (100 100).
  • Анімація нескінченно повторюється з інтервалом 2s.

<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<!-- Ліва група крила і візерунків -->
<g transform-origin="100 100">
<g id="leftWing" transform="rotate(0 100 100)">
<ellipse cx="70" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="50" cy="80" r="8" fill="pink" />
<circle cx="60" cy="110" r="6" fill="white" />
<circle cx="80" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="-5 100 100; 5 100 100; -5 100 100"
dur="2s"
repeatCount="indefinite"/>
</g>
</g>

<!-- Права група крила і візерунків -->
<g transform-origin="100 100">
<g id="rightWing" transform="rotate(0 100 100)">
<ellipse cx="130" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="150" cy="80" r="8" fill="pink" />
<circle cx="140" cy="110" r="6" fill="white" />
<circle cx="120" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="5 100 100; -5 100 100; 5 100 100"
dur="2s"
repeatCount="indefinite"/>
</g>
</g>

<!-- Тіло -->
<rect x="95" y="70" width="10" height="60" fill="black" rx="5" />

<!--Вусики -->
<path d="M 100 70 Q 90 50 85 60" stroke="black" fill="none" />
<path d="M 100 70 Q 110 50 115 60" stroke="black" fill="none" />
</svg>

4. Додамо рух метелика по діагоналі екрану. Обернемо метелика в <g> (групу) і застосуємо до нього анімацію переміщення за допомогою <animateTransform> типу translate.

  • Весь <g> з метеликом тепер анімується: переміщається траєкторією 0 0 → 200 100 → 0 0. Це створює ефект польоту.
  • Можна змінити values, щоб метелик летів іншою траєкторією (наприклад, по колу або зигзагом).

<svg width="400" height="400" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
<!-- Група метелика -->
<g>
<!-- Анімація руху метелика -->
<animateTransform attributeName="transform"
attributeType="XML"
type="translate"
values="0 0; 200 100; 0 0"
dur="6s"
repeatCount="indefinite"/>
<!-- Ліва група крила та візерунків -->
<g transform-origin="100 100">
<g id="leftWing" transform="rotate(0 100 100)">
<ellipse cx="70" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="50" cy="80" r="8" fill="pink" />
<circle cx="60" cy="110" r="6" fill="white" />
<circle cx="80" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="-5 100 100; 5 100 100; -5 100 100"
dur="2s"
repeatCount="indefinite"/>
</g>
</g>
<!-- Права група крила та візерунків -->
<g transform-origin="100 100">
<g id="rightWing" transform="rotate(0 100 100)">
<ellipse cx="130" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="150" cy="80" r="8" fill="pink" />
<circle cx="140" cy="110" r="6" fill="white" />
<circle cx="120" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="5 100 100; -5 100 100; 5 100 100"
dur="2s"
repeatCount="indefinite"/>
</g>
</g>

<!-- Тіло -->
<rect x="95" y="70" width="10" height="60" fill="black" rx="5" />

<!-- Вусики -->
<path d="M 100 70 Q 90 50 85 60" stroke="black" fill="none" />
<path d="M 100 70 Q 110 50 115 60" stroke="black" fill="none" />
</g>
</svg>

5. Літаючий метелик по хвилі з крилами, що рухаються.

  • <path> малює невидиму хвилеподібну лінію, вздовж якої летить метелик .
  • <animateMotion> + <mpath> прив'язують метелика до цієї траєкторії.
  • Крила розгойдуються вгору-вниз за допомогою rotate анімації.
  • rotate = "auto" - метелик злегка повертається в бік руху, як справжній!

<svg width="500" height="300" viewBox="0 0 500 300" xmlns="http://www.w3.org/2000/svg">
<!-- Опис траекторії (хвиля) -->
<path id="flightPath" d="M 0 150 Q 100 50, 200 150 Q 300 250, 400 150 Q 500 50, 600 150" fill="none" stroke="none"/>

<!-- Рух метелика -->
<g>
<animateMotion dur="8s" repeatCount="indefinite" rotate="auto">
<mpath href="#flightPath" />
</animateMotion>
<!-- Лева група крила -->
<g transform-origin="100 100">
<g>
<ellipse cx="70" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="50" cy="80" r="8" fill="pink" />
<circle cx="60" cy="110" r="6" fill="white" />
<circle cx="80" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="-10 100 100; 10 100 100; -10 100 100"
dur="1s"
repeatCount="indefinite"/>
</g>
</g>
<!-- Права група крила -->
<g transform-origin="100 100">
<g>
<ellipse cx="130" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="150" cy="80" r="8" fill="pink" />
<circle cx="140" cy="110" r="6" fill="white" />
<circle cx="120" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="10 100 100; -10 100 100; 10 100 100"
dur="1s"
repeatCount="indefinite"/>
</g>
</g>
<!-- Тіло -->
<rect x="95" y="70" width="10" height="60" fill="black" rx="5" />

<!-- Вусикисики -->
<path d="M 100 70 Q 90 50 85 60" stroke="black" fill="none" />
<path d="M 100 70 Q 110 50 115 60" stroke="black" fill="none" />
</g>
</svg>

6. Метелик, що літає по хвилі, сідає на квітку. Небесний фон з хмарами

  • Небо та хмари — фон SVG.
  • Квітка в нижній правій частині, куди сідає метелик.
  • Траєкторія закінчується прямо на квітці.
  • fill="freeze" в animateMotion означає, що метелик наприкінці зупиняється.
  • end="7.5s" у анімації крил - вони перестають махати, коли метелик сів.

<svg width="600" height="400" viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg">
<!-- Небо -->
<rect width="100%" height="100%" fill="skyblue" />
<!-- Хмари -->
<g fill="white" opacity="0.8">
<ellipse cx="100" cy="60" rx="40" ry="20"/>
<ellipse cx="130" cy="60" rx="30" ry="20"/>
<ellipse cx="115" cy="50" rx="35" ry="15"/>

<ellipse cx="400" cy="80" rx="50" ry="25"/>
<ellipse cx="430" cy="80" rx="30" ry="20"/>
<ellipse cx="415" cy="70" rx="35" ry="15"/>
</g>
<!-- Квіти -->
<g>
<circle cx="500" cy="320" r="20" fill="pink"/>
<circle cx="485" cy="305" r="8" fill="yellow"/>
<circle cx="515" cy="305" r="8" fill="yellow"/>
<circle cx="485" cy="335" r="8" fill="yellow"/>
<circle cx="515" cy="335" r="8" fill="yellow"/>
<circle cx="500" cy="320" r="5" fill="orange"/>
<rect x="497" y="320" width="6" height="40" fill="green"/>
</g>
<!-- Траєкторія руху -->
<path id="flightPath" d="M 0 200 Q 150 100, 300 200 Q 450 300, 500 320" fill="none" stroke="none"/>
<!-- Метелик -->
<g>
<animateMotion dur="8s" fill="freeze" rotate="auto">
<mpath href="#flightPath"/>
</animateMotion>
<!-- Ліве крило -->
<g transform-origin="100 100">
<g>
<ellipse cx="70" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="50" cy="80" r="8" fill="pink" />
<circle cx="60" cy="110" r="6" fill="white" />
<circle cx="80" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="-10 100 100; 10 100 100; -10 100 100"
dur="1s"
repeatCount="indefinite"
begin="0s"
end="7.5s"/>
</g>
</g>
<!-- Праве крило -->
<g transform-origin="100 100">
<g>
<ellipse cx="130" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="150" cy="80" r="8" fill="pink" />
<circle cx="140" cy="110" r="6" fill="white" />
<circle cx="120" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="10 100 100; -10 100 100; 10 100 100"
dur="1s"
repeatCount="indefinite"
begin="0s"
end="7.5s"/>
</g>
</g>
<!-- Тіло -->
<rect x="95" y="70" width="10" height="60" fill="black" rx="5" />
<!-- Вусики -->
<path d="M 100 70 Q 90 50 85 60" stroke="black" fill="none" />
<path d="M 100 70 Q 110 50 115 60" stroke="black" fill="none" />
</g>
</svg>

7. Метелик злітає назад і на квітці відкриваються пелюстки

  • Метелик сідає на квітку, потім злітає назад хвилею.
  • Пелюстки квітки починають розкриватися після посадки.
  • Крила метелика при польоті машуть в обидві сторони.

<svg width="600" height="400" viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg">
<!-- Небо -->
<rect width="100%" height="100%" fill="skyblue" />
<!-- Хмари -->
<g fill="white" opacity="0.8">
<ellipse cx="100" cy="60" rx="40" ry="20"/>
<ellipse cx="130" cy="60" rx="30" ry="20"/>
<ellipse cx="115" cy="50" rx="35" ry="15"/>

<ellipse cx="400" cy="80" rx="50" ry="25"/>
<ellipse cx="430" cy="80" rx="30" ry="20"/>
<ellipse cx="415" cy="70" rx="35" ry="15"/>
</g>
<!-- Квіти -->
<g id="flower">
<circle cx="500" cy="320" r="20" fill="pink" />
<circle cx="485" cy="305" r="8" fill="yellow">
<animate attributeName="r" values="0;8;0" dur="1.5s" begin="8s" repeatCount="indefinite" />
</circle>
<circle cx="515" cy="305" r="8" fill="yellow">
<animate attributeName="r" values="0;8;0" dur="1.5s" begin="8.2s" repeatCount="indefinite" />
</circle>
<circle cx="485" cy="335" r="8" fill="yellow">
<animate attributeName="r" values="0;8;0" dur="1.5s" begin="8.4s" repeatCount="indefinite" />
</circle>
<circle cx="515" cy="335" r="8" fill="yellow">
<animate attributeName="r" values="0;8;0" dur="1.5s" begin="8.6s" repeatCount="indefinite" />
</circle>
<circle cx="500" cy="320" r="5" fill="orange" />
<rect x="497" y="320" width="6" height="40" fill="green" />
</g>
<!-- Траєкторії руху -->
<path id="path1" d="M 0 200 Q 150 100, 300 200 Q 450 300, 500 320" fill="none" stroke="none"/>
<path id="path2" d="M 500 320 Q 450 250, 300 200 Q 150 100, 0 200" fill="none" stroke="none"/>
<!-- Метелик -->
<g>
<animateMotion dur="8s" begin="0s" fill="freeze" rotate="auto">
<mpath href="#path1"/>
</animateMotion>
<animateMotion dur="8s" begin="10s" fill="freeze" rotate="auto">
<mpath href="#path2"/>
</animateMotion>
<!-- Ліве крило -->
<g transform-origin="100 100">
<g>
<ellipse cx="70" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="50" cy="80" r="8" fill="pink" />
<circle cx="60" cy="110" r="6" fill="white" />
<circle cx="80" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="-10 100 100; 10 100 100; -10 100 100"
dur="1s"
repeatCount="indefinite"
begin="0s;10s"
end="7.5s;17.5s"/>
</g>
</g>
<!-- Праве крило -->
<g transform-origin="100 100">
<g>
<ellipse cx="130" cy="100" rx="50" ry="70" fill="purple" opacity="0.6" />
<circle cx="150" cy="80" r="8" fill="pink" />
<circle cx="140" cy="110" r="6" fill="white" />
<circle cx="120" cy="90" r="5" fill="yellow" />
<animateTransform attributeName="transform"
attributeType="XML"
type="rotate"
values="10 100 100; -10 100 100; 10 100 100"
dur="1s"
repeatCount="indefinite"
begin="0s;10s"
end="7.5s;17.5s"/>
</g>
</g>
<!-- Тіло -->
<rect x="95" y="70" width="10" height="60" fill="black" rx="5" />
<!-- Вусики -->
<path d="M 100 70 Q 90 50 85 60" stroke="black" fill="none" />
<path d="M 100 70 Q 110 50 115 60" stroke="black" fill="none" />
</g>
</svg>

Повернутися до лабораторної роботи #4.