Border Animation Effect with SVG


Border Animation Effects with jQuery and CSS3 — Line.js

File Size: 7.9 KB
Views Total:
Last Update: 04/05/2014 03:47:53 UTC
Publish Date: 04/05/2014 04:06:24 UTC
Official Website: Go to website
License: MIT

Line.js is a jQuery plugin that makes it easy to implement subtle animation effects to your DIV’s border using CSS3 transitions. Simply add the appropriate class to any div with the position: relative; property to trigger the required effect.

Basic Usage:

1. Include the latest jQuery javascript library and jQuery line.js plugin’s javascript and CSS files into your Html file.

2. Add an animation class to your Div element. You can find more CSS effects in the line.css .

3. The DIV element must have a position value of relative.

4. Initialize the plugin and custom the animation.

5. Default settings.

This awesome jQuery plugin is developed by Tapjay. For more Advanced Usages, please check the demo page or visit the official website.

Анимация контуров SVG-фигур с примерами. Эффект “рисования” c помощью stroke-dasharray и stroke-dashoffset.

Скорее всего вы уже не раз видели эффект постепенного контурного рисования SVG-фигур. Такая анимация особенно популярна на лендингах c привязкой к прокрутке страниц. Сморится довольно эффектно. Давайте рассмотрим пример, чтобы понять, что я имею ввиду.

Такой эффект достигается при помощи установки нужного значения атрибута stroke-dasharray и плавного изменения атрибута stroke-dashoffset SVG-фигур.

Принцип хорошо описан в статьях:

Плагины для анимирования контуров SVG

На данный момент есть несколько удобных плагинов для создания подобных анимаций.

Все они работают по одному и тому же принципу и отличаются лишь набором опций и возможностей. Мне лично больше всех понравился Vivus. Демо, которое вы видели в начале статьи, сделано с помощью него.


Видео урок о том, как создать эффект рисования SVG без плагинов, можно найти здесь

Красивые примеры эффекта “рисования” c помощью stroke-dasharray и stroke-dashoffset

Могу с уверенностью сказать, что при правильной подготовке SVG можно добиваться интересных эффектов, которые оживят страницу и сделают её более динамичной. Главное – не переборщите ;)

Знаете красивые примеры с таким эффектом? Оставьте пожалуйста ссылку в комментариях ;)

Creating a Border Animation Effect with SVG and CSS

Today we’d like to explore a very subtle, but interesting border animation effect that can be seen on the creative website of Carl Philipe Brenner. When you hover over one of the white portfolio items in the grid, you will see a subtle animation happening: the grid item becomes transparent and the border lines of each side animate clockwise, creating a really nice effect. In this case, the effect is done by animating the widths or heights of several spans with some JS. We’ll try a different approach that uses SVG and CSS transitions.

Top 27 Examples of SVG Animations for Web Designers and Developers 2020

It’s a nice feature to have, to be able to have visual content on your website that looks equally the same on any device screen resolution. That’s what SVG does; it helps designers and artists to create visual web content that can scale infinitely without losing any imagery quality. An approach that is quickly being adapted to all new modern websites, though an approach that still requires more learning and practice. SVG is rising in popularity, but majority of designers today are still relying on traditional visual techniques. Is SVG too difficult, or is it just that the old ways are still working great? For some it is the latter, while others realize the immense benefits of using SVG for their projects.


Here are some of the most crucial benefits of SVG:

  • SVG’s are typically smaller in file sizes being in XML format, and will also compress better. This gives you more performance with increased quality.
  • Creating content for retina displays gets much easier, any size of the vector image is going to look just as sharp, so you don’t have to recreate content just for retina displays.
  • They aren’t limited to styling, in fact you can still style SVG using CSS, and also animate it; as we will learn throughout the numerous SVG animations following this introduction.
  • SVGs are now fully supported on all major web browsers, so in many ways the era of SVG has officially arrived, it’s just designers that need to start catching up more frequently and more consistently.
  • Increased website load times are just one of the side effects of SVG. Your image loads across all sizes using the same image, so you don’t have to use separate, larger, images for your visual design requirements. As it is, SVG doesn’t make any additional requests to the server, because it isn’t using direct HTTP requests, but instead all images come in-built within the source code of the website.
  • At first glance, SVG can seem too technical, but the reality is that plenty of libraries and photo editing applications allow you to focus on the visual appearance, and take care of the process of converting an image into a SVG format.

If you are a total newbie to SVG, then this tutorial and introduction guide to SVG from Sara is a pleasant place to begin your journey. She details even the most tiny details of the development process of getting a vector image onto your website, helping you to learn an invaluable skill that you will grow to cherish. We are excited for the future of SVG, and look forward to your feedback regarding the animations we have to show for you today, and perhaps you’re an author of an SVG animation yourself, if so — get in touch and we will have your work published here in no time.


Animated SVGs won’t necessarily be great in ALL situations where it’s necessary to animate a particular image. However, if you are looking to animate logo images, vector illustrations, user interface visuals, infographic content and icons, then you should definitely look deeper into the process of SVG animation and how it can help you, with the main area of usability being the fact that SVG images can scale at any screen resolution, whereas image formats such as GIF will only remain at the default set resolution, leading towards distorted image experiences when viewed from different devices and screen sizes.

Of course, other factors come into play as well, such as file size — keep your original image if the file size is smaller than that of a JPG or a PNG, but try and incorporate different resolution images through SVG where possible, to deliver a more pleasant visual experience. Sara Soueidan is an experienced front-end web developer with a degree in Computer Science. She takes her readers on a half-hour long journey of understanding why SVG is better than GIF in some cases, and in which cases to stick with GIF or other image formats.


We will be extending this roundup of SVG animations to also include libraries and frameworks, as well as articles that really detail how SVG animations work, with the promise that each outgoing resource will have at least one example for you to explore. Velocity, an animation framework that’s built on top of jQuery Animate function is a fast and robust library for doing color animations, visual transformations and loops, as well as scrolling effects for variety of content types. If you are looking for a smooth transition library that can combine CSS3 and jQuery in one place; this is the framework you will want to explore deeper, and as we were saying — Velocity has tens of samples for you to preview, just take your time to browse through the documentation.


SVG has so many ways to help developers create better web experiences. With the SVG.js library, you can extend that help to include live visual filters that you can wrap around your visual SVG files. These filters can have many of the most common filter and animation effects.

Three Ways to Animate SVG

Screencasts are a good way to connect with the author of the content, and understand what he is trying to convey on a deeper level, something that text might not be able to do. Chris Coyier, a well established CSS design expert, has put together a 15-minute long screencast back in late 2014. Said screencast explains three different methods for animating your SVG files. The methods are as follows: firstly you can use the @keyframes function to animate your visual SVG content using CSS, the second method is animating SVG directly with SMIL (there’s a tutorial in this post explaining more about SMIL, keep an eye for it), and the third method is to use JavaScript which provides core features for doing animations, of course there’s always the option to choose a JavaScript framework for this purpose, many of which you will find in this resource.

Animating an SVG Menu Icon with Segment

Segment is a neat little JS library that lets you draw and animate SVG path strokes. This tutorial from Luis Manuel goes way back several years. Although, this is still relevant in current times, and can be a great deal of help for newcomers to SVG and SVG animation. The tutorial will show you how to animate a simple Menu Icon using the Segment library to turn the icon from a traditional Hamburger into a Close button. All the effects are applied once the user hovers over the actual element. With this tutorial, it is possible to apply the same approach to other SVG files. There, you can extend on your newly learned approach with other tutorials. Indeed a detailed instruction tutorial that has both a demo page available, and all files for download.

Animated SVG Icons

Snap.svg is another popular JS library for developers who work directly with SVG. Although we would like to see the number of them increase, the opportunity to learn is always there. Mary Lou from Codrops has written an insightful article on how to create your own animated SVG icons, while throwing in a demo page of 24 unique SVG icons that all have animated capabilities. You can use these demos on your designs right away, or use them as a starting point to create something even more stellar, something more unique and likeable.

Creative SVG Letter Animations

Artistic features for web designs are all the new rage. People love to have a website that stands out from others by having features that are only now starting to appear at a larger scale, one of such features is animated letters in logos, headlines and content titles. Luis Manuel is using the Segment library to work with SVG path strokes to create stunning letter animations of any text imaginable. The article explains thoroughly how Segment achieves the animations, and how you can manipulate them to your own preference. This level of explanations helps even the most inexperienced to get started with these cool web development features, without the need to invest in learning a programming language.


As development progresses, developers have easier time creating libraries and frameworks that can do much of the work on behalf of the user. Thus, the user only needs to specify what he needs and to which file the need should be applied. Vivus.js is one such library that does ‘drawing animations’ over SVG files only through the process of you telling the library which file needs to be animated, and in what kind of way; you are entitled to a selection of animations to choose from, and all are equally easy to setup and process.

Цукерберг рекомендует:  Вакансии Международная сеть пиццерий Додо Пицца

SVG Loaders

SVG Loaders is a stunning library of SVG loader animations that are built exclusively using just SVG. We spoke of progress bars and loaders in jQuery a little while ago; it is definitely worth a visit. Once you open the demo page, or as can be seen in the snapshot, it’s hard to believe that such precise design detail can be achieved using nothing but SVG. But it’s true; you won’t find a single line of CSS or JavaScript in this library. That just further reinforces the fact that SVG is a great choice for modern web design development. A choice of 12 loaders that you can customize according to your needs.

CSS Animation for Beginners

Animations enliven the website, or the application they are being used on. It comes as no surprise that more and more modern designs are using animations. They are much better at capturing the attention of users. They can also be used to explain more in-detail what you are trying to provide. We wrote of CSS tutorials and resources in the past. The demand for such content has truly risen sky-high, and we are more than happy to give back to the community and those who lack the required skills to find the most trending content themselves. With that in mind, we also understand the importance of actually learning something to truly understand its purpose, and the way it works.

CSS Animations is one of those things that should first understand, in order to have better decision making skills when it comes to using actual animations in your designs. The example tutorial we have here from Rachel Cope is a great, easy to follow, guide into CSS animations and you can use the methods to achieve an animated effect on your visuals.

The State of SVG Animation

The best learning doesn’t always have to happen from a book. Concise articles and guides written by experienced developers can be just as helpful and more direct on pressing issues and possibilities of technologies such as SVG. Sara Soueidan shares her thoughts on Adobe’s blog about the current state of SVG animations and how to find the right approach that is going to work for you. We best recommend a cup of coffee to go with this guide; there are a ton of important points to digest and experiment with. Examples of SVG animations are provided in the post, through real-life code examples.

SVG Christmas

Want to really understand the limitations of SVG? You should inspect the source code of this wonderful CSS Christmas animation. The source code contains all the elements and code for producing the animation. You can also use those code samples to create something of your own. Other than that, a great example of animations in SVG, in all of their complexity.

SVG Animation and CSS Transforms: A Complicated Love Story

When developers talk about modern CSS features, they don’t just talk about the complex build up of each of the features, or how tough it can be to create a great result out of a new feature. Most of the time, developers are busy talking and ironing out problems about browsers, and how browsers react to new features, such as CSS transforms and SVG animations. Jack Doyle from GreenSock has guest-authored a content piece of CSS-Tricks, taking readers on a journey of SVG animations and CSS transform properties to give better understanding, and provide sufficient samples that you can begin building up on as you go.

An introduction to SVG animation

Jon McPartland’s guide to SVG animations dates all the way back to 2013. Nonetheless, it’s important for any new SVG experimenter to dive right into it, and get a glimpse of how SVG really works in the real-world, and what kind of measures should be taken when beginning to create animations of your own. The guide is divided in three different parts: discussing the markup, process of creating an animation, and building on top of what we already have access to within our workflow. It also includes a brief paragraph about actual real-world SVG limitations. If you liked the style of this piece, look into more Big Bite Creative content posts; there’s a ton more stuff on CSS and front-end development for free reading.

SVG animation with GreenSock

