Обратная анимация
В сегодняшнем уроке попробуем создать обратную анимацию. С помощью jQuery будем назначать определенный класс при нажатии на кнопку.
HTML
Разметка не очень сложная. Мы использовали два неупорядоченных списка. В первом списке вставляем все графики (с помощью CSS3) и анимации, а второй список будет содержать ссылки на социальные сервисы с хорошей анимацией.
<div class="ID-Image">
<ul id="follow">
<li class="line1">
<span id="layerBall" class="ball">ВКонтакте</span>
<span id="layerPulse" class="pulse"></span>
</li>
<li class="line2">
<span id="layerBall1" class="ball1">Google+</span>
<span id="layerPulse1" class="pulse1"></span>
</li>
<li class="line3">
<span id="layerBall2" class="ball2">TWITTER</span>
<span id="layerPulse2" class="pulse2"></span>
</li>
<li class="line4">
<span id="layerBall3" class="ball3">FACEBOOK</span>
<span id="layerPulse3" class="pulse3"></span>
</li>
</ul>
<ul id="social">
<li id="layerSocialControl3" class="facebook"><a href="#">Facebook</a></li>
<li id="layerSocialControl2" class="twitter"><a href="#">Twitter</a></li>
<li id="layerSocialControl" class="linked"><a href="#">ВКонтакте</a></li>
<li id="layerSocialControl1" class="forrst"><a href="#">Google+</a></li>
</ul>
</div>
<a id="trigger" href="#">Следуйте за мной!</a>
CSS
Первая часть css позволит понять, как все элементы расположены на сцене, и как применять анимацию. Обратите внимание на то, что некоторые строчки включают класс .running, который с помощью jQuery позволяет определять начало анимации при нажатии на кнопку.
/* CONTAINER IMAGE */
.ID-Image {
width:300px;
height:300px;
background:url(photoID.png) no-repeat;
margin:150px auto 0;
}
/* LINE FOLLOW */
#follow {
list-style:none;
position:relative;
top:140px;
left:140px;
z-index:-1;
}
.running .line1,.running .line2,.running .line3,.running .line4 {
background:#2187e7;
width:0px;
height:1px;
-moz-transform-origin: 0 0;
-webkit-transform-origin: 0 0;
}
.running .line1 { -moz-transform:rotate(17deg); -webkit-transform:rotate(17deg); -moz-animation:move 0.65s linear forwards; -webkit-animation:move 0.65s linear forwards;}
.running .line2 { -moz-transform:rotate(140deg); -webkit-transform:rotate(140deg); -moz-animation:move1 0.75s linear forwards; -webkit-animation:move1 0.75s linear forwards;}
.running .line3 { -moz-transform:rotate(235deg); -webkit-transform:rotate(235deg); -moz-animation:move2 0.9s linear forwards; -webkit-animation:move2 0.9s linear forwards;}
.running .line4 { -moz-transform:rotate(315deg); -webkit-transform:rotate(315deg); -moz-animation:move3 0.5s linear forwards; -webkit-animation:move3 0.5s linear forwards;}
/* POINTER */
.running .ball, .running .ball1, .running .ball2, .running .ball3 {
background-color:#2187e7;
background-image: -moz-linear-gradient(90deg, #2187e7 25%, #a0eaff);
background-image: -webkit-linear-gradient(90deg, #2187e7 25%, #a0eaff);
width:7px;
height:7px;
border-radius:50px;
position:absolute;
z-index:99;
-moz-transform:scale(0);
-moz-animation:point 0.1s linear forwards;
-webkit-transform:scale(0);
-webkit-animation:point 0.1s linear forwards;
}
/* SPECIAL FX*/
.running .pulse, .running .pulse1, .running .pulse2, .running .pulse3 {
width:12px;
height:12px;
border-radius:30px;
border: 1px solid #00c6ff;
box-shadow: 0 0 5px #00c6ff;
position:absolute;
-moz-transform:scale(0);
-moz-animation:pulse 0.6s ease-out;
-webkit-transform:scale(0);
-webkit-animation:pulse 0.6s ease-out;
}
/* COORDINATE POINTS BALL + SPECIAL FX */
span { position:absolute; text-indent:-9999px; }
.ball { left:295px; top:-3px; }
.ball1 { left:355px; top:-3px; }
.ball2 { left:200px; top:-3px; }
.ball3 { left:365px; top:-3px; }
.pulse { left:293px; top:-5px; }
.pulse1 { left:354px; top:-5px; }
.pulse2 { left:198px; top:-5px; }
.pulse3 { left:363px; top:-5px; }
/* DELAY CONTROL LAYER */
#layerBall, #layerPulse { -moz-animation-delay:0.6s; -webkit-animation-delay:0.6s; }
#layerBall1, #layerPulse1 { -moz-animation-delay:0.7s; -webkit-animation-delay:0.7s; }
#layerBall2, #layerPulse2 { -moz-animation-delay:0.8s; -webkit-animation-delay:0.8s; }
#layerBall3, #layerPulse3 { -moz-animation-delay:0.4s; -webkit-animation-delay:0.4s; }
/* FOLLOW ME LIST */
ul#social { list-style:none; }
ul#social li { position:relative; background: #000000;
background: -moz-linear-gradient(top, #161616 0%, #000000 100%);
background: -webkit-linear-gradient(top, #161616 0%,#000000 100%);
border-left:1px solid #111; border-top:1px solid #111; border-right:1px solid #333; border-bottom:1px solid #333;
width:70px;
font-family: Verdana, Geneva, sans-serif;
font-size: 0.8em;
text-decoration: none;
text-transform: uppercase;
text-align: center;
color: #fff;
padding: 5px;
border-radius: 3px;
width: 70px;
opacity:0;
}
ul#social li:hover {
background: -moz-linear-gradient(top, #202020 0%, #161616 100%);
background: -webkit-linear-gradient(top, #202020 0%, #161616 100%);
cursor:pointer;
}
ul#social a:hover {
color:#fff;
}
.running #layerSocialControl { -moz-animation:tooltip 0.35s 0.55s linear forwards; -webkit-animation:tooltip 0.35s 0.55s linear forwards; }
.running #layerSocialControl1 { -moz-animation:tooltip 0.35s 0.65s linear forwards; -webkit-animation:tooltip 0.35s 0.65s linear forwards; }
.running #layerSocialControl2 { -moz-animation:tooltip 0.35s 0.8s linear forwards; -webkit-animation:tooltip 0.35s 0.8s linear forwards; }
.running #layerSocialControl3 { -moz-animation:tooltip 0.35s 0.4s linear forwards; -webkit-animation:tooltip 0.35s 0.4s linear forwards; }
#social .facebook {top:-150px; left:406px; }
#social .twitter {top:-83px; left:28px; }
#social .linked {top:178px; left:432px; }
#social .forrst {top:297px; left:-130px; }
Тут используются различные анимации класса .running, ничего особенного, это простая анимация, которая может быть получена с помощью CSS3./* ANIMATION LINE */
@-moz-keyframes move {
0% { width:0px;}
100% { width:300px; box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5); }
}
@-moz-keyframes move1 {
0% { width:0px;}
100% { width:360px; box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5); }
}
@-moz-keyframes move2 {
0% { width:0px;}
100% { width:205px; box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5); }
}
@-moz-keyframes move3 {
0% { width:0px;}
100% { width:370px; box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5); }
}
@-webkit-keyframes move {
0% { width:0px;}
100% { width:300px; box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5); }
}
@-webkit-keyframes move1 {
0% { width:0px;}
100% { width:360px; box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5); }
}
@-webkit-keyframes move2 {
0% { width:0px;}
100% { width:205px; box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5); }
}
@-webkit-keyframes move3 {
0% { width:0px;}
100% { width:370px; box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5); }
}
/* ANIMATION BALL + SPECIAL FX */
@-moz-keyframes point {
0% {-moz-transform:scale(0,0);}
100%{-moz-transform:scale(1,1);}
}
@-moz-keyframes pulse {
0% {-moz-transform: scale(0);opacity: 0;}
10% {-moz-transform: scale(1);opacity: 0.5;}
50% {-moz-transform: scale(1.75);opacity: 0;}
100% {-moz-transform: scale(0);opacity: 0;}
}
@-webkit-keyframes point {
0% {-webkit-transform:scale(0,0);}
100%{-webkit-transform:scale(1,1);}
}
@-webkit-keyframes pulse {
0% {-webkit-transform: scale(0);opacity: 0;}
10% {-webkit-transform: scale(1);opacity: 0.5;}
50% {-webkit-transform: scale(1.75);opacity: 0;}
100% {-webkit-transform: scale(0);opacity: 0;}
}
/* ANIMATION LABEL */
@-moz-keyframes tooltip {
0% { -moz-transform:scale(0,0); opacity:0;}
50% { -moz-transform:scale(1.2,1.2); opacity:0.3; }
75% { -moz-transform:scale(0.9,0.9); opacity:0.7;}
100%{ -moz-transform:scale(1,1); opacity:1;}
}
@-webkit-keyframes tooltip {
0% { -webkit-transform:scale(0,0); opacity:0;}
50% { -webkit-transform:scale(1.2,1.2); opacity:0.3; }
75% { -webkit-transform:scale(0.9,0.9); opacity:0.7;}
100%{ -webkit-transform:scale(1,1); opacity:1;}
}
А вот самое интересное место в уроке. Как вы уже видели, то некоторые классы сопровождались классом .running, а сейчас эти классы сопровождаются классом .reverse. Для работы вы должны скопировать свойства, которые были активны в конце анимации ".running", чтобы пересоздать анимацию с инвертированными параметрами. Этот класс .reverse будет активироваться при повторном нажатии на кнопку.
/* REVERSE LINE PROPERTIES */
.reverse .line1,.reverse .line2,.reverse .line3,.reverse .line4 {
background:#2187e7;
width:0px;
height:1px;
box-shadow:0px 0px 5px 1px rgba(0,198,255,0.5);
-moz-transform-origin: 0 0;
-webkit-transform-origin: 0 0;
}
.reverse .line1 { -moz-transform:rotate(17deg); -webkit-transform:rotate(17deg); -moz-animation:moveReverse 0.65s linear forwards; -webkit-animation:moveReverse 0.65s linear forwards;}
.reverse .line2 { -moz-transform:rotate(140deg); -webkit-transform:rotate(140deg); -moz-animation:move1Reverse 0.75s linear forwards; -webkit-animation:move1Reverse 0.75s linear forwards;}
.reverse .line3 { -moz-transform:rotate(235deg); -webkit-transform:rotate(235deg); -moz-animation:move2Reverse 0.9s linear forwards; -webkit-animation:move2Reverse 0.9s linear forwards;}
.reverse .line4 { -moz-transform:rotate(315deg); -webkit-transform:rotate(315deg); -moz-animation:move3Reverse 0.5s linear forwards; -webkit-animation:move3Reverse 0.5s linear forwards;}
/* REVERSE POINT PROPERTIES */
.reverse .ball, .reverse .ball1, .reverse .ball2, .reverse .ball3 {
background-color:#2187e7;
background-image: -moz-linear-gradient(90deg, #2187e7 25%, #a0eaff);
background-image: -webkit-linear-gradient(90deg, #2187e7 25%, #a0eaff);
width:7px;
height:7px;
border-radius:50px;
position:absolute;
z-index:99;
-moz-transform:scale(1);
-moz-animation:pointReverse 0.1s linear forwards;
-webkit-transform:scale(1);
-webkit-animation:pointReverse 0.1s linear forwards;
}
/* DELAY CONTROL REVERSE */
.reverse #layerBall, .reverse #layerBall1, .reverse #layerBall2, .reverse #layerBall3 { -moz-animation-delay:0s; -webkit-animation-delay:0s; }
/* REVERSE LABEL PROPERTIES */
.reverse ul#social li { position:relative; background: #000000;
background: -moz-linear-gradient(top, #161616 0%, #000000 100%);
background: -webkit-linear-gradient(top, #161616 0%,#000000 100%);
border-left:1px solid #111; border-top:1px solid #111; border-right:1px solid #333; border-bottom:1px solid #333;
width:70px;
font-family: Verdana, Geneva, sans-serif;
font-size: 0.8em;
text-decoration: none;
text-transform: uppercase;
text-align: center;
color: #fff;
padding: 5px;
border-radius: 3px;
width: 70px;
opacity:1;
}
.reverse #layerSocialControl { -moz-animation:tooltipReverse 0.35s linear forwards; -webkit-animation:tooltipReverse 0.35s linear forwards; }
.reverse #layerSocialControl1 { -moz-animation:tooltipReverse 0.35s linear forwards; -webkit-animation:tooltipReverse 0.35s linear forwards; }
.reverse #layerSocialControl2 { -moz-animation:tooltipReverse 0.35s linear forwards; -webkit-animation:tooltipReverse 0.35s linear forwards; }
.reverse #layerSocialControl3 { -moz-animation:tooltipReverse 0.35s linear forwards; -webkit-animation:tooltipReverse 0.35s linear forwards; }
/* ANIMATION LINE REVERSE */
@-moz-keyframes moveReverse {
0% { width:300px;}
100% { width:0px; box-shadow:none; }
}
@-moz-keyframes move1Reverse {
0% { width:360px;}
100% { width:0px; box-shadow:none; }
}
@-moz-keyframes move2Reverse {
0% { width:205px;}
100% { width:0px; box-shadow:none; }
}
@-moz-keyframes move3Reverse {
0% { width:370px;}
100% { width:0px; box-shadow:none; }
}
@-webkit-keyframes moveReverse {
0% { width:300px;}
100% { width:0px; box-shadow:none; }
}
@-webkit-keyframes move1Reverse {
0% { width:360px;}
100% { width:0px; box-shadow:none; }
}
@-webkit-keyframes move2Reverse {
0% { width:205px;}
100% { width:0px; box-shadow:none; }
}
@-webkit-keyframes move3Reverse {
0% { width:370px;}
100% { width:0px; box-shadow:none; }
}
/* ANIMATION POINTS REVERSE */
@-moz-keyframes pointReverse {
0% {-moz-transform:scale(1,1);}
100%{-moz-transform:scale(0,0);}
}
@-webkit-keyframes pointReverse {
0% {-webkit-transform:scale(1,1);}
100%{-webkit-transform:scale(0,0);}
}
/* ANIMATION LABEL REVERSE */
@-moz-keyframes tooltipReverse {
0% { -moz-transform:scale(1,1); opacity:1;}
50% { -moz-transform:scale(0.9,0.9); opacity:0.7; }
75% { -moz-transform:scale(1.2,1.2); opacity:0.3;}
100%{ -moz-transform:scale(0,0); opacity:0;}
}
@-webkit-keyframes tooltipReverse {
0% { -webkit-transform:scale(1,1); opacity:1;}
50% { -webkit-transform:scale(0.9,0.9); opacity:0.7; }
75% { -webkit-transform:scale(1.2,1.2); opacity:0.3;}
100%{ -webkit-transform:scale(0,0); opacity:0;}
}
JS
Подключаем jQuery библиотеку:
<script type="text/jаvascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
Далее создаем новый скрипт, который очень простой и подключаем его. Тут у нас динамически изменяется текст с помощью метода .live, удаляется класс .reverse и активируется класс .running и возвращается все назад.$(document).ready(function() {
var content = $('.content');
$('#trigger').live('click', function() {
$(this).toggle(function() {
$(this).text('спрятать!');
content.removeClass('reverse').addClass('running');
}, function() {
$(this).text('следуйте за мной!');
content.removeClass('running').addClass('reverse');
}).trigger('click');
});
});
Ссылки