Как повернуть карту с помощью css transform внутри игры с памятью

Я создаю игру на запоминание на Angular. Я прикрепил логику компонента, css и html ниже. Я пытаюсь перевернуть карты, но онлайн-методы не работают. Любые предложения о том, как это осуществить? Обратите внимание, что в структуре данных карты свойство isFlipped имеет значение false. Был бы признателен за любую помощь, спасибо.

// angular
import { Component } from "@angular/core";

// services
import { CardService } from "../app/services/cards.service";

@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  title: string = "the tech memory game";
  tagline: string = "Time to sharpen up those memory cells!";
  cards = [];
  total_cards_count: number = 3;
  prevCard = null;
  isProcessing: boolean = false;
  flippedCouplesCount: number = 0; 

  constructor(public cardService: CardService) {}
  ngOnInit() {
    this.cards = this.cardService.getCards();
    console.info(this.cards);
  }

  playGame(card, cardDiv) {
    if (this.isProcessing) return;
    // flip card
    card.isFlipped = !card.isFlipped;
    cardDiv.classList.add('flipped');
    // compare cards and check
    if (this.prevCard) {
      if (card.name === this.prevCard.name) {
        this.prevCard = null;
        this.flippedCouplesCount++; 
      } else {
        this.isProcessing = true;
        // if no match- flip cards in 1 sec
        setTimeout(() => {
          this.prevCard.isFlipped = false;
          card.isFlipped = false;
          this.isProcessing = false;
          this.prevCard = null;
        }, 1000);
      }
    } else {
      this.prevCard = card;
    }
    if (this.total_cards_count === this.flippedCouplesCount) {
      console.info('game over');
      
    }
  }
}
.container {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    /* width: 100%;  */
    /* transform: rotateY(180deg); */
}

.front {
    position: absolute;
}
<!--The content below is only a placeholder and can be replaced.-->
<section>
  <div style = "text-align:center">
    <h1>
      Welcome to {{ title }}!
    </h1>
    <h3>{{ tagline }}</h3>
    <!-- <img width = "300" alt = "Angular Logo" src = "> -->
  </div>

  <!-- game board -->
    <div class = "container">
      <div *ngFor = "let card of cards" #cardDiv (click) = "playGame(card, cardDiv)" class = "cardholder">
          <img src = "{{ card.img }}" class = "front" *ngIf = "card.isFlipped"/>
          <img src = "{{ card.cover }}" class = "back"/>
      </div>
    </div>
</section>

Можете ли вы создать Plunker? Чтобы увидеть реальное приложение и решить проблему.

Muhammet Can TONBUL 09.03.2018 16:04

Plunker не будет показывать какие-либо входящие данные, включая карты ... Но в основном у меня есть логика игры, и это всего лишь проблема css: как красиво переворачивать карты. Я осмотрелся и попробовал transform: rotateY (180deg) для некоторых классов, добавив backface-visibility: hidden для других. Кажется, ничего не работает.

Gordon 09.03.2018 16:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
514
2

Ответы 2

Попробуйте использовать [class.active] = "card.isFlipped" для добавления класса, если карта перевернулась. После того, как вы можете привязать анимацию CSS к этим дочерним узлам: https://github.com/daneden/animate.css/tree/master/source/flippers flipOutY и flipInY с задержкой в ​​половину времени анимации.

Кажется, не работает. У вас есть где-нибудь работающий пример этой штуки?

Gordon 09.03.2018 16:23

Вам понадобится комбинация анимации Angular и анимации css. Адаптируйте следующую демонстрацию к своим потребностям:

ДЕМО

Машинопись:

  ...
  animations: [
    trigger('flipCard', [
      state('true', style({
        transform: 'rotateY(180deg)'
      })),
      state('false', style({
        transform: 'rotateY(0)'
      })),
      transition('true => false', animate('800ms ease-out')),
      transition('false => true', animate('800ms ease-out'))
    ])
  ]


...

  flip(index) {
    this.cards[index].isFlipped = !this.cards[index].isFlipped;
  }

HTML

<div class = "container">
    <div *ngFor = "let card of cards; let i=index" #cardDiv class = "cardholder">
        <div class = "card" (click) = "flip(i)" [@flipCard] = "card.isFlipped">
            <div class = "card-title front">
                {{card.name}} Front
            </div>
            <div class = "card-title back">
                {{card.name}} Back
            </div>
        </div>
    </div>
</div>

CSS:

.container {
    display: flex;
    flex-direction: row;
    justify-content: space-around;
    margin-top: 200px;
    width: 100%;  
    /* transform: rotateY(180deg); */
}

.card-wrapper {
    perspective: 800px;
}

.card {
    border-radius: 8px;
    position: relative;
    height: 200px;
    width: 120px;
    transform-style: preserve-3d;
}

.card-title {
    backface-visibility: hidden;
    height: 100%;
    position: absolute;
    text-align: center;
    border-radius: 8px;
    color: white;
    user-select: none;
    cursor: pointer;
    line-height: 100px;
    font-size:30px;
}

.front {
    background-color: #255C85;
}

.back {
    background-color: #ED254E;
    transform: rotateY(180deg);
}

Это почти все, но не совсем. По какой-то причине обложка не отображается изначально, и при переворачивании я вижу вспышку карты, но затем она переворачивается на обложку ... очевидно, не желаемый эффект. Это репо, если вы хотите взглянуть: github.com/CharlesMarlow/Angular5--memory-game

Gordon 12.03.2018 10:54

Гордон, проверь демо еще раз. Если это по-прежнему не работает, не могли бы вы сделать демо?

Vega 20.04.2018 17:50

Другие вопросы по теме