CSSとJSで作るコンテンツを回転させるチュートリアル Flipping Card Tutorial

スクリーンショット 2015-01-10 23.59.27

Flipping Card TutorialはCSSとJavascriptでコンテンツを回転させる動きを実装できるチュートリアルです。

マウスホバーで回転、クリックで回転、ランダムで回転の3つのタイプがあります。

デモ

デモページを用意しました。

実装方法

共通CSSの準備

共通で使用するcssを準備します。

.card {
  position: relative;
  float:left;
  padding-bottom: 25%;
  width: 25%;
  text-align: center;
}
.card__front,
.card__back {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
.card__front,
.card__back {
  -webkit-backface-visibility: hidden;
          backface-visibility: hidden;
  -webkit-transition: -webkit-transform 0.3s;
          transition: transform 0.3s;
}
.card__front {
  background-color: #ff5078;
}
.card__back {
  background-color: #1e1e1e;
  -webkit-transform: rotateY(-180deg);
          transform: rotateY(-180deg);
}
.card__text {
	display: inline-block;
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	margin: auto;
	height: 20px;
	color: #fff;
	font-family: "Roboto Slab", serif;
	line-height: 20px;
}

マウスホバーで回転

マウスホバーで回転するパターンです。cssだけで実装できます。

↓html

<div class="card effect__hover">
 <div class="card__front">
 <span class="card__text">front</span>
 </div>
 <div class="card__back">
 <span class="card__text">back</span>
 </div>
</div><!-- /card -->

↓css

.card.effect__hover:hover .card__front {
  -webkit-transform: rotateY(-180deg);
          transform: rotateY(-180deg);
}
.card.effect__hover:hover .card__back {
  -webkit-transform: rotateY(0);
          transform: rotateY(0);
}

クリックで回転

クリックで回転するパターンです。cssとjsで実装できます。

↓html

<div class="card effect__click">
 <div class="card__front">
 <span class="card__text">front</span>
 </div>
 <div class="card__back">
 <span class="card__text">back</span>
 </div>
</div><!-- /card -->

↓css

.card.effect__click.flipped .card__front {
  -webkit-transform: rotateY(-180deg);
          transform: rotateY(-180deg);
}
.card.effect__click.flipped .card__back {
  -webkit-transform: rotateY(0);
          transform: rotateY(0);
}

↓js

$(function() {
  var cards = document.querySelectorAll(&quot;.card.effect__click&quot;);
  for ( var i  = 0, len = cards.length; i &lt; len; i++ ) {
    var card = cards[i];
    clickListener( card );
  }
  function clickListener(card) {
    card.addEventListener( &quot;click&quot;, function() {
      var c = this.classList;
      c.contains(&quot;flipped&quot;) === true ? c.remove(&quot;flipped&quot;) : c.add(&quot;flipped&quot;);
    });
  }
});

ランダムで回転

ランダムで回転するパターンです。

↓html data-id=”1″の部分を連番にします。

<div class="card effect__random" data-id="1">
 <div class="card__front">
 <span class="card__text">front</span>
 </div>
 <div class="card__back">
 <span class="card__text">back</span>
 </div>
</div><!-- /card -->
<div class="card effect__random" data-id="2">
 <div class="card__front">
 <span class="card__text">front</span>
 </div>
 <div class="card__back">
 <span class="card__text">back</span>
 </div>
</div><!-- /card -->

↓css

.card.effect__random.flipped .card__front {
  -webkit-transform: rotateY(-180deg);
          transform: rotateY(-180deg);
}

.card.effect__random.flipped .card__back {
  -webkit-transform: rotateY(0);
          transform: rotateY(0);
}

↓js

$(function() {
  // cache vars
  var cards = document.querySelectorAll(&quot;.card.effect__random&quot;);
  var timeMin = 1;
  var timeMax = 3;
  var timeouts = [];

  // loop through cards
  for ( var i = 0, len = cards.length; i &lt; len; i++ ) {
    var card = cards[i];
    var cardID = card.getAttribute(&quot;data-id&quot;);
    var id = &quot;timeoutID&quot; + cardID;
    var time = randomNum( timeMin, timeMax ) * 1000;
    cardsTimeout( id, time, card );
  }

  // timeout listener
  function cardsTimeout( id, time, card ) {
    if (id in timeouts) {
      clearTimeout(timeouts[id]);
    }
    timeouts[id] = setTimeout( function() {
      var c = card.classList;
      var newTime = randomNum( timeMin, timeMax ) * 1000;
      c.contains(&quot;flipped&quot;) === true ? c.remove(&quot;flipped&quot;) : c.add(&quot;flipped&quot;);
      cardsTimeout( id, newTime, card );
    }, time );
  }

  // random number generator given min and max
  function randomNum( min, max ) {
    return Math.random() * (max - min) + min;
  }
});