jQuery addClass example
Change class name on click in jQuery
HTML
<ul>
<!-- ここにカード要素が挿入される -->
</ul>
CSS
ul {
padding: 0;
overflow: hidden;
border: 10px #CCC solid;
}
li {
list-style: none;
float: left;
width: 25%;
background-color: #EEE;
border-top: 2px #CCC solid;
border-right: 2px #CCC solid;
font-size: 20px;
font-weight: bold;
line-height: 75px;
text-align: center;
cursor: pointer;
box-sizing: border-box;
}
li:nth-child(-n + 4) {
border-top: none;
}
li:nth-child(4n) {
border-right: none;
}
li.opened {
color: #EEE;
background-color: #000;
}
JavaScript
$(function () {
// コンテナ要素を取得
var $container = $('ul')
// 開いたカード要素を保存しておく配列
var openedCardElements = []
// カード番号の最大値
// カードの枚数はこの変数の2倍となる
var total = 8
// シャッフルしたカード番号の配列を生成する
function createShuffledNumbers (total) {
var numbers = []
for (var i = 1; i <= total; i++) {
numbers.push(i, i)
}
return numbers.sort(function () {
return Math.random() - Math.random()
})
}
// カード番号を受け取り、対応するカード要素を生成する
function createCardElement (number) {
var $card = $('<li>') // li要素を生成
.data('number', number) // data属性を設定
.text('?') // テキストを設定
.on('click', function () { // イベントリスナーを設定
// すでに開かれている場合は何もせずに終了
if ($card.hasClass('opened')) {
return
}
// すでに2枚のカードが開かれている場合は何もせず終了
// 一度に3枚目が開かれることを防止する
if (openedCardElements.length === 2) {
return
}
// この時点で、1枚目または2枚目のカードが開かれたことになる
$card
.addClass('opened') // CSSクラスの設定
.text($card.data('number')) // カード番号の表示(data属性を取得して、テキストとして設定)
if (openedCardElements.length) { // クリックしたカードが2枚目である場合
openedCardElements.push($card) // クリックしたカードに追加する
var isSameNuber = compareCards()
if (isSameNuber) { // 2枚のカードの番号が同じの場合
// クリックを受け付けないように、イベントリスナーを解除する
openedCardElements.forEach(function (openedCardElement) {
openedCardElement.off('click')
})
// 開かれたカードをリセットする
openedCardElements = []
// すべてのカードが開かれた場合はアラートを表示する
if (areAllCardsOpened()) {
// 最後のカードが開かれてからアラートを表示するため、
// alertの表示を遅延させる
setTimeout(function () {
alert('Congratulations!')
}, 0)
}
} else { // 2枚のカードの番号が違う場合
setTimeout(function () { // 2枚のカードを1秒間表示して
// カード番号を隠す
openedCardElements.forEach(function (openedCardElement)...