Статьи

Создание анимированной открытки ко дню Святого Валентина с Snap.svg

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

В то время как мы получили хороший результат, наше творение было в основном статичным рисунком без каких-либо наворотов.

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

Хотя создание статического SVG в множестве графических программ относительно просто, Snap.svg является одним из лучших способов создания динамических интерактивных SVG. Мы расскажем о некоторых методах, которые вы сможете применить ко многим различным приложениям.

Давайте начнем.

Сначала откройте ваш любимый редактор и создайте новый HTML-документ. Затем мы добавляем ссылки на два веб-шрифта Google и библиотеку Snap.svg.

Мы сделаем это, поместив следующие 3 строки внутри тега head . Это настраивает Snap для нас и включает в себя пару Google Fonts.

 <link href='http://fonts.googleapis.com/css?family=Niconne' rel='stylesheet' type='text/css'> <link href='http://fonts.googleapis.com/css?family=Oleo+Script' rel='stylesheet' type='text/css'> <script src="http://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.3.0/snap.svg-min.js"> </script> 

Теперь внутри тега body мы создаем тег script и помещаем в него следующий код:

 window.onload = function () { var card = Snap(600, 400); } 

Функция windows.onload обеспечивает полную загрузку страницы перед выполнением любого JavaScript. Переменная card представляет наш холст SVG с width и height установленной на 600 и 400 пикселей.

 <!-- SVG Heart Shape --> <svg version="1.1" id="heart" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="300px" height="200px" viewBox="0 0 300 200" enable-background="new 0 0 300 200" xml:space="preserve"> <path fill-rule="evenodd" clip-rule="evenodd" fill="none" d="M149.95,43.749C111.115-25.583,0.729-9.406,0.002,71.063 c-0.402,44.195,52.563,60.716,87.829,78.384c34.196,17.135,58.534,40.574,62.347,50.553c3.266-9.777,30.373-33.88,62.028-51.032 c34.612-18.755,88.231-34.189,87.829-78.385C299.304-10.087,186.998-22.818,149.95,43.749z"/> </svg> 

Далее, мы помещаем указанный выше необработанный SVG-код ниже тега script Это SVG-путь для формы сердца, который мы будем использовать чуть позже. Я использовал Inkscape для создания данных пути. Затем мы возвращаемся внутрь тега script и размещаем следующие строки кода под переменной card .

 // Utilities var dropShadow = card.paper.filter(Snap.filter.shadow(0, 2, 3)) var bgGradient = card.paper.gradient("r(0.5, 0.5, 0.5)#EE2C34-#821D2D"); var barGradient = card.paper.gradient("l(0, 0.5, 1, 0.5)#00ADEF-#EC008B:75"); 

Вот некоторые утилиты: фильтр тени и два градиента (один радиальный и один линейный). Они понадобятся нам в коде ниже.

Теперь мы готовы приступить к созданию фактической карты. Мы начнем с добавления теплого красного фона солнечных лучей.

 // Card's Background var background = card.paper.rect(0, 0, 600, 400).attr({fill: bgGradient, stroke: "none"}) var rays = card.circle(300, 200, 300).attr({ fill: "none", stroke: "red", strokeWidth: 580, strokeDasharray: "20 20", opacity: 0.2 }); 

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

Сначала мы создаем круг с красным обводкой и заливкой, strokeWidth «none», а затем, чтобы имитировать эффект лучей, мы устанавливаем для strokeWidth очень strokeWidth значение (заполнение всего холста) и strokeDasharray атрибуту strokeDasharray значение «20». 20 «(в результате пунктирная линия).

OK. Сцена теперь готова! Давайте добавим актеров.

 // Hearts Shapes Snap.select("#heart").appendTo(card); var heartLeft = Snap.select("path").attr({ fill: "#00ADEF", filter: dropShadow, transform: "t50,80", opacity: 0.9 }).insertAfter(rays); var heartRight = heartLeft.clone().attr({ fill: "#EC008B", filter: dropShadow, transform: "t250,80", opacity: 0.9 }); 

