Nano Hash - криптовалюты, майнинг, программирование

Анимация пользовательской кнопки Ionic срабатывает на всех кнопках

Я пытаюсь реализовать анимированную избранную кнопку в приложении Ionic, и у меня есть несколько проблем.

Кнопка работает, как и ожидалось, при нажатии, но она также запускает любую другую кнопку для воспроизведения анимации. Анимация также воспроизводится на всех кнопках каждый раз при загрузке страницы. Я подозреваю, что мой оператор ngClass для добавления активного класса каким-то образом запускается, когда страница загружает сообщения и снова, когда данные обновляются из наблюдаемого при добавлении избранного.

<ion-button class="favourite" fill="clear" size="small" (click)="toggleFavourite( post, user.userId )">
   <ion-icon [ngClass]="{'active': post.favourites && post.favourites[user.userId] ? true : false}" class="heart"></ion-icon>
</ion-button>

CSS:

.heart {
    width: 100px;
    height: 100px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%) scale(0.9);
    background: url('/assets/images/heart.png') no-repeat;
    background-position: 0 0;
    cursor: pointer;
    animation: fave-heart 1s steps(28);
}

.heart.active {
    background-position: -2800px 0;
    transition: background 1s steps(28);
}

@keyframes fave-heart {
    0% {
        background-position: 0 0;
    }
    100% {
        background-position: -2800px 0;
    }
}

Я провел еще несколько тестов и обнаружил, что анимация кнопки запускается каждый раз, когда я обновляю переменную сообщений. Сообщения возвращаются как наблюдаемые, поэтому они обновляются всякий раз, когда загружается страница, а также когда пользователь добавляет сообщение в избранное, чтобы я мог обновить кнопку. Однако я добавил кнопку, которая вызывает функцию getPosts() (ниже), а также запускает анимацию при каждом нажатии.


<ion-button (click)="getPosts(limit)">click</ion-button>

getPosts(limit){
    return new Promise((resolve) => {
      this.postsService.getPosts(limit).subscribe(data => {
        this.posts = data.reverse()
        let key = data[data.length - 1].$key;
        if (this.lastId === key){
          this.hasMoreData = false;
        }
        resolve(data);
      });
    });
  }

  • может быть, потому что вы не помещаете анимацию в .active в своем css? 26.08.2020
  • Кажется, это работает, просто анимация происходит на каждой кнопке. Нажатая кнопка завершает анимацию и заканчивается сплошным сердцем, как и ожидалось. Остальные кнопки анимируются, а затем возвращаются к контуру сердца. 26.08.2020
  • вместо этого вы можете использовать .heart:active. JavaScript не требуется 27.08.2020
  • Я не могу использовать :active, так как мне нужно изменить класс, чтобы при загрузке сообщений я мог изменить состояние кнопки в зависимости от того, было ли оно добавлено в избранное или нет. 27.08.2020

Ответы:


1

Я провел еще несколько исследований и нашел гораздо лучший способ сделать это. Этот способ использует анимацию Ionic 5, поэтому я могу настроить таргетинг на идентификатор элемента, который был нажат, чтобы воспроизвести анимацию, когда я выберу.

&.heart {
   width: 100px;
   height: 100px;
   position: absolute;
   transform: scale(0.9);
   background: url('/assets/images/heart.png') no-repeat;
   background-position: 0 0;
   cursor: pointer;
}
&.heart.active {
   background-position: -2800px 0;
}
<ion-col *ngFor="let post of postList ; let i = index;">
   <ion-button (click)="toggleFavourite( post, user.userId, '#favourite' + i )">
      <ion-icon [id]="'favourite'+i" class="heart" color="pink" [ngClass]="{'active': post.favourites && post.favourites[user.userId] ? true : false}"></ion-icon>
   </ion-button>
</ion-col>
import { AnimationController } from '@ionic/angular';

constructor(private animationCtrl: AnimationController){ }

animateForward(elementId){
    const animation = this.animationCtrl
      .create()
      .addElement(document.querySelector(elementId))
      .duration(1000)
      .iterations(1)
      .easing( 'steps(28, end)')
      .keyframes([
        { offset: 0, backgroundPosition: '0 0' },
        { offset: 1, backgroundPosition: '-2800px 0' }
      ])

    animation.play()
  }

  animateBack(elementId){
    const animation = this.animationCtrl
      .create()
      .addElement(document.querySelector(elementId))
      .duration(300)
      .iterations(1)
      .easing( 'steps(28, end)')
      .keyframes([
        { offset: 0, transform: 'scale(0.9)' },
        { offset: 0.7, transform: 'scale(1)' },
        { offset: 1, transform: 'scale(0.9)' }
      ])

    animation.play()
  }
02.09.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..