Search code examples
flipplaying-cards

Flipping specific cards onClick in a memory game


SO I am working on a memory game and I got the cards to flip nicely, but I whenever I click to flip one, it flips them all. I would rather use a methos that is not giving each and every card an ID if possible...please help.

HTML

    <section class="cardsContainer">
        <div class="card" onclick="flip()">
            <div class="front"><img src="../images/backsideBlue.png"></div>
            <div class="back"><img src="../images/cookie.JPG"></div>
        </div>
    </section>
    <section class="cardsContainer">
        <div class="card" onclick="flip()">
            <div class="front"><img src="../images/backsideBlue.png"></div>
            <div class="back"><img src="../images/cookie.JPG"></div>
        </div>
    </section>
    <section class="cardsContainer">
        <div class="card" onclick="flip()">
            <div class="front"><img src="../images/backsideBlue.png"></div>
            <div class="back"><img src="../images/cookie.JPG"></div>
        </div>
    </section>
    <section class="cardsContainer">
        <div class="card" onclick="flip()">
            <div class="front"><img src="../images/backsideBlue.png"></div>
            <div class="back"><img src="../images/cookie.JPG"></div>
        </div>
    </section>
    <section class="cardsContainer">
        <div class="card" onclick="flip()">
            <div class="front"><img src="../images/backsideBlue.png"></div>
            <div class="back"><img src="../images/cookie.JPG"></div>
        </div>
    </section>
</div>

CSS

.cardsContainer {
    width: 230px;
    height: 320px;
    position: relative;
    border: 1px dashed red;
    -webkit-perspective: 800px;
    -moz-perspective: 800px;
    -o-perspective: 800px;
    perspective: 800px;
    margin: 20px 10px 10px 10px;
    display: inline-block; } .card {
    width: 100%;
    height: 100%;
    position: absolute;
    -webkit-transition: -webkit-transform 1s;
    -moz-transition: -moz-transform 1s;
    -o-transition: -o-transform 1s;
    transition: transform 1s;
    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -o-transform-style: preserve-3d;
    transform-style: preserve-3d;
    -webkit-transform-origin: 50% 50%; } .card div {
    display: block;
    height: 100%;
    width: 100%;
    line-height: 260px;
    color: white;
    text-align: center;
    font-weight: bold;
    font-size: 140px;
    position: absolute;
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    -o-backface-visibility: hidden;
    backface-visibility: hidden; } .card .front { } .card .back {
    -webkit-transform: rotateY( 180deg );
    -moz-transform: rotateY( 180deg );
    -o-transform: rotateY( 180deg );
    transform: rotateY( 180deg ); } .card.flipped {
    -webkit-transform: rotateY( 180deg );
    -moz-transform: rotateY( 180deg );
    -o-transform: rotateY( 180deg );
    transform: rotateY( 180deg ); }

JS

function flip() {
    $('.card').toggleClass('flipped');
}

Solution

  • The function you show is not JavaScript, but JQuery. In JQuery, $('.card') means "all the elements with class 'card'". What you need to do is attach a single onclick() function to each of the card objects that only flips itself.

    Try changing the HTML to onclick="flip(this)", and the change the flip function to only change the element passed to it:

    function flip(e) { e.toggleClass('flipped'); }