Теперь нам нужен код SVG, который мы помещаем в конец нашего тега body . Сначала мы выбираем его по идентификатору #heart и добавляем на холст. Затем мы выбираем фактический путь, присваиваем ему нужные атрибуты и проверяем, что он вставлен после лучей (что означает над ними). Затем мы создаем вторую форму сердца, клонируя первую и изменяя атрибуты fill и transform .

У нас есть два прекрасных сердца, и теперь мы хотим разместить на них текст «Я люблю тебя». Здесь мы будем называть веб-шрифт Google «Oleo Script».

 // Hearts Texts var iuText = card.paper.text(185,200, ['I','U']).attr({ fill: "#B5DD25", fontFamily: "Oleo Script", fontSize: "72px", filter: dropShadow, opacity: 0 }).animate({opacity: 1}, 2000); iuText.select("tspan:nth-child(2)").attr({dx: "160px"}); var loveText = card.paper.text(290,85, ["L", "O", "V", "E"]).attr({ fill: "#B5DD25", fontFamily: "Oleo Script", fontSize: "24px", filter: dropShadow, opacity: 0 }).animate({opacity: 1}, 2000); loveText.selectAll("tspan").attr({x: 290, dy: "1.2em"}); 

Первый фрагмент текста создает две строки «I» и «U». По умолчанию они располагаются вместе, но мы хотим, чтобы они были разделены. Мы делаем это, выбирая строку «U» и удаляя ее на 160 пикселей (используя атрибут dx ).

Второй текст создает четыре строки: по одной на каждую букву от слова «любовь». В последней строке кода текст отображается вертикально, выделив каждую букву и присвоив ей одинаковые координаты для x , и установив для атрибута dy значение «1.2em».

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

 var ribbon = card.paper.rect(0, 300, 600, 70).attr({fill: "#6F2570", filter: dropShadow}); var bar = card.paper.rect(0, 300, 600, 10).attr({fill: barGradient}); 

Здесь мы создаем ленту с полосой вверху. Мы применяем эффект тени на ленте и заполняем полосу линейным градиентом с цветами, соответствующими цветам сердца. И следующее, что мы собираемся добавить, это крутой вращающийся текст над лентой. На этот раз мы будем использовать веб-шрифт Google «Niconne».

 // Rotating Wish Text setTimeout(function(){ var wishText = "Happy Valentine's Day \u2763"; // create the wish text var charsGroup = card.g(); // create a group for the individual characters var charsArray = wishText.split(''); // split the wish text to characters var wishTextChars = charsGroup.text(110, 355, charsArray).attr({ // create a text element with an individual string for each character fill: "#D6DF23", fontFamily: "Niconne", fontSize: "42px", filter: dropShadow, opacity : 1, }); var singleChars = charsGroup.selectAll("tspan").attr({opacity: 0}); // select all strings/characters and hide them initially function charsAnimation( element ) { // a function for animating each character Snap.animate(0,1, function( value ) { element.attr({ opacity: value, rotate: (value * 360) }); }, 2000 ); } for( var i=0; i < singleChars.length; i++ ) { // go through each character and animate it setTimeout( charsAnimation.bind(null, singleChars[i]) , i * 300); } }, 2000); 

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

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

 // Hearts Rain Effect setTimeout(function(){ function randomNums(min, max) { // a function generating random numbers return Math.floor( Math.random() * ( 1 + max - min ) ) + min; } setInterval(function () { // create new hearts set every 2 seconds for (var i = 1; i < 29; i++) { var hearts = ["\u2764", "\u2665"]; // unicode characters for hearts var colors = ["#D691BF","#D74498", "#A54A9C"]; // different colors for the hearts var heart = randomNums(0,1); var color = randomNums(0, 2); var size = randomNums(3, 6); var time = randomNums(5, 10); var mutableX = i * 20; var heartsRain = card.paper.text(mutableX, -50, hearts[heart]).attr({ fill: colors[color], fontSize: size * 5, opacity: 0.3 }).animate({transform: "t0,500", opacity: 0.9}, time * 1500, mina.linear); }; }, 2000); }, 7000); 

И теперь мы закончили. Вы можете увидеть окончательный результат здесь:

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

Надеюсь, вам понравился урок, и я желаю всем вам счастливого Дня Святого Валентина!