Allan Pope shares his thoughts on an already established platform: GreenSock Animation Platform (GSAP) and how it can be used to give your vector files a second chance through applied SVG animations. GSAP is packed with features that make most other engines look like cheap toys. Animate colors, beziers, CSS properties, arrays, scrolls and lots more. Round values, smoothly reverse on the fly, use relative values, automatically accommodate getter/setter functions, employ virtually any easing equation, and manage conflicting tweens like a pro. Define callbacks, tween in seconds or frames, build sequences effortlessly (even with overlapping tweens), repeat/yoyo and more. If you have heard of GSAP before and want a solid introduction on the platform, this piece from Allan is the best place to start. It has more insights that you can find in the comments section.

SVG Circus

SVG Circus is a web page that allows developers and designers to tap into ready-to-go SVG potential by creating loaders, spinners and other loop-oriented objects for the browser. It’s a great starting point to learn about SVG and how the animations can be modified, and also to export those animations directly into your projects. For example, you could create a loader and then use the output to learn about each of the features or ‘tricks’, as named by the website, to apply to your other projects and elements and/or animations.

A Guide to SVG Animations (SMIL)

We did say we would mention SMIL, and although some are saying that SMIL is decaying in usability, you will without question find websites and apps still using SMIL in production to provide SVG animation effects. This lengthy guest post for CSS-Tricks from Sara Soueidan goes really deep into the technicalities of SMIL, and the process of getting a production-ready SVG animation project finished. As far as we could tell, ALL of the examples in the post are still up to date and valid.

A Few Different Ways To Use SVG Sprites In Animation

Sprites are already popular in CSS3 field. Now, they are coming to SVG, or specifically SVG animations with the help of Sarah Drasner. She breaks down the process of using SVG sprites for doing complex animations with your SVG visual content. She also discusses three different techniques for achieving a desired result, with fully-functional examples available for modification and download.

Buffer’s loading animation

Donovan Hutchinson’s website CSS Animation is a work of art. Such a beautiful reflection of what the current modern design world has to offer. As for Buffer, it’s a very famous social media widget for sharing content across multiple networks at the same time, based on instant or schedule timeframes. The Buffer website has an interactive ‘loading’ animation of the Buffer logo that Donovan has taken upon himself to try and replicate. Of course, he does it with great success, giving little detail into the process of allowing us ourselves to animate our logos for our apps and web projects. It’s a quick read that touches on a subject such as SVG layers.

Diving deep into SVG animations

Optimizely is one of the leading customer experience optimization platforms in the world right now. These guys have managed to acquire customers from the Fortune 500 and way beyond that. And it comes as no surprise that the team behind Optimizely would want to give back to designers. They do this by sharing a deep dive into their mobile re-design process, and how they were able to use SVG to scale animations at large. The main technique used to achieve animations in this guide is CSS @keyframes, with some detailed descriptions as to why the choice was settled to be @keyframes, and nothing else.

Creating a Border Animation Effect with SVG and CSS

Border effects help bring some life into grids and photographs that we are sharing. We particularly like this demo of SVG animations for photographers and portfolio people who are really seeking a modern feel to their websites. But we aren’t sure how to achieve that modern look. Now it is possible, and Mary Lou beautifully explains how to achieve the same result for your own grid elements within your designs, through a demo page, an article, and ready-to-go downloads that you can start using today.

Premium SVG Animations

What a phenomenal roundup of the best and greatest SVG animation examples on the web today. Sure, there are plenty more available on sites like Codepen. But, such examples we wish for you to explore on your own. We tried to shift our focus towards a more detailed approach. This is to to ensure that you aren’t just viewing examples of great animations and their work process. But, you are also learning how to recreate each of the animations, and perhaps extend upon them. Now it’s time to lean over to the premium market, and enlist a couple of great SVG animations that will not be accompanied by tutorials and guides, by fully ready and fully optimized SVG files that you can start using in your projects. The variety of choices isn’t great, but perhaps you will find something that you could actually use in one of your projects.

Animated SVG clock

Don’t want to use a system clock to show time on your site? Then grab this animated SVG clock library that’s retina-ready, customizable in terms of color, size and template, built with HTML5 and CSS3 and will be a piece of cake to add to your projects. Perhaps use it for a project that has yet to be launched. And then, just extend the clock to show more details like the actual date of launch and then transform the clock into a countdown.

SVG Running and Jogging Loops

Sports app makers, get together; we got a kick-ass animation up for grabs. If you’re planning to create an app that counts runners’ steps, forget about hiring a designer to do all the tough animation work for you. Here’s an amazing running loop animation that comes in two different styles. You can modify the color and change the speed settings of the animation. Because it is SVG, it will natively scale to any screen resolution, without losing a single pixel. Written with pure JS. Works great on desktop, mobile and tablet devices.

Animated SVG Illustrations Pack

The SVG animation pack consists of four different animations. A flying boy powered by a jetpack on his back, airplane flying from one location to the other, a turtle, and a photographer. Take this pack and apply it to your project as necessary. You are in full control of the coloring and sizing of each of the illustration elements. The codebase is optimized for cleanliness, and will be a joy to manage.

Animated 3D Text Styles in SVG

3D text is a great way to achieve individuality in a design. Though when it comes to adding animated 3D text effects to your site, that’s taking it to the next level! The package includes ten different and unique styles to choose from. You can customize those in unlimited fashion as far as colors, text and fonts go.

Error Code 404 Animated SVG

HTTP Error 404 pages come into many different flavors. We learned this by reading up on one of our own authors posts back in January, where he listed 30 of the most creative Error 404 page designs that you can find on the web. To extend on that list, we have included this fantasticly fabolous SVG animation for 404 Error Pages! The animation was built using Snap.svg library.

16 Animated SEO Icons

SEO and SEM experts, we got something special for you this time around! It’s a pack of 16 icons that fall under the categories of both SEO and SEM. These graphics will scale infinitely for your projects. They also give you that crisp look and experience that your designs are craving. The icons are in the following categories: Website Optimization, Targeting, Smartphone SEO, Cloud Storage, Analytics
Awards, Networking, Social Media, Email Marketing, SEO/SEM, Pay Per Click, Code Optimization, Digital Marketing, Mission, Monitoring, Affiliate Marketing. We are sure that there’s something for everyone to enjoy.

Animated SVG Browser Icons

Finally, we are giving you an example of how you can use SVG to transform browser icons into animated experiences. Google Chrome, Safari, Internet Explorer, Mozilla Firefox and Opera are all part of this JavaScript SVG animation package. Please consult the demo page to learn more about the transitions that each browser icon uses.

What are you looking for in your SVG animations?

What an amazing roundup! We were stunned by some of these examples; they have proven once more, web design is growing, and it is growing rather quickly. From simple animated logos, to complex designs that we can see being integrated in gaming applications in the future. The future of SVG is shining bright, will you become a part of it?

Thank you for visiting Colorlib and reading this article! We highly appreciate it! Now you might want to learn how to make a website using our free WordPress themes.

Alex Ivanovs

Alex is a freelance writer with more than 10 years of experience in design, development, and small business. His work has been featured in publications like Entrepreneur, Huffington Post, TheNextWeb, and others. You can find his personal writing at The Divine Indigo.

Top 12 Free and Pa >

Programming has become one of the biggest and most innovating industries on the planet. Web…

Top 12 Free Invoice Tools for Small Businesses and Freelancers

Starting your own self-employed venture is going to require learning a little bit more about…

15 Best CSS Sl >

Day and night, developers spend time on their computer devices, trying to find new ways…

Руководство по анимации SVG (SMIL)

Графика SVG может быть анимирована с помощью элементов анимации. Эти элементы были первоначально определены в спецификации анимации SMIL ; к ним относятся:

В дополнение к элементам анимации, определенным в спецификации SMIL, SVG включает в себя расширения, совместимые со спецификацией SMIL -анимации; эти расширения включают атрибуты, которые расширяют функциональные возможности элемента и дополнительных элементов анимации.

Расширения SVG включают:

Мы поговорим об animateMotion в следующем разделе:

  • — используется в сочетании с элементом animateMotion для ссылки на траекторию движения, которая должна использоваться, как и траектория движения. Элемент mpath включается внутри элемента animateMotion , перед закрывающим тегом;
  • keypoints ( атрибут ) — используется в качестве атрибута для animateMotion , чтобы обеспечить точный контроль скорости перемещения анимированного элемента вдоль траектории;
  • rotate ( атрибут ) — используется в качестве атрибута для animateMotion , чтобы контролировать поворачивается ли объект автоматически таким образом, чтобы его точки х-оси поворачивались в том же ( или обратном ) направлении, что и направление касательного вектора пути движения. Этот атрибут является ключом к созданию движения вдоль пути, которое будет работать так, как вам нужно. Подробнее об этом в разделе animateMotion .

SVG анимация может быть похожа на анимацию и переходы CSS в силу своей природы. Создаются кифреймы, все движется, изменяются цвета и т.д. Тем не менее, она может сделать кое-что, чего CSS -анимация не может. Об этом я расскажу в этом руководстве.

Для чего используется SVG-анимация?

Для SVG можно задать стили и анимацию с помощью CSS ( слайдов ). В принципе, любая анимация преобразования или перехода, которая может быть применена к элементу HTML , также может применяться к элементу SVG . Но существуют некоторые свойства SVG , которые не могут быть анимированы через CSS , однако это можно сделать непосредственно через SVG .

Траектория SVG , например, определяется набором данных ( атрибут d=»» ), которые определяют форму этой траектории. Эти данные могут быть изменены и анимированы через SMIL , но не через CSS .

Все потому, что SVG элементы описаны с помощью набора атрибутов, известных как атрибуты представления SVG . Некоторые из этих атрибутов могут быть установлены, измены и анимированы с использованием CSS , а другие нет.

Таким образом, многие эффекты анимации на текущий момент просто не могут быть реализованы с помощью CSS . Этот пробел может быть восполнен либо с помощью JavaScript , либо с помощью декларативной SVG анимации, полученной из SMIL .

Если вы предпочитаете использовать JavaScript , я рекомендую вам snap.svg Дмитрия Барановского, который называют « jQuery для SVG «.

Или, если вы предпочитаете более изысканный подход к анимации, вы можете использовать элементы SVG , которые мы рассмотрим в этом руководстве!

Еще одно преимущество SMIL над JS -анимацией заключается в том, что JS не работает, когда SVG встроен в качестве img или используется в качестве background-image в CSS . SMIL -анимация работает в обоих случаях ( или ожидается, что вскоре будет поддерживаться браузерами ).

На мой взгляд, это существенное преимущество. Вы можете найти для себя и другие причины остановить свой выбор именно на SMIL . Эта статья представляет собой руководство, которое поможет вам начать работу со SMIL уже сегодня.

Поддержка браузеров и альтернативные варианты

SMIL довольно широко поддерживается браузерами. Он работает во всех браузерах за исключением Internet Explorer и Opera Mini . Чтобы получить исчерпывающую информацию относительно поддержки браузерами, вы можете ознакомиться с таблицей совместимости или «Могу ли использовать» .

Если вам нужно обеспечить запасной вариант для SMIL анимации, вы можете проверить наличие поддержки браузера с помощью Modernizr . Если SMIL не поддерживается, вы можете обеспечить своего рода альтернативный вариант ( JavaScript анимация, альтернативный подход и т.д .).

Независимо от того, какой из четырех элементов анимации вы выберете, вы должны указать целевую анимацию, определяемую этим элементом.

Чтобы указать цель, вы можете использовать атрибут xlink:href . Атрибут принимает URI -ссылку на элемент, который является объектом данной анимации, и который, следовательно, будет изменяться в течение определенного времени. Целевой элемент должен быть частью текущего фрагмента SVG документа:

Если до этого вы имели дело с элементами анимации SVG , они, вероятно, встречались вам как вложенные элементы внутри другого элемента, который они должны анимировать. Это предусматривается спецификацией.

Если использование атрибута xlink:href не предусмотрено, то целевым элементом будет родительский элемент первого следующего вверх уровня от текущего элемента анимации:

Таким образом, если вы захотите « инкапсулировать » анимацию в элемент, к которому она применяется, вы можете сделать именно это. А если вы хотите, чтобы элементы анимации хранились в другом месте документа, вы можете сделать это, при этом указав цель для каждого элемента анимации с помощью xlink:href — оба способа работают одинаково корректно.

