JSFiddle - React, Tailwind, and code Playground
by interlife
HTML
<div id="wrap">
<div class="stage">
<div class="dice">
<div class="item">1</div>
<div class="item -main">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
</div>
</div>
<div class="button_wrap">
<button class="js-dice">サイコロを振る</button>
</div>
<p class="leftovers-caption">【残りの値】</p>
<div id="leftovers"></div>
</div>
SCSS
/* サイコロ本体 */
.dice {
display:block;
position:relative;
margin:0 auto;
width:100px;
height:100px;
transform-style:preserve-3d;
}
/* 目 */
.dice .item {
border-radius: 3px;
position:absolute;
left:0;
right:0;
display:flex;
flex-direction:row;
align-items:center;
justify-content:center;
box-sizing:border-box;
border:1px solid #333;
width:100px;
height:100px;
background-color:rgba(#005bac, 0.7);
font-size:2rem;
text-align:center;
color:#fff;
&:nth-child(1) {
transform:translate3d(0, -50px, 0) rotateX(-90deg);
}
//rotateがないのが正面
&:nth-child(2) {
transform:translate3d(0, 0, 50px);
}
&:nth-child(3) {
transform:translate3d(50px, 0, 0) rotateY(90deg);
}
&:nth-child(4) {
transform:translate3d(-50px, 0, 0) rotateY(-90deg);
}
&:nth-child(5) {
transform:translate3d(0, 0, -50px) rotateY(180deg);
}
&:nth-child(6) {
transform:translate3d(0, 50px, 0) rotateX(-90deg);
}
}
//回転アニメーション:遠近
@keyframes rotate-animation {
0% { transform:rotate3d(0); }
100% { transform:rotate3d(0.5,0.75,0.5, 360deg); }
}
@keyframes rotate-animation1 {
0% { transform:rotate3d(0); }
100% { transform:rotate3d(1,0,1, -360deg); }
}
@keyframes rotate-animation2 {
0% { transform:rotate3d(0); }
100% { transform:rotate3d(0,1,1, -360deg); }
}
//ストップモーションアニメーション
@keyframes stopmotion {
0% { transform:scale(0.5); }
50% { transform:scale(1.2); }
100% { transform:scale(1); }
}
//その他
#wrap {
padding: 0 0 80px;
}
.stage {
margin: 60px auto;
perspective: 300px;
transition: transform 0s;
.dice {
animation:rotate-animation 10s linear infinite;
//サイコロを斜めに
//transform:rotateX(-25deg) rotateY(-45deg);
}
//アニメ中style
&.animation {
transition: transform .3s;
transform: scale(0.5);
.dice {
transform: none;
animation:rotate-animation1 .3s linear infinite;
}
&.plus .dice{
animation:rotate-animation2 .3s linear infinite;
}
}
//結果画面
&.stop...
JavaScript
//settimeout用変数
var timerId;
//結果用配列
var resultArray = [
"佐藤",
"鈴木",
"田中",
"渡辺",
"山本",
"★"
]
//HTMLに配列の値を追加
for (var key in resultArray) {
var num = parseInt(key) + 1;
$('.dice .item:nth-child('+num+')').text(resultArray[key]);
}
//配列の値を指定のIDにテキストとして追加
$('#leftovers').text(JSON.stringify(resultArray));
//配列の値の数を取得
//オブジェクト(連想配列)の時の撮り方 → var res = Object.keys(resultArray).length;
var res = resultArray.length;
$('.js-dice').on('click',function(){
//配列の残りの数が0以上なら実行
if(res > 0) {
//アニメーション中にボタンが押されたら
if($(this).hasClass('start')) {
//class="animation"を除去してclass="stop"を追加
$('.stage').removeClass('animation').addClass('stop');
//ボタンからもclass="start"を除去して、テキスト変更
$(this).removeClass('start').text('サイコロを振る');
//setIntervalを解除
window.clearInterval(timerId);
//サイコロの目のテキストを変更
let saikoro = Math.floor( Math.random() * res) +1;
$('.-main').text(resultArray[saikoro - 1]);
//サイコロででた値を配列から削除
res = res - 1;
resultArray.splice( saikoro - 1, 1 );
//値の減った配列の値をテキストにして出力
$('#leftovers').text(JSON.stringify(resultArray));
//配列に何も残ってなかったらボタンのテキストを変更
if(res == 0) {
$(this).removeClass('start').text('本日の抽選は以上です');
}
//アニメが停止中にボタンが押されたら
} else {
//class="stop"を除去してclass="animation"を追加
$('.stage').addClass('animation').removeClass('stop');
//ボタンにclass="start"を追加して、テキスト変更
$(this).addClass('start').text('とめる');
//サイコロの動きに変化をつけるようsetIntervalでclassを付け替え
timerId = setInterval(function() {
$('.stage').toggleClass('plus');
}, 500);
}
}
});