CSSとjQueryでアニメーション付きのYoutube再生ボタンを作る
Youtubeの再生ボタンはSVGでできていて、非常に滑らかにアニメーションします。これをCSSだけで作ったので紹介したいと思います。jQueryもほんの少しだけ使っていますが、クラスを付けたり消したりするためだけに使いました。
デモ
クリックすると再生ボタンの形になります。
HTML/CSS
.youtube-play {
position: relative;
margin: 0 auto;
width: 40px;
height: 48px;
cursor: pointer;
}
.youtube-play:before, .youtube-play:after {
position: absolute;
top: 50%;
width: 0;
height: 100%;
content: '';
border-top: 0 solid transparent;
border-bottom: 0 solid transparent;
border-left: 14px solid #fff;
transform: translate3d(0, -50%, 0);
}
.youtube-play:before {
left: 0;
-webkit-transition: 0.18s linear;
-moz-transition: 0.18s linear;
-o-transition: 0.18s linear;
transition: 0.18s linear;
}
.youtube-play:after {
right: 0;
-webkit-transition: 0.18s ease;
-moz-transition: 0.18s ease;
-o-transition: 0.18s ease;
transition: 0.18s ease;
}
.youtube-play.active:before, .youtube-play.active:after {
border-top-width: 12px;
border-left-width: 20px;
border-bottom-width: 12px;
}
.youtube-play.active:after {
height: 0;
-webkit-transition: 0.2s linear;
-moz-transition: 0.2s linear;
-o-transition: 0.2s linear;
transition: 0.2s linear;
}
擬似要素の :before :after がそれぞれ左、右部分に対応しています。transition の秒数をもう少し変えたほうがいいかもしれません。
jQuery
$('.youtube-play').on('click', function(){
$(this).toggleClass('active');
});
SCSS
@mixin transition($speed: .29s, $type: ease) {
-webkit-transition: $speed $type;
-moz-transition: $speed $type;
-o-transition: $speed $type;
transition: $speed $type;
}
@mixin translate3d($x: 0, $y: 0, $z: 0) {
-webkit-transform: translate3d($x, $y, $z);
-moz-transform: translate3d($x, $y, $z);
-ms-transform: translate3d($x, $y, $z);
transform: translate3d($x, $y, $z);
}
.youtube-play {
$width: 40px; // ボタンの横幅
$height: 48px; // ボタンの縦幅
$pause-border: 14px; // 停止ボタンの線の横幅
position: relative;
width: $width;
height: $height;
cursor: pointer;
&:before, &:after {
position: absolute;
top: 50%;
width: 0;
height: 100%;
content: '';
border-top: 0 solid transparent;
border-bottom: 0 solid transparent;
border-left: $pause-border solid #fff;
@include translate3d(0, -50%, 0);
}
&:before {
left: 0;
@include transition(0.18s, linear);
}
&:after {
right: 0;
@include transition(0.18s, ease);
}
&.active {
&:before, &:after {
border-top-width: $height / 4;
border-left-width: $width / 2;
border-bottom-width: $height/ 4;
}
&:after {
height: 0;
@include transition(0.2s, linear);
}
}
}
SCSSを使えば、自動的に計算されるので、簡単にサイズ変更が可能です。15, 16, 17行目の変数の値を設定するだけであとは自動的に計算されます。