Указание целевого свойства анимации с помощью attributeName и attributeType

Все элементы анимации также взаимодействуют еще с одним атрибутом: attributeName. attributeName используется для указания имени атрибута, который вы анимируете.

Например, если вы хотите задать анимацию для позиции центра по оси х, вы делаете это, указав cx в качестве значения атрибута attributeName .

attributeName принимает только одно значение, но не список значений, так как вы можете анимировать только один атрибут за один раз. Если вы хотите задать анимацию более чем для одного атрибута, необходимо определить более одного эффекта анимации для этого элемента.

Это то, что мне не совсем нравится, и, я думаю, что в этом CSS как раз имеет преимущество над SMIL . Но опять же, из-за значений, возможных для других атрибутов анимации ( об этом чуть далее ), имеет смысл определять только одно имя атрибута за раз, в противном случае, если определить еще несколько значений атрибутов, работать с ними станет слишком сложно.

При указании имени атрибута, вы можете добавить префикс XMLNS ( сокращение от пространство имен XML ) для обозначения пространства имен атрибута.

Пространство имен также можно задать с помощью атрибута attributeType . Например, некоторые атрибуты принадлежат пространству имен CSS (что означает, что атрибут может быть также найден как свойство CSS ), другие — только пространству имен XML .

Здесь приведена таблица, где перечислены эти атрибуты. В данной таблице описаны не все атрибуты SVG , только те из них, которые могут быть установлены с помощью CSS . Некоторые уже сегодня доступны в качестве свойств CSS .

Если значение для attributeType четко не установлено или установлено auto, браузер должен сначала произвести поиск по списку свойств CSS , и если ничего не найдено — поиск в пространстве имен XML элемента по умолчанию.

Например, следующий фрагмент задает анимацию для непрозрачности прямоугольника SVG . Поскольку атрибут opacity также доступен как свойство CSS , для attributeType установлено пространство имен CSS :

Мы рассмотрим другие атрибуты анимации в следующих примерах. Все атрибуты анимации являются общими для всех элементов анимации, если обратное не указано отдельно.

Давайте начнем с перемещения круга из одного места в другое. Мы собираемся сделать это, изменив значение его атрибута cx ( который определяет положение его центра по оси х ).

Для того чтобы произвести изменение значения от одной величины к другой в течение определенного периода времени, используются атрибуты from, to и dur . В дополнение к ним вы также можете указать, когда анимация должна запускаться — для этого используется атрибут begin :

В приведенном выше примере мы определили круг, а затем вызывали анимацию для этого круга. Центр круга перемещается из исходного положения с координатами 50 единиц в точку с координатами 450 единиц по оси х.

Для атрибута begin мы устанавливаем значение click . Это означает, что круг будет начинать перемещаться после нажатия курсора мыши. Вы можете установить для этого атрибута определенное время. Например, begin=»0s» будет запускать анимацию сразу после загрузки страницы.

Вы можете задержать старт анимации, установив положительное значение времени, например, begin=»2s» будет запускать анимацию через две секунды после нагрузки страницы.

Еще более интересно, что вы можете определить для атрибута begin такое значение, как click + 1s , которое будет запускать анимацию через одну секунду после клика мышью!

К тому же, вы можете использовать другие значения, которые позволяют синхронизировать анимацию без точного расчета продолжительности и задержки других анимаций. Подробнее об этом позже.

Атрибут dur аналогичен атрибуту CSS animation-duration .

Атрибуты from и to аналогичны кифреймам from и to блока анимации @keyframe CSS :

Атрибут fill ( который, к сожалению, назван так же, как другой атрибут fill, определяющий цвет заливки элемента ) похож на свойство animation-fill-mode , которое определяет, должен ли элемент возвращаться к исходному состоянию после завершения анимации.

Его значения в SVG аналогичны тем, которые используются в CSS , за исключением использования различных имен:

  • freeze: Значение, которое указывает заморозить состояние эффекта на том, которое было при последнем значении продолжительности анимации. Эффект анимации « замораживается » до тех пор, пока документ не будет закрыт ( или пока анимация не будет перезапущена );
  • remove: Эффект анимации удаляется ( больше не применяется ), по завершению действия анимации, заданного продолжительностью. После завершения анимации она больше не применяется к целевому элементу ( если только анимация не будет перезапущена ).

Попробуйте изменить значения в этой демо-версии, чтобы увидеть, как это повлияет на анимацию:

Атрибут by используется, чтобы указать относительное смещение для анимации. Как следует из названия, вы можете использовать его, чтобы указать значение, которое будет задавать изменение анимации.

Данный эффект заметен, в основном только когда вы изменяете продолжительность анимации от одного цикла к другому, подобно тому, как работает функция CSS steps().

В SVG эквивалентом функции CSS steps() является calcMode=»discrete» . Мы доберемся до атрибута calcMode=»discrete» чуть позже.

Перезапуск анимации с помощью restart

Вам может понадобиться заблокировать перезапуск анимации, пока она активна. Для этого в SVG предусмотрен атрибут restart.

Вы можете установить для него одно из трех возможных значений:

  • always: Анимация может быть перезапущена в любой момент. Это значение по умолчанию;
  • whenNotActive: анимация может быть перезапущена, только когда она неактивна ( то есть по завершении периода продолжительности анимации ). Попытки перезапустить анимацию во время действия анимации игнорируются;
  • never: Элемент не может быть перезапущен, пока не перезагружен его родительский контейнер. ( В случае с SVG, так как родительским контейнером является SVG -фрагмент документа, то анимация не может быть перезапущена, пока не перезагружен документ ).

Имена анимации и их синхронизации

Предположим, мы хотим задать анимацию для положения и цвета круга, таким образом, чтобы изменение цвета происходило в конце анимации перемещения. Мы можем сделать это, установив значение begin для анимации изменения цвета равным длительности анимации перемещения; так мы, как правило, делаем в CSS .

Однако SMIL имеет отличную функцию обработки событий. Я уже упоминала, что атрибут begin принимает такие значения, как click + 5s . Это значение называется « значением события «, и в данном случае оно состоит из события, за которым следует « значение часов «.

Самая интересная здесь вторая часть — « значение часов «. Почему оно не называется просто « значение времени «? Ответ заключается в том, что вы можете использовать это значение буквально, как часы : вы можете установить « 10min » или « 01:33 «, что будет эквивалентно « 1 минуте и 33 секундам «, или даже « 02:30:03 » ( 2 часа, 30 минут и 3 секунды ). На момент написания этой статьи, значения часов не полностью реализованы в большинстве браузеров.

Так что, если бы в предыдущей демонстрации мы использовали click + 01:30 , то в случае реализованной поддержки браузером, анимация бы запустилась через 1 минуту и 30 секунд после клика мыши.

Еще один вид значения, которое может принимать этот атрибут — это ID другой анимации, за которым следует обозначение события. Если у вас есть два ( или более ) эффекта анимации ( независимо то того, применяются ли они к одному элементу или нет! ), и вы хотите синхронизировать их таким образом, чтобы один из них начинался в зависимости от стадии исполнения другого, вы можете сделать это, даже не зная продолжительность другой анимации.

Например, в следующем примере, синий прямоугольник начинает движение через 1 секунду после начала анимации круга. Это делается путем предоставления каждому элементу анимации ID , а затем использования этого ID с событием begin , как это показано в следующем коде:

begin=»circ-anim.begin + 1s» указывает браузеру начать анимацию прямоугольника через 1 секунду после начала анимации круга.

Вы можете увидеть все это в этой демонстрации:


Вы также можете запустить анимацию прямоугольника по завершении анимации круга, используя событие end :

Вы можете даже запустить ее до завершения анимации круга:

Повторяющаяся анимация с помощью repeatCount

Если вы хотите запустить анимацию более чем один раз, вы можете сделать это с помощью атрибута repeatCount . Вы можете указать, сколько раз вы хотите ее повторить или использовать ключевое слово indefinite , чтобы повторять анимацию бесконечно.

Таким образом, если мы хотим повторить анимации круга два раза, код должен выглядеть следующим образом:

Вы можете увидеть это в демонстрации. Я установила количество повторений для круга — 2 и для квадрата indefinite .

Обратите внимание, что анимация рестартует с первоначального значения from , а не со значения, которого она достигла по завершении цикла. К сожалению, SMIL не позволяет нам задать путь туда и обратно между начальным и конечным значениями, как мы можем сделать это с помощью CSS анимации.

В CSS свойство animation-direction определяет, должна ли анимация проигрываться в обратном направлении или каждый цикл стартует с нулевой точки.

Значение animation-direction: alternate означает, что четные циклы анимации проигрываются в обычном направлении, а нечетные воспроизводятся в обратном направлении. Это означает, что первый цикл будет проигрываться от начала до конца, а второй — с конца обратно к началу, третий цикл снова будет проигрываться от начала к концу и так далее.

Чтобы сделать это в SMIL , вам придется использовать JavaScript , чтобы изменять значения атрибутов from и to . Джон МакПартленд из Big Bite Creative некоторое время назад опубликовал статью , в которой описал, как он сделал это для анимации иконок меню, над которой он работал.

Вот отличная, простая анимация, повторяющаяся бесконечное количество раз, с использованием задержки, созданная Майлзом Иламом :

Ограничение времени повторения анимации с помощью repeatDur

Бесконечное выполнение анимации может раздражать или портить дизайн страницы, если это продолжается в течение длительного времени.

Поэтому вам может оказаться весьма кстати иметь возможность ограничить повторение анимации определенным периодом времени, и остановить повторение анимации через некоторое время после загрузки документа — это называется время презентации.

Время презентации указывает положение на шкале времени данного фрагмента документа, связанной с моментом начала всего документа. Оно задается с помощью атрибута repeatDur .

Его синтаксис похож на значение часов, но вместо того, чтобы отсчитывается от других событий анимации или событий взаимодействия, в данном случае время отсчитывается от начала ( загрузки ) документа.

Например, следующий фрагмент остановит повторение анимации через 1 минуту и 30 секунд после начала ( загрузки ) документа:

А это демо, иллюстрирующее данный атрибут:

Синхронизация анимации в зависимости количества повторений

Теперь давайте вернемся обратно к синхронизации между двумя анимациями. В самом деле, в SMIL можно синхронизировать анимации таким образом, чтобы одна анимация запускалась в зависимости от того, сколько раз была повторена другая.

Например, вы можете начать анимацию после n-го повторения другой, плюс или минус определенное количество времени, которое вы также можете задать.

В следующем примере анимация прямоугольника запускается на втором повторении анимации круга:

Синхронизация в зависимости от количества повторений в настоящее время реализована не во всех браузерах, поэтому, для этого раздела, к сожалению, демо-версия не приводится.

Управление значениями кифреймов анимации: keyTimes и values

В CSS мы можем указать значения, которые должно принимать анимируемое свойство в определенном кифрейме во время проигрывания анимации.

Например, если вы задаете анимацию для смещения элемента слева, вместо указания изменения смещения непосредственно от 0 до 300, вы можете анимировать его так, что смещение принимает определенные значения в определенном фрейме следующим образом:

0%, 20%, 80% и 100% — это фреймы анимации, а значения в блоке каждого фрейма являются значениями для каждого из них. Описанный выше эффект является одним из элементов анимации подпрыгивающего мячика.

В SMIL вы можете управлять значениями для кифреймов аналогичным образом, но сам синтаксис совершенно другой.

Чтобы указать кифреймы, используется атрибут keyTimes . И, чтобы указать значение свойства анимации для каждого фрейма, используются атрибуты values . Соглашение об именах в SMIL довольно удобное.

Если вернуться к нашему перемещающемуся кругу и использовать значения, аналогичные описанным выше кифреймам CSS , то код будет выглядеть следующим образом:

Что мы сделали?

Первое, что нужно отметить — время и промежуточные значения кифреймов задаются в виде списков. Атрибут keyTimes — разделенный точками с запятой список значений времени, используемый для управления этапами анимации. Каждое время в списке соответствует значению в списке атрибутов values , и определяет, когда это значение используется в функции анимации.

Каждое значение времени в списке keyTimes задается как десятичное число от 0 до 1 ( включительно ), представляющее собой пропорциональный сдвиг по времени в проигрывании элемента анимации. Таким образом, keyTimes работает так же, как его аналоги в CSS , за исключением того, что мы определяем его в виде десятичной дроби, а не в процентах.

Ниже приведена демонстрация для данного кода. Нажмите на круг, чтобы запустить анимацию.

Следует отметить, что, если используется список значений, то анимация будет применяться в соответствии с указанными в нем значениями. В этом случае все атрибуты from, to и by будут игнорироваться.

Управление темпом анимации с помощью пользовательских корректив: calcMode и keySplines

Сейчас я снова прибегну к сравнению CSS и SMIL , потому что синтаксис и концепцию SMIL вам будет гораздо проще понять, если вы уже знакомы с анимацией CSS .

В CSS вы можете изменить равномерное проигрывание анимации по умолчанию и указать пользовательскую функцию корректировки, которая будет управлять анимацией с помощью свойства animation-timing-function.

Функция тайминга может определяться одним из нескольких предопределенных ключевых слов или функций cubic b;zier . Последняя может быть создана при помощи инструментов, наподобие этого, разработанного Леей Веру .

В SMIL темп анимации задается с помощью атрибута calcMode . По умолчанию его значение для всех элементов анимации — linear , кроме animateMotion ( мы вернемся к нему позже ). Кроме значения linear , вы можете установить также значения: discrete, paced или spline .

  • discrete указывает, что функция анимации переходит от одного значения к другому без интерполяции. Это похоже на функцию CSS steps() ;
  • paced похоже на значение linear , кроме того, что при этом игнорируются любые промежуточные значения, и изменение времени выполнения анимации определяется в keyTimes ;
  • spline производит интерполяцию от одного значения в списке значений к другому в соответствии с функцией времени, определяемой кубическим сплайном Безьера. Точки сплайна определяются в атрибуте keyTimes , а точки перехода для каждого интервала определяются в атрибуте keySplines .

Вы, наверное, заметили, что я упомянула новый атрибут: keySplines . Что же делает атрибут keySplines ?

Опять же это аналогично CSS .

В CSS вы можете указать темп анимации внутри каждого кифрейма, вместо указания одного темпа анимации для всей анимации. Это дает вам больше контроля над тем, как протекает каждый кифрейм анимации. Примером использования этой функции является создание эффекта прыгающего мячика. Кифреймы для него могут выглядеть следующим образом:

Вместо функции корректировки мы можем использовать соответствующие функции cubic-bezier :

  • ease-in = cubic-bezier(0.47, 0, 0.745, 0.715);
  • ease-out = cubic-bezier(0.39, 0.575, 0.565, 1)

Давайте начнем с определения ключевых интервалов времени и списка значений для нашего оранжевого круга, чтобы создать тот же эффект подпрыгивающего мячика:

Анимация будет запускаться после нажатия мышью на элемент, и замораживаться, как только он достигнет конечного значения. Далее, для того, чтобы задать темп каждого ключевого кадра, мы добавим атрибут keySplines .

Атрибут keySplines принимает набор контрольных точек b;zier , связанных со списком keyTimes , определяющим кубическую функцию Безье, которая управляет интервалами с разным темпом. Значение атрибута представляет собой разделенный точками с запятой список описаний контрольных точек.

Каждое описание контрольной точки представляет собой набор из четырех значений: x1 y1 x2 y2, описывающий координаты контрольных точек b;zier для одного сегмента времени. Их значение должно находиться в диапазоне от 0 до 1, и для calcMode должно быть установлено значение spline , иначе атрибут игнорируется.

Вместо использования в качестве значений функции cubic-bezier, keySplines принимает координаты двух контрольных точек, которые используются для построения кривой. Данные контрольные точки вы можете видеть на приведенном ниже скриншоте, взятом из инструмента Леи.

На скриншоте также показаны координаты каждой точки, каждое значение координат имеет тот же цвет, что и точка, которую они описывают. Что касается атрибута keySplines , то именно эти значения мы будем использовать, чтобы определить темп для каждого кифрейма анимации.

В SMIL эти значения можно разделять либо запятыми с дополнительным пробелом, либо просто пробелами. Значения keyTimes , которые определяют соответствующий сегмент, являются « опорными точками » b;zier , а значения keySplines являются контрольными точками. Таким образом, контрольных точек должно быть задано на одну меньше, чем keyTimes :

Если мы вернемся к примеру подпрыгивающего мячика, координаты контрольной точки для функций ease-in и ease-out показаны на следующих изображениях:

Таким образом, переведя все это в элемент анимации SVG , мы получим следующий код:

Цукерберг рекомендует:  Работа с Google Documents List Извлечение документов

Ниже приводится демо-версия, но убедитесь, что вы запустили ее в Firefox , а не в Chrome , потому что в его последней версии найден а ошибка, из-за которой демо-версия не будет работать корректно:

Если вы хотите указать только общую функцию корректировки скорости для всей анимации, без промежуточных значений, вы все равно должны указать кифреймы, используя атрибут keyTimes , однако вам будет достаточно задать только начальный и конечный кифреймы, а именно 0; 1 — без промежуточных values .

Добавляемые и накапливающие анимации: additive и accumulate

Иногда нам нужно определить анимацию, которая начинается там, где закончилась предыдущая анимация; или анимацию, которая использует накопительную сумму предыдущих анимаций в качестве значения для начала воспроизведения. Для этого в SVG существуют два атрибута, называющиеся соответствующим образом: additive и accumulate .

Предположим, у вас есть элемент, ширину которого вы хотите « нарастить «, или линия, для которой вы хотите увеличить длину. Или, предположим, у вас есть элемент, который вы хотите перемещать шаг за шагом, через определенные интервалы. Эта функция особенно полезна для повторяющейся анимации.

Как и для любой другой анимации, вам нужно указать значения from и to . В то же время, когда вы устанавливаете для атрибута additive значение sum, каждое из этих значений будет связано с первоначальным значением анимируемого атрибута.

Итак, вернемся к нашему кругу. Для него начальное положение cx равно 50 . Если вы устанавливаете значения from=»0″ to=»100″ , то ноль фактически означает начальное значение 50, а 100 — начальное значение 50+100. То есть на практике получается, что вы устанавливаете «from=»50″ to=»150» .

Сделав это, мы получим следующий результат:

Это все, что делает атрибут additive . Он просто определяет, будут ли значения from и to связаны с текущим значением атрибута или нет. Атрибут принимает одно из двух значений: sum и replace .

Последнее значение присваивается по умолчанию, и это, как правило, означает, что заданные значения from и to заменяют текущие / исходные значения, что в конечном итоге может привести к резкой смене позиции анимируемого элемента в начале анимации.

( Попробуйте в приведенном выше примере заменить sum на replace , и вы увидите, что получится ).

Однако, что если мы хотим, чтобы значения добавлялись таким образом, чтобы второй цикл анимации начинался там, где закончился первый? В этом нам поможет атрибут accumulate .

Атрибут accumulate контролирует, учитывается ли предыдущее конечное значение атрибута. По умолчанию его значение none , это означает, что, когда анимация повторяется, то это происходит с самого начала, не учитывая окончания предыдущей итерации.

Однако вы можете установить его на sum . Это будет означать, что каждый новый цикл анимации связан с тем, где завершился предыдущий цикл.

Таким образом, если мы вернемся к предыдущей анимации и укажем accumulate=»sum» , мы получим следующий результат:

Имейте в виду, что атрибут accumulate игнорируется, если значение целевого атрибута не поддерживает добавление, или если элемент анимации не повторяется. Он также будет игнорироваться, если функция анимации задается только с одним атрибутом to .

Указание окончания анимации с помощью end

Кроме определения того, когда анимация должна начинаться, можно также указать, когда она должна заканчиваться через атрибут end . Например, вы можете установить, чтобы анимация повторялась бесконечно, а затем остановить ее, когда начинается анимация другого элемента.

Атрибут end принимает значения, аналогичные тем, которые имеет атрибут begin . Вы можете указывать абсолютные или относительные значения времени / интервалы, значения повторений, значения событий и т.д.

Например, в следующей демонстрации оранжевый кружок медленно перемещается в течение 30 секунд на другую сторону холста. Зеленый круг также анимирован, но анимация запускается только тогда, когда вы нажмете на него.

Анимация оранжевого круга закончится, когда начнется анимация зеленого круга — таким образом, когда вы нажмете на зеленый круг, оранжевый круг остановится.

Конечно, такую же синхронизацию анимации можно осуществить для двух анимаций, применяемых к одному элементу. Например, предположим, что мы устанавливаем анимацию цвета круга, при которой цвет бесконечно меняется от одного значения к другому.

А потом анимацию, задающую перемещение круга при нажатии на него курсором мыши. Сейчас мы установим, чтобы изменение цвета прекращалось после того, как мы кликаем мышью на элемент, и он начинает двигаться.

Определение интервалов анимации с использованием нескольких значений begin и end

В самом деле, оба атрибута и begin , и end принимают разделенный запятыми список значений. Каждое значение в атрибуте begin будет иметь соответствующее значение в атрибуте end , что образует активные и не активные интервалы анимации.

Это можно представить, как движущийся автомобиль, у которого колеса то активны, то не активны какое-то время, в зависимости от того, движется ли автомобиль или стоит на месте.

Вы даже можете создать анимацию движущегося автомобиля, применив соответствующие эффекты: один для перемещения автомобиля или движения его вдоль пути, который использует добавляемую и накапливаемую анимацию; второй — для вращения колес в интервалах, которые будут синхронизированы с перемещением.

Примером установки нескольких значений времени начала и конца анимации ( т.е. интервалов ) является следующая демонстрация, где прямоугольник поворачивается, исходя из определенных интервалов, переходя от активного состояния в не активное.
( Перезапустите демонстрацию, если вы пропустили анимацию ).

Также отмечу, что, даже если вы установите для repeatCount значение indefinite , оно будет перекрыто значениями end , и анимация не будет повторяться бесконечно.

Ограничение продолжительности действия элемента с помощью min и max

Так же, как вы можете ограничить количество или время повторений анимации, вы можете ограничить и продолжительность действия анимации.

Атрибуты min и max указывают минимальное и максимальное значение продолжительности анимации соответственно. Они дают нам возможность регулировать нижний и верхний предел продолжительности действия элемента. Оба атрибута принимают значения часов.

min указывает величину минимального значения продолжительности действия анимации, замеряемую по времени действия элемента. Значение этого атрибута должно быть больше или равно 0 ( значение по умолчанию, при котором продолжительность действия вообще не ограничивается ).

В max значение часов указывает величину максимального значения продолжительности действия, измеряемую по времени действия элемента. Его значение также должно быть больше 0. Значение по умолчанию для max — indefinite . Оно не ограничивает продолжительность действия вообще.

Если указаны оба атрибута, то значение max должно быть больше или равно значению min . Если это требование не выполняется, то оба атрибута игнорируются.

Но что же определяет продолжительность действия элемента? Мы упомянули ранее, что существует продолжительность повторений анимации, это кроме « простой продолжительности «, которая является продолжительностью анимации без повторения ( указывается с помощью dur ).

Так как все это работает вместе? Что является более приоритетным? И как насчет атрибута end , он переназначает значения или просто заканчивает анимацию?

Все это работает следующим образом. Браузер сначала вычисляет продолжительность действия на основе значений dur, repeatCount, repeatDur и end . После этого запускается вычисление продолжительности согласно указаниям значений min и max .

Если результат первого этапа вычислений находится в пределах интервала, вычисляемого во время второго этапа, то продолжительность, рассчитанная первой, остается в силе и не изменяется. В противном случае возможны два сценария:

  • Если вычисленная первой продолжительность больше, чем значение max, продолжительность действия элемента определяется равной значению max ;
  • Если вычисленная первой продолжительность меньше, чем значение min , продолжительность действия элемента будет равна значению min и поведение элемента заключается в следующем;
  • Если продолжительность повторений ( или простая продолжительность, если элемент не повторяется ) элемента больше, чем min , то элемент проигрывается стандартное время ( включающее min ) продолжительности действия;
  • В противном случае элемент проигрывается стандартное время продолжительности повторений ( или простой продолжительности, если элемент не повторяется ), а затем замораживается и не выводится вовсе, в зависимости от значения атрибута fill .

Это подводит нас к вопросу о том, как браузер фактически вычисляет продолжительность действия. Для краткости я не буду вдаваться в подробности.

Но спецификация содержит очень подробную таблицу, в которой приведены различные комбинации атрибутов dur , repeatCount, repeatDur и end и то, как будет определяться продолжительность действия анимации, исходя из каждой комбинации.

Вы можете ознакомиться с этой таблицей и получить дополнительную информацию из этого раздела спецификации .

Наконец, если для элемента определен запуск до начала родительского элемента ( например, просто с помощью отрицательного значения смещения ), минимальная продолжительность будет определяться рассчитанным на первом этапе значением, и не будет входить в интервал действия родительского элемента.

Это означает, что значение min не будет иметь заметного влияния на протекание анимации элемента.

Пример : трансформация контуров

Одним из атрибутов, которые могут быть анимированными через SMIL ( но для которых нельзя задать анимацию через CSS ), является атрибут из

SVG — d ( сокращенно от «data» — данные ).

Атрибут d содержит данные, которые определяют контуры формы или фигуры, которую вы создаете. Эти данные контура состоят из набора команд и координат, которые указывают браузеру, где и как рисовать точки, дуги и линии, которые составляют окончательный контур.

Анимируя этот атрибут, мы можем трансформировать контуры SVG и создавать эффекты метаморфоз фигур .

Но, для того, чтобы иметь возможность трансформироваться фигуры, начальная, конечная и все промежуточные фигуры должны иметь одинаковое количество вершин / точек, и они должны появляться в том же порядке. Если количество вершин разных фигур не совпадает, анимация не будет работать.

Причиной этого является то, что трансформация фигур производится на самом деле через перемещение вершин и интерполяцию их позиций. Так что если одна вершина отсутствует или не соответствует общему порядку вывода, контур не может быть интерполирован.

Чтобы анимировать контур SVG , нам нужно указать для атрибута attributeName значение d , а затем установить значения from и to , которые определяют начальную и конечную фигуры. Вы также можете использовать атрибут values , чтобы определить любые промежуточные значения, которые должен принимать контур при трансформации.

Для краткости, я не буду вдаваться в подробности относительно того, как это сделать. Вместо этого, вы можете прочитать эту прекрасную статью Ноа Блона , в которой он объясняет, как он создал трансформирующуюся фигуру, использую . Вот демонстрация созданной Ноа анимации:

Border Animation Effect with SVG

Easily manage projects with

The following is a guest post by Sara Soueidan. Sara has a knack for digging deep into web features and explaining the heck out of them for the rest of us. Here she digs into SMIL (and friends), and animation syntax built right into SVG, and gives us this epic guide.


SVG graphics can be animated using animation elements. The animation elements were initially defined in the SMIL Animation specification; these elements include:

In addition to the animation elements defined in the SMIL spec, SVG includes extensions compatible with the SMIL animations spec; these extensions include attributes that extend the functionality of the element and additional animation elements. The SVG extensions include:

SVG animations can be similar to CSS animations and transitions via by their nature. Keyframes are created, things move, colors change, etc. However, they can do somethings that CSS animations can’t do, which we’ll cover.

Why Use SVG Animations?

SVGs can be styled and animated with CSS (slides). Basically, any transformation or transition animation that can be applied to an HTML element can also be applied to an SVG element. But there are some SVG properties that cannot be animated through CSS that can through SVG. An SVG path, for example, comes with a set of data (a d=»» attribute) that defines that path’s shape. This data can be modified and animated through SMIL, but not CSS. This is because SVG elements are described by a set of attributes known as SVG presentation attributes. Some of these attributes can be set, modified, and animated using CSS, and others can’t.

So, many animations and effects can simply not be achieved using CSS at this time. The CSS SVG animation gaps can be filled by using either JavaScript or the declarative SVG animations derived from SMIL.

If you prefer using JavaScript, I recommend using snap.svg by Dmitry Baranovsky, which is described as being «the jQuery of SVG». Here’s a collection of examples of that.

Or if you prefer a more declarative animation approach, you can use the SVG animation elements as we’ll cover in this guide!

Another advantage to SMIL over JS animations is that JS animations don’t work when the SVG is embedded as an img or used as a background-image in CSS. SMIL animations do work in both cases (or should, browser support pending). That’s a big advantage, in my opinion. You may find yourself choosing SMIL over other options because of that. This article is a guide to help you get started using SMIL today.

Browser Support and Fallbacks

Browser support for SMIL animations is pretty decent. They work in all browsers except in Internet Explorer and Opera Mini. For a thorough overview of browser support, you can refer to the compatibility table on Can I Use.

If you need to provide a fallback for SMIL animations, you can test for browser support on-the-fly using Modernizr. If SMIL is not supported, you can then provide some kind of fallback (JavaScript animations, an alternate experience, etc).

Specifying the target of the animation with xlink:href

No matter which of the four animation elements you choose, you need to specify the target of the animation defined by that element.

In order to specify a target, you can use the xlink:href attribute. The attribute takes a URI reference to the element which is the target of this animation and which therefore will be modified over time. The target element must be part of the current SVG document fragment.

If you’ve come across SVG animation elements before, you’ve probably seen them nested inside the element that they’re supposed to animate. This is possible as well as per the spec:

If the xlink:href attribute is not provided, then the target element will be the immediate parent element of the current animation element.

So if you want to «encapsulate» the animation into the element it applies to, you can do that. And if you want to keep the animations separate somewhere else in the document, you can do that too, and specify the target of each animation using xlink:href . Both ways work just fine.

Specifying the target property of the animation with attributeName and attributeType

All animation elements also share another attribute: attributeName . The attributeName attribute is used to specify the name of the attribute that you’re animating.

For example, if you want to animate the position of the center of a on the x-axis, you do that by specifying cx as the value for the attributeName attribute.

attributeName takes only one value, not a list of values, so, you can only animate one attribute at a time. If you want to animate more than one attribute, you need to define more than one animation for the element. This is something that I wish were different, and that I think CSS has an advantage over SMIL for. But then again, because of the values possible for other animation attributes (which we’ll cover next), it only makes sense to define only one attribute name at a time, otherwise the other attribute values can become too complex to work with.

When you specify the attribute name, you can add an XMLNS (short for XML namespace) prefix to indicate the namespace of the attribute. The namespace can also be specified using the attributeType attribute. For example, some attributes are part of the CSS namespace (which means that the attribute can be found as a CSS property as well) and others are XML-only. A table showing these attributes can be found here. The attributes in the table are not all of the SVG attributes. They are only the ones that can be set using CSS. Some of them are already available as CSS properties.

If the value for attributeType is not explicitly set or is set to auto , the browser must first search through the list of CSS properties for a matching property name, and if none is found, search the default XML namespace for the element.

For example, the following snippet animates the opacity of an SVG rectangle. Since the opacity attribute is also available as a CSS property, the attributeType is set to the CSS namespace:

We’ll go over the other animation attributes in the upcoming examples below. Except where otherwise noted, all of the animation attributes are common to all of the animation elements.

Animating an element’s attribute from one value to another over a duration of time, and specifying the end state: from , by , to , dur and fill

Let’s start by moving a circle from one position to another. We’re going to do that by changing the value of its cx attribute (which specifies the x-position of its center).

In order to change a value to another over a period of time, the from , to , and dur attributes are used. In addition to these, you will also want to specify when the animation should start with the begin attribute.

In the above example, we’ve defined a circle, and then called an animation on that circle. The center of the circle moves from the initial position at 50 units, to 450 units along the x-axis.

The begin value is set to click . This means that the circle will move when it is clicked. You can set this value to a time value as well. For example, begin=»0s» will start the animation as soon as the page is loaded. You can delay an animation by setting a positive time value. For example, begin=»2s» starts the animation two seconds after load.

What’s even more interesting about begin is that you can define values like click + 1s to start an animation one second after the element is clicked! What’s more, you can use other values that allow you to sync animations without having calculate the duration and delays of other animations. More about this later.

The dur attribute is similar to the animation-duration equivalent in CSS.

The from and to attributes are similar to the from and to keyframes in an animation’s @keyframe block in CSS:

The fill attribute (which is rather unfortunately named the same as the fill attribute which defines the fill color of an element) is similar to the animation-fill-mode property, which specifies whether or not the element should return to its initial state after the animation is over. The values in SVG are similar to those in CSS, except use different names:

  • freeze : The animation effect is defined to freeze the effect value at the last value of the active duration. The animation effect is «frozen» for the remainder of the document duration (or until the animation is restarted).
  • remove : The animation effect is removed (no longer applied) when the active duration of the animation is over. After the active end of the animation, the animation no longer affects the target (unless the animation is restarted).

Try changing the values in the live demo to see how the animation is affected:

The by attribute is used to specify a relative offset for the animation. As the name suggests, you can use it to specify the amount by which you want the animation to progress. The effect of by is almost only visible when you’re progressing over the animation duration in discrete steps, similar to the way it works with the CSS steps() function. The SVG equivalent to the CSS steps() function is calcMode=»discrete» . We’ll get to the calcMode attribute later in the article.

Another case where the effect of by is more obvious is when you only specify the to attribute. An example of that would be if you use it with the set element which we will also cover later in the article.

And last but not least, by also comes in useful when you’re working with additive and accumulative animations. We will go over that later in the article.

Restarting Animations with restart

It may be useful to prevent an animation from being restarted while it is active. To do that, SVG offers the restart attribute. You can set this attribute to one of three possible values:

  • always : The animation can be restarted any time. This is the default value.
  • whenNotActive : The animation can only be restarted when it is not active (i.e. after the active end). Attempts to restart the animation during its active duration are ignored.
  • never : The element cannot be restarted for the remainder of the current simple duration of the parent time container. (In the case of SVG, since the parent time container is the SVG document fragment, then the animation cannot be restarted for the remainder of the document duration.)

Naming animations and synchronizing them

Suppose we want to animate the position and the color of the circle, such that the change in color happens at the end of the moving animation. We can do that by setting the begin value of the color-changing animation to be equal to the dur ation of the moving animation; this is how we would normally do it in CSS.

SMIL, however, has a nice event-handling feature. We mentioned before that the begin attribute accepts values like click + 5s . This value is called an «event value», and is in this case made up of an event reference followed by a «clock value». The interesting part here is the naming of the second part: the «clock value». Why is it not simply a «time value»? Well the answer is that you can literally use a clock value like «10min» or «01:33» which is equivalent to «1 minute and 33 seconds», or even «02:30:03» (two hours, 30 minutes, and 3 seconds). At the time of this writing, clock values are not fully implemented in any browser.

So, if we were to go back to the previous demo and use click + 01:30 , if a browser started supporting it, the animation would fire 1 minute and 30 seconds after the circle is clicked.

Another kind of value it can accept is the ID of another animation followed by an event reference. If you have two (or more) animations (whether they are applied to the same element or not!) and you want to synchronize them so that one of them starts relative to the other, you can do that without having to know the duration of the other animation.

For example, in the next demo, the blue rectangle starts moving 1 second after the circle animation starts. This is done by giving each animation an ID , and then using that ID with the begin event as shown in the following code:

The begin=»circ-anim.begin + 1s» is the part that tells the browser to start the rectangle’s animation 1 second after the beginning of the circle’s. You can check the live demo out:

You can also start the rectangle animation after the circle animation ends using the end event:

You could even start it before the end of the circle’s animation:

Repeating Animations with repeatCount

If you want to run an animation more than once, you can do that using the repeatCount attribute. You can specify the number of times you want it to repeat, or use the indefinite keyword to have it repeat endlessly. So, if we were to repeat the circle’s animation for two times, the code would look like so:

You can check the live demo out here. In the demo, I’ve set the repeat count to be 2 on the circle, and indefinite on the square.

Notice how the animation restarts from the initial from value instead of the value it reached at the end of the animation. Unfortunately, SMIL does not include a way to go back and forth between the start and end values like CSS animations allow us to do. In CSS, the animation-direction property specifies whether or not an animation should play in reverse on some or all cycles or iterations. animation-direction: alternate value means that the animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction. This means that the first cycle will play from beginning to end, then the second cycle will play from the end back to the beginning, then the third cycle will play from the beginning to the end, and so on.

In SMIL to do that you would have to use JavaScript to explicitly change the values of the from and to attributes. Jon McPartland of the Big Bite Creative wrote a post a while back explaining how he did this for a menu icon animation that he worked on.

Another workaround is to specify the end value as the middle value and then have the end value be the same as the initial value. For example, you can set the animation to start from a value, and end at the same value as well with to , except that you specify what you would have set to be a final value, as an intermediate value between from and to .
In CSS we would do that using something like this:

The equivalent in SMIL is to use the values attribute, which we will explain shortly.

That said, the above workaround may or may not work for you depending on the kind of animation you’re after, and whether or not you are chaining animations, repeating them, or doing additive animations.

Here’s a nice, simple infinite animation using some delayed begin times by Miles Elam:

Restricting repetition time with repeatDur

Setting an element to repeat indefinitely may get annoying or not user-friendly if the animation resumes for a long time. So, it may be a good idea to restrict the repetition time to a certain period of time, and stop the repetition after some time relative to the beginning of the document. This is known as presentation time.

The presentation time indicates the position in the timeline relative to the document begin of a given document fragment. It is specified using the repeatDur attribute. Its syntax is similar to that of a clock value, but instead of being relative to another animation event or an interaction event, it’s relative to the beginning of the document.

For example, the following snippet will stop the repetition of the animation 1 minute and 30 seconds after the document begin:

And here is the live demo:

Synchronizing animations based on number of repetitions

Now let’s go back a step to the synchronizing between two animations topic. Indeed, in SMIL, you can synchronize animations so that one animation starts based on the number of repetitions of another. For example, you can start an animation after the nth-repetition of another, plus or minus an amount of time you may want to add.
The following example starts the rectangle’s animation at the second repetition of the circle’s animation:

The following is a live demo where the rectangle’s animation starts 2 seconds after the second repetition of the circle’s animation.

Controlling animation keyframe values: keyTimes and values

In CSS, we can specify the values that we want our animated property to take in a certain frame during the animation. For example, if you’re animating the left offset of an element, instead of animating it from, say, 0 to 300 directly, you can animate it so that it takes certain values during certain frames like this:

The 0%, 20%, 80%, and 100% are the frames of the animation, and the values in each frame’s block are the values for each frame. The effect described above is one of an element bouncing off a wall, then back to the final position.

In SMIL, you can control the values per frame in a similar way, but the syntax is quite different.

To specify the keyframes, you use the keyTimes attribute. And then to specify the value of the animated property for each frame, you use the values attributes. The naming conventions in SMIL are quite convenient.

If we were to go back to our moving circle, and use values similar to the ones in the CSS keyframes above, the code will look like the following:

So what did we do there?

The first thing to notice here is that the keyframe times and intermediate values are specified as lists. The keyTimes attribute is a semicolon-separated list of time values used to control the pacing of the animation. Each time in the list corresponds to a value in the values attribute list, and defines when the value is used in the animation function. Each time value in the keyTimes list is specified as a floating point value between 0 and 1 (inclusive), representing a proportional offset into the simple duration of the animation element. So the keytimes are similar to those in CSS, except that, instead of specifying them as percentages, you specify them as a fraction.

The following is the live demo for the above code. Click on the circle to start the animation.

Note that if a list of values is used, the animation will apply the values in order over the course of the animation. If a list of values is specified, any from , to and by attribute values are ignored.

At this point, it is also worth mentioning that you can use values attribute without the keyTimes attribute — the values are automatically spread out evenly through the time (for every calcMode value other than paced (See next section).

Controlling animation pace with custom easing: calcMode , and keySplines

I’m going to go for a CSS-SMIL comparison again because the SMIL syntax and concepts will be much simpler to understand if you’re already familiar with CSS animations.

In CSS, you can choose to change the default uniform animation pace and specify a custom easing function that controls the animation, using the animation-timing-function property. The timing function can be one of a few predefined keywords, or a cubic bezier function. The latter can be created using a tool such as this tool by Lea Verou.

In SMIL, the animation pace is specified using the calcMode attribute. The default animation pace is linear for all animation elements except animateMotion (we’ll get to it later in the article). In addition to the linear value, you can set the value to: discrete , paced , or spline .

  • discrete specifies that the animation function will jump from one value to the next without any interpolation. This is similar to the steps() function in CSS.
  • paced is similar to linear , except that it will ignore any intermediate progress times defined by keyTimes . It calculates out the distance between subsequent values and divides up the time accordingly. If your values are all in a linear order, you won’t notice the difference. But if they go back and forth, or if they are colours (which are treated as three-dimensional vector values), you will definitely see the intermediary values. The following is a live demo courtesy of Amelia Bellamy-Royds, that shows the difference between the three calcMode values mentioned so far:
  • The fourth value accepted by calcMode is spline . It interpolates from one value in the values list to the next according to a time function defined by a cubic bezier spline. The points of the spline are defined in the keyTimes attribute, and the control points for each interval are defined in the keySplines attribute.
  • You’ve probably noticed the new attribute in the last sentence: the keySplines attribute. So, what does the keySplines attribute do?

    Again, to the CSS equivalents.

    In CSS, you can specify the animation pace inside every keyframe, instead of specifying one animation pace for the entire animation. This gives you better control over how each keyframe animation should proceed. An example using this feature is creating a bouncing ball effect. The keyframes for that may look like this:

    Instead of keyword easing functions, we could have used the corresponding cubic-bezier functions:

    • ease-in = cubic-bezier(0.47, 0, 0.745, 0.715)
    • ease-out = cubic-bezier(0.39, 0.575, 0.565, 1)

    Let’s start by specifying the key times and list of values for our orange circle to undergo the same bouncing effect:

    The animation will be begin on click, and will freeze once it reaches the end value. Next, in order to specify the pace of each keyframe, we’re going to add the keySplines attribute.

    The keySplines attribute takes in set of bezier control points associated with the keyTimes list, defining a cubic bezier function that controls interval pacing. The attribute value is a semicolon-separated list of control point descriptions. Each control point description is a set of four values: x1 y1 x2 y2, describing the bezier control points for one time segment. The values must all be in the range 0 to 1, and the attribute is ignored unless the calcMode is set to spline .

    Instead of taking cubic-bezier functions as values, keySplines takes the coordinates of the two control points that are used to draw the curve. The control points can be seen in the following screenshot taken from Lea’s tool. The screenshot also shows the coordinates of each point, each colored with the same color as the point itself. For the keySplines attribute, it is these values that we are going to use to define the pace of the keyframe animations.

    SMIL allows these values to be separated either by commas with optional whitespace, or by whitespace alone. The keyTimes values that define the associated segment are the bezier «anchor points», and the keySplines values are the control points. Thus, there must be one fewer set of control points than there are keyTimes .

    If we go back to the bouncing ball example, the control point coordinates for the ease-in and ease-out functions are shown in the following images:

    So, to translate that into the SVG animation element, we get the following code:

    Here’s the live demo:

    If you only want to specify an overall easing function for the entire animation without any intermediate values, you would still have to specify the keyframes using the keyTimes attribute, but you would only specify the start and ending keyframes, namely 0; 1 , and no intermediate values .

    Additive & Accumulative Animations: additive and accumulate

    Sometimes, it’s useful to define an animation that starts from where the previous animation ended; or one that uses the accumulative sum of the previous animations as a value to proceed by. For that, SVG has two conveniently named attributes: additive and accumulate .

    Suppose you have an element whose width you want to «grow», or a line whose length you want to increase, or an element that you want to move step by step from one position to the other, over separate steps. This feature is particularly useful for repeated animations.

    Just like any other animation, you’re going to specify from and to values. However, when you set additive to sum , each of their values is going to be relative to the original value of the animated attribute.

    So, back to our circle. For our circle, the initial position of cx is 50. When you set from=»0″ to=»100″ , the zero if actually the original 50, and the 100 is actually 50 + 100; in other words, it’s practically kind of like » from=»50″ to=»150″ «.

    Цукерберг рекомендует:  5 причин, почему Python всё еще крут

    By doing that, we get the following result:

    This is all the additive attribute does. It just specifies whether the from and to values should be relative to the current value or not. The attribute only takes one of two values: sum and replace . The latter is the default value, and it basically means that the from and to values are going to replace the current/original values, which may end up causing a weird jump before the animation starts. (Try replacing sum with replace in the above example for a better comparison.)

    However, what if we want the values to be added such that the second repetition starts off from the ending value of the previous one? This is where the accumulate attribute comes in.

    The accumulate attribute controls whether or not the animation is cumulative. The default value is none , which means that, when the animation is repeated for example, it’s going to start back from the beginning. You can, however, set it to sum , which specifies that each repeat iteration after the first builds upon the last value of the previous iteration.

    So, if we were to go back to the previous animation and specify accumulate=»sum» , we’d get the following prefferable result:

    Note that the accumulate attribute is ignored if the target attribute value does not support addition, or if the animation element does not repeat. It will also be ignored if the animation function is specified with only the to attribute.

    Specifying an animation’s end time with end

    In addition to specifying when an animation begins, you can also specify when it ends, using the end attribute. For example, you can set an animation to repeat indefinitely, and then have it stop when another element starts animating. The end attribute takes values similar to those that the begin value takes. You can specify absolute or relative time values/offsets, repeat values, event values, etc.
    For example, in the following demo, the orange circle moves slowly over a period of 30 seconds to the other side of the canvas. The green circle will also animate, but only when it’s clicked. The orange circle’s animation will end when the green circle’s animation starts. Click on the green circle to see the orange one stop:

    The same kind of animation synchronization can be achieved for two animations applied to the same element, of course. For example, suppose we set the color of the circle to animate indefinitely changing from one value to another. Then, when the element is clicked, it moves to the other side. We’ll set it now so that the color animation stops as soon as the element is clicked and the moving animation is fired.

    Defining animation intervals using multiple begin and end values

    Indeed, both the begin and end attributes accept a list of semi-colon-separated values. Each value in the begin attribute will correspond to a value in the end attribute, thus forming active and inactive animation intervals.

    You can think of this as being similar to a moving car, where the car’s tires are active and then inactive for periods of time, depending on whether or not the car is moving. You can even create the animated car effect by applying to animations to the car: one that translates the car or moves it along a path that is also an additive and accumulative animation, and another animation that rotates the car’s tires in intervals that would be synchronized with the translation.

    An example specifying multiple beginning and ending times (i.e. intervals) is the following demo, where the rectangle is rotated based on the defined intervals, changing from active to inactive accordingly. (Rerun the demo if you miss the animation.)

    Also note that, even if you set the repeatCount to indefinite , it will be overridden by the end values and will not repeat indefinitely.

    Restricting the active duration of an element using min and max

    Just like you can restrict the repetition time of an animation, you can even restrict the active duration of an animation. The min and max attributes specify the minimum and maximum value of the active duration, respectively. They provide us with a way to control the lower and upper bound of the element active duration. Both attributes take a clock value as a value.

    For min , that specifies the length of the minimum value of the active duration, measured in element active time. Value must be greater than or equal to 0, which is the default value and does not constrain the active duration at all.

    For max , the clock value specifies the length of the maximum value of the active duration, measured in element active time. Value must also be greater than 0. The default value for max is indefinite . This does not constrain the active duration at all.

    If both min and max attributes are specified then the max value must be greater than or equal to the min value. If this requirement is not fulfilled then both attributes are ignored.

    But what defines the active duration of an element? We mentioned the repeat duration before, in addition to the «simple duration», which is the duration of the animation without any repetition (specified using dur ), so how do all of these work together? Which overrides what? and then what about the end attribute which would override and simply end the animation?

    The way it happens is that the browser will first compute the active duration based on the dur , repeatCount , repeatDur , and end values. Then, it runs the computed duration against the specified min and max values. If the result is within the bounds, this first computed duration value is correct and will not be changed. Otherwise two situations may occur:

    • If the first computed duration is greater than the max value, the active duration of the element is defined to be equal to the max value.
    • If the first computed duration is less than the min value, the active duration of the element becomes equal to the min value and the behavior of the element is as follows:
      • If the repeating duration (or the simple duration if the element doesn’t repeat) of the element is greater than min then the element is played normally for the ( min constrained) active duration.
      • Otherwise the element is played normally for its repeating duration (or simple duration if the element does not repeat) and then is frozen or not shown depending on the value of the fill attribute.

    That leaves us with how the browser actually computes the active duration. For sake of brevity, I’m not going to get into the details here. But there is a very comprehensive table in the specification that shows the different combinations of the dur , repeatCount , repeatDur , and end attributes, and then shows what the active duration will be based on each combination. You can check the table out and read more about this in this section of the specification.

    Lastly, if an element is defined to begin before its parent (e.g. with a simple negative offset value), the minimum duration is measured from the calculated begin time not the observed begin. This means that the min value may have no observed effect.

    example: morphing paths

    One of the attributes that can be animated in SMIL (but not in CSS) is the d attribute (short for data) of an SVG

    . The d attribute contains the data which defines the outline of the shape that you’re drawing. The path data consists of a set of commands and coordinates that tell the browser where and how to draw points, arcs, and lines that make up the final path.

    Animating this attribute allows us to morph SVG paths and create shape tweening effects. But, in order to be able to morph shapes, the start, end, and any intermediate path shapes need to have the exact same number of vertices/points, and they need to appear in the same order. If the number of vertices doesn’t match, the animation wouldn’t work. The reason for this is that the shape changing actually happens by moving the vertices, and interpolating their positions, so if one vertex is missing or does not match, the paths won’t be interpolated anymore.

    To animate an SVG path, you specify the attributeName to be d , and then set the from and to values that specify the start and end shapes, and you can use the values attribute to specify any intermediate values you want the shape to go through in between.

    For the sake of brevity, I won’t get into the details of how to do this here. Instead, you can read this excellent article by Noah Blon, in which he explains how he created a shape-tweening kind-of-loading animation using . The live demo for Noah’s article is this:

    And here’s another morphing example by Felix Hornoiu:

    You can even morph the values of a path being used as a clipping mask! An example of that by Heather Buchel:

    Animating along arbitrary paths: The Element

    Specifying the motion path using the path attribute

    The path attribute is used to specify the motion path. It is expressed in the same format and interpreted the same way as the d attribute on the path element. The effect of a motion path animation is to add a supplemental transformation matrix onto the current transformation matrix for the referenced object which causes a translation along the x- and y-axes of the current user coordinate system by the computed X and Y values computed over time. In other words, the path specified is calculated relative to the element’s current position, by using the path data to transform the element onto the path position.

    For our circle, we’re going to animate it along a path that looks like the following:

    The code required for the circle to move along this path is:

    There is one thing I want to focus on here: the coordinates in the path data. The path starts by moving (M) to the point with coordinates (0, 0), before it starts to draw a curve (c) to another point. It is important to note that the (0, 0) point is actually the position of the circle, no matter where it is — NOT the top left corner of the coordinate system. As we mentioned above, the coordinates in the path attribute are relative to the current position of the element!

    The result of the above code is:

    If you were to specify the path starting from a point other than (0, 0), the circle would abruptly jump by the amount specified in the beginning point. For example, suppose you draw a path in Illustrator and then export that path data to use as a motion path (that’s what I did the first time I did this); the exported path may look something like this:

    The starting point of the path in this case is (100.4, 102.2). If we were to use this data as the motion path, the circle will jump by

    100 units to the right and

    102 units downwards, and then start the motion along the path relative to the new position. So, make sure to keep this in mind when you prepare the motion path for your animation.

    If used, attributes from , by , to and values specify a shape on the current canvas which represents the motion path.

    Specifying the motion path using the element

    There is also another way you can specify a motion path. Instead of using the relative path attribute, you can reference an external path using the element. The , a child of the element, would then reference the external path using the xlink:href attribute.

    The motion path

    can be defined anywhere in the document; it can even be literally just defined inside a element and not rendered on the canvas at all. In the next example, the path is rendered because, in most cases, you may want to show the path that the element is moving along.
    Note that, according to the specification:

    The various (x, y) points of the shape provide a supplemental transformation matrix onto the CTM for the referenced object which causes a translation along the x- and y-axes of the current user coordinate system by the (x,y) values of the shape computed over time. Thus, the referenced object is translated over time by the offset of the motion path relative to the origin of the current user coordinate system. The supplemental transformation is applied on top of any transformations due to the target element’s transform property or any animations on that attribute due to animateTransform elements on the target element.

    Again, the position of the circle is «multiplied» or «transformed» by the coordinates in the path data.

    In the next example, we have a path in the middle of the canvas. The circle is positioned at the beginning of the path. Yet, when the motion path is applied, the circle does not start its motion from its current position. See the demo for a better explanation. Click on the circle to animate it.

    See how the circle does follow the same shape of the path, but over a different position? This is due to the fact that the circle’s position is transformed by the values of the path data.

    One way around this is to start with the circle being positioned at (0, 0), so that when the path data is used to transform it, it will start and proceed as expected.

    Another way is to apply a transformation that «resets» the coordinates of the circle so that they compute to zero before the path is applied.

    The following is a modified version of the above demo, using a closed path and repeating the motion animation indefinitely.

    Override Rules for

    Since there are more than one way to do the same thing for animateMotion , it only makes sense to have override rules to specify which values override others.

    The override rules for animateMotion are as follows:

    • Regarding the definition of the motion path, the mpath element overrides the the path attribute, which overrides values , which overrides from , by and to .
    • Regarding determining the points which correspond to the keyTimes attributes, the keyPoints attribute overrides path , which overrides values , which overrides from , by and to .

    Setting an element’s orientation along a motion path with rotate

    In our previous example, the element we were animating along the path happened to be a circle. But what if we’re animating an element that has a certain orientation like, say for example, a car icon? The car icon in the following example is designed by Freepik.

    In this example, I’ve replaced the circle with a group with an ID of «car», which contains the element making up the group. Then, in order to avoid the problem with the motion along the path mentioned above, I’ve applied a transformation to the car to that translates it by a specific amount, so that the initial position ends up at (0, 0). The values inside the transformations are actually the coordinates of the point where the first path of the car starts drawing (right after the move command M).

    The car then starts moving along the motion path. But. this is how the motion looks like:

    The car’s orientation is fixed, and does not change to match that of the motion path. In order to change that, we’re going to use the rotate attribute.

    The rotate attribute takes one of three values:

    • auto : Indicates that the object is rotated over time by the angle of the direction (i.e., directional tangent vector) of the motion path.
    • auto-reverse : Indicates that the object is rotated over time by the angle of the direction (i.e., directional tangent vector) of the motion path plus 180 degrees.
    • a number: Indicates that the target element has a constant rotation transformation applied to it, where the rotation angle is the specified number of degrees.

    To fix the orientation of the car in the above example, we’ll start with setting the rotation value to auto . We’ll end up with the following result:

    If you want the car to move outside the path, the auto-reverse value fixes that.

    This looks better, but we still have one problem: the car looks like it’s moving backwards along the path! In order to change that, we’d need to flip the car along its y-axis. This can be done by scaling it by a factor of «-1» along that axis. So, if we apply the transformation to the g with the car ID, the car will move forward as expected. The scaling transformation is just going to be chained with the previous translation we applied earlier.

    And the final demo looks like this:

    Controlling the animation distance along the motion path with keyPoints

    The keyPoints attribute provides the ability to specify the progress along the motion path for each of the keyTimes specified values. If specified, keyPoints causes keyTimes to apply to the values in keyPoints rather than the points specified in the values attribute array or the points on the path attribute.

    keyPoints takes a semicolon-separated list of floating point values between 0 and 1 and indicates how far along the motion path the object shall move at the moment in time specified by corresponding keyTimes value. Distance calculations are determined by the browser’s algorithms. Each progress value in the list corresponds to a value in the keyTimes attribute list. If a list of keyPoints is specified, there must be exactly as many values in the keyPoints list as in the keyTimes list.

    One important thing to note here is to set the calcMode value to linear for keyPoints to work. It also looks like it should logically work with paced animation, if your key points move back and forth, but it doesn’t.

    The following is an example by Amelia Bellamy-Royds (whose Codepen profile you should totally check out) that uses keyPoints to mimic the behavior is starting a motion along a path from a pre-defined offset, because we currently don’t have that ability by default in SMIL.

    Moving text along an arbitrary path

    Moving text along an arbitrary path is different from moving other SVG elements along paths. To animate text, you’re going to have to use the element, not the element.

    First, let’s start by positioning the text along a path. This can be done by nesting a

    element inside the

    element. The text that is going to be positioned along a path will be defined inside the

    element, not as a child of the

    The textPath is then going to reference the actual path that we want to use, just like we did in the previous examples. The referenced path can also be either rendered on the canvas, or defined inside a . Check the code in the following demo out.

    To animate the text along that path, we’re going to use the element to animate the startOffset attribute.

    The startOffset represents the offset of the text on the path. 0% is the beginning of the path; 100% represents the end of it. So if, for example, the offset is set to 50%, the text will start halfway through the path. I think you can see where we’re going from here.

    By animating the startOffset , we’re going to create the effect of text moving along the path. Check the code in the following demo out.

    Animating transformations: The Element

    The type attribute is used to specify the type of the transformation that’s being animated. It takes one of five values: translate , scale , rotate , skewX , and skewY .

    The from , by and to attributes take a value expressed using the same syntax that is available for the given transformation type:
    + For a type=»translate» , each individual value is expressed as [, ] .
    + For a type=»scale» , each individual value is expressed as [, ] .
    + For a type=»rotate» , each individual value is expressed as [ ] .
    + For a type=»skewX» and type=»skewY» , each individual value is expressed as .

    If you’re not familiar with the syntax for the SVG transform attribute functions, and for the sake of brevity of this article, and because the syntax details and how it works is outside the scope of this article, I recommend you read the article I’ve written about this a while back: Understanding SVG Coordinate Systems and Transformations (Part 2): The transform Attribute, before you move on with this guide.

    Back to a previous demo, where we rotated the pink rectangle using the element. The code for the rotation looks like the following:

    The from and to attributes specify the angle of rotation (start and end) and the center of rotation. In both, the center of rotation remains the same, of course. If you don’t specify the center, it will be the top left corner of the SVG canvas. The live demo for the above code is the following:

    Here’s another fun example with a single animateTransform by Gabriel:

    See the Pen Orbit by Gabriel (@guerreiro) on CodePen.

    Animating a single transformation is simple, however, things can get really messy and complicated when multiple transformations are included, especially because one animateTransform can override another, so instead of adding and chaining effects, you may end up with the complete opposite. That, in addition to the way SVG coordinate systems and transformations actually work (refer to the article mentioned earlier on the topic). The examples are vast, and outside the scope of this article. For transforming SVGs, I recommend using CSS transforms. Implementations are working on making the latter work perfectly with SVG, so you may never have to use SMIL for animating transformations in SVG at all.

    The Element

    The set element provides a simple means of setting the value of an attribute for a specified duration. It supports all attribute types, including those that cannot reasonably be interpolated, such as string and boolean values. The set element is non-additive. The additive and accumulate attributes are not allowed, and will be ignored if specified.

    Since is used to set an element to a specific value at and during a specific time, it does not accept all of the attributes mentioned for the previous animation elements. For example, it does not have a from or by attribute, because the value that changes does not change progressively over the period of time.

    For set , you can specify the element you’re targeting, the attribute name and type, the to value, and the animation timing can be controlled with: begin , dur , end , min , max , restart , repeatCount , repeatDur , and fill .

    The following is an example that sets the color of the rotating rectangle to blue when it is clicked. The color remains blue for a duration of 3 seconds, and then turns back to the original color. Every time the rectangle is clicked, the set animation is fired, and the color is changed for three seconds.

    Elements, attributes and properties that can be animated

    Not all SVG attributes can be animated, and not all of those that can be animated, can be animated using all the animation elements. For a complete list of all animatable attributes, and a table showing which of these can be animated by which elements, please refer to this section of the SVG Animation specification.

    Final Words

    SMIL has a lot of potential, and I barely scratched the surface and only touched on the basics and technicalities of how they work in SVG. A lot of very impressive effects can be created, especially ones involving morphing and transforming shapes. The sky’s the limit. Go crazy! and don’t forget to share what you make with the community; we’d love to see what you’ve been up to. Thank you for reading!

    This article has been updated based on this discussion in the comments below. Thanks for your input, Amelia. =)

    Эффект анимации рамки с помощью SVG и CSS

    Дата публикации: 2014-03-27

    От автора: Веб-сайт Карла Филипа Бреннена (Carl Philipe Brenner) отличается очень креативной и изящной анимацией, и сегодня мы собираемся разобраться, как воссоздать эффект анимации рамки, применив к линиям SVG переходы CSS.

    Сегодня мы хотели бы разобраться в очень тонком, но интересном эффекте анимации рамки, которую можно видеть на креативном вебсайте Карла Филипа Бреннера (Carl Philipe Brenner). При проведении мышью над одним из белых элементов сетки портфолио вы увидите изящную анимацию: элемент сетки становится прозрачным, а линии рамки с каждой стороны начинают анимацию по часовой стрелке, создавая действительно красивый эффект. В данном случае он получается путем анимации ширины или высоты нескольких тегов span с помощью JS. Мы опробуем другой подход, применяющий SVG и переходы CSS. Пожалуйста, помните, что эта техника очень экспериментальна.

    Сначала давайте рассмотрим основную концепцию, а затем двинемся к конечному эффекту. Пожалуйста, обратите внимание, что переходы CSS к SVG, которые мы применим, поддерживаются не во всех браузерах.

    Когда смотришь на эффект, не сразу ясно, что происходит, но если внимательно глядеть только на одну сторону, скажем, на верхнюю линию рамки, то заметно, что сначала ширина белой линии уменьшается справа налево, и справа с небольшой задержкой, или брешью, появляется новая линия. Будучи добавленным ко всем сторонам, эффект создает иллюзию того, что верхняя линия как будто перемещается вокруг угла к левой стороне, левая сторона перемещается вниз и так далее.

    Практический курс по верстке адаптивного сайта с нуля!

    Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3

    Конечно, такой эффект можно создать без SVG, даже без дополнительных элементов, просто применив псевдоэлементы. Но здесь нужно разобраться, что можно сделать с помощью SVG, и как контролировать ее посредством CSS, а не через JavaScript.

    Обдумывая, как создать этот эффект с помощью SVG, нам можно было анимировать stroke-dashoffset штриха прямоугольника или просто начертить линии. Но требовалось решение, не использующее JS, и после некоторых колебаний мы решили, что значения перехода stroke-dashoffset и stroke-dasharray в CSS могут оказаться весьма «глючными». Так что было решено попробовать другое решение, использовав линии и анимировав их перевод. (Можно представить себе другие подходы конкретно к этому эффекту, но нам понравилась идея перемещения линий, потому что ее довольно легко понять и выполнить в CSS, а также она создает возможность другой анимации, как видно из демопримера.)

    Особенность линий, которые мы станем использовать, состоит в том, что они послужат в качестве трех состояний анимации. На самом деле они будут в три раза длиннее размера блока, в котором находятся. В середине линии будет зазор размером со сторону блока. Мы добьемся этого, установив значение stroke-dashoffset на длину стороны блока. Теперь весь фокус в переходе позиции линии:

    У SVG будет размер блока, поэтому мы не увидим за штриховой линией переполнение. До того, как продолжить работу над следующими тремя линиями, давайте закодируем этот первый этап. Наша линия с SVG содержится в div:

    Множество различных jQuery примеров , элементы CSS
    и большое количество других инструментов для Вашего сайта !

    Подборка самых популярных WordPress плагинов для любого сайта.

    Здесь вы сможете скачать различные jQuery скрипты для любых проектов.

    Бесплатно скачать CSS3 наработки с различными эффектами анимации.

    Можно скачать файлы HTML5 с современными возможностями разработки.

    Множество различных free PSD объектов для WEB-дизайна.

    Колекция различных элементов form jQuery для вашего сайта.

    Бесплатно скачать иконки для сайта в форматах PSD, PNG и так далее.

    Коллекция всегда обновляющихся модальных окон на jQuery.

    Разные примеры jQuery validate собраны в одном месте сайта.

    Симпатичные варианты реализации ваших jQuery gallery.

    Большой сборник широкоформатных и адаптивных jQuery slider`ов.

    Ишите примеры реализации jQuery scroll? Это то, что вам нужно.

    Красивые и динамичные всплывающие подсказки на jQuery и CSS3.

    Интересные материалы на тему веб разработок, главные новости.

    Подобрка плагинов Javascript, библиотек, фреймворков и т.д.

    Коллекция потрясающих примеров анимации для вашего сайта.

    Модернизация элементов форм, создание систем автозаполнения

    Плагины для выбора и настройки даты и времени в формах

    Предзагрузчики, анимация загрузки, перлоадеры и т.д.

    Компоненты, содержащие в себе реализацию параллакс-эффекта.

    Создание вкладок, оформление списков в удобную навигацию.

    Все, что касается таблиц с данными: фильтр, сортировка и т.д.

    Наработки SVG-графики и наложение на нее анимации. Просто красиво.

    Отрисовка элементов на веб-странице с помощью html5 canvas.

    Примеры элементов, которые реагируют при наведении на них.

    Плагины для фото и видео галерей, способные приблежать контент.

    Кнопки. Создание красивы и незабываемых кнопок для сайта.

    Все, что касается сортировки данных на странице. Плагины html5.

    Выборка данных. Множество примеров jQuery select.

    Различные способы создания красивого и эффектного меню для сайта.

    Дерево элементов. Построение множественных списков на странице.

    Примеры объектов в трехмерном пространстве с помощью CSS3 и jQuery.

    CSS Border Transitions — анимация рамки при наведении


    Всегда приятно находиться на сайте, где имеются занимательные эффекты у блоков при наведении. В данном примере вы найдете шесть разных hover-эффектов c помощью свойства border.

    Смотрите также:


    Автоматическое продвижение сайта в TOP.

    Если Вы нашли ошибку в тексте, пожалуйста, выделите область и нажмите Ctrl + Enter.

    Последняя версия jQuery:

    Небольшое руководство по тому, как скачать самую актуальную версию библиотеки jQuery, а также рекомендации по подключению скрипта.

    Создаем SVG анимацию, используя CSS и JavaScript

    SVG или Масштабируемая Векторная Графика (Scalable Vector Graphics) применяет XML, дабы предоставлять вектору графическую информацию в легкой форме. В отличие от другого растеризированного формата изображения, такого как PNG и JPEG, SVG может быть изменен без потери качества изображения.

    Создавать SVG можно при помощи Adobe Illustrator, а также используя другие различные графические редакторы. Но еще возможно сделать это и вручную, используя XML/SVG DOM теги и настройки создания элементов.

    Так как это графика XML, возможно создавать некую анимацию SVG, путем использования возможностей CSS, JavaScript и SMIL (Синхронизированный Мультимедийный Язык Интеграции).

    В сегодняшнем уроке я покажу вам, как анимировать SVG с помощью CSS и JavaScript. А использовать мы будем изображение, текст и векторную графику.

    Для сегодняшнего урока нам понадобится:

    • SVG иконка
    • SVG текст
    • SVG ваза и цветок
    • Знание HTML и CSS
    • Время и чуточку терпения

    Экспортируем файлы в SVG

    Лучший способ экспортировать изображение в SVG формат, это воспользоваться возможностями Adobe Illustrator. Я уже создал SVG иконку и текст в illustrator, которые мы будем использовать в процессе урока.

    Чтобы экспортировать Ваши файлы Adobe Illustrator в SVG, просто зайдите в File->Save As(Файл->Сохранить как), следующим шагом будет выбор имени и SVG формата. В этом примере я буду использовать plant(вазу), формат файла выбираем SVG.

    Затем всплывет окно, удостоверьтесь, что у вас выбран SVG version(версии 1.1), после выберите location(местоположение):link(ссылка). В CSS properties(CSS свойствах) выбираем Style Elements(Элементы стиля). Если вам необходимо проверить SVG код, то вам нужно нажать на кнопку “SVG Show code”(Просмотр кода SVG), она находится в нижней части окна. Чтобы закончить процесс, экспорта необходимо нажать на кнопку OK.

    Используем SVG в HTML

    SVG, как указано выше, основывается на XML, и некоторые браузеры позволяют вам вставлять изображение SVG в HTML. Есть различные способы включать SVG в документы HTML.

    1. Вставляем целый SVG код в HTML

    Это самый быстрый способ вставить SVG в ваш HTML файл. SVG код необходимо вставлять в HTML между тегами . Если вы хотите вставить больше одного SVG файла, то у вас могут возникнуть трудности, особенно если вы только начинаете использовать SVG. Для примера посмотрите код ниже:

    15 Inspiring Examples of CSS Animation on CodePen

    CodePen is fast becoming the go-to place to show off what we can do with our web creations. Here’s a list of some of the great stuff people have been creating with CSS animations recently!

    Note: for even more inspiration, take a look at my latest post:

    10 Examples of Animation on CodePen You Can Learn From

    1. JavaScript Mickey Watch

    This is a lovely example of combining CSS transitions, SVG graphics and JavaScript to position the hands on a cute Mickey Mouse watch face.

    2. CSS Submarine

    Gorgeous use of the circular port-hole shaped container gives this CSS-animated submarine a lot of charm.

    3. ASCII AT-AT

    Star Wars inspired AT-AT personnel carrier, drawn using text with the colours cycled in CSS. A funky effect.

    4. SVG/CSS Loader

    This loader uses the changing colours to give the impression of rotating.

    5. 3D CSS Tardis

    CSS can be used to create some amazing 3D effects. Here’s a 3D tardis:

    6. Dozing Bird

    Simple art style and just the right amount of animation give this sleepy bird the illusion of life.

    7. Pure CSS border animation

    Simple yet very effective use of CSS borders to create a loading-style animation.

    8. Star Wars: The Force Awakens

    Star Wars: The Force Awakens in CSS by Donovan Hutchinson (@donovanh).

    The title from the upcoming Star Wars movie created using CSS, HTML and a little JavaScript.

    9. 3D Synth

    Try out the keys and rotating this 3D synth created using CSS. Amazing work:

    10. Cascading Solar System

    A model of our solar system, complete with scaled rotation speed, moons and details on each of the larger planets. The sun is even a live capture of the real thing!

    11. 3D Solar System

    Another solar system, but this time in 3D. Beautiful use of shading.

    12. Flat Design Camera

    Press the shutter on this flat camera to see it create a photo using CSS animation.

    13. Day and Night Transition

    Press the button to see day transform to night.

    14. Animated Sprite with CSS

    A demonstration of how a sequence of images (sprite) can be used to create stop-motion animation, complete with forward and reverse motion.

    15. Dodecahedron

    A subtle, beautiful dodecahedron created and animated entirely with CSS.

    CSS Animations on Envato Market

    CSS animations are a growing category on Envato Market too. If you want to use animation effects in your projects, you can find everything from shadows to image hover effects, lightboxes and more.

    Popular CSS animations on Envato Market


    Not long ago, we would have leaned on Flash or JavaScript tools for any in-browser animation. Modern browsers have brought better support for CSS, with hardware accelerated 3D and animation.

    Thanks to sites such as CodePen, we can share and learn more easily than ever before. What are some of the most inspiring animation demos you’ve seen recently?

    Learn CSS: The Complete Guide

    We’ve built a complete guide to help you learn CSS, whether you’re just getting started with the basics or you want to explore more advanced CSS.

    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих