Анимировать изображение для перемещения вправо в определенную позицию в Angular

#html #css #angular

#HTML #css #angular

Вопрос:

Я делаю веб-приложение в Angular 11. У нас есть изображение, представляющее собой таблицу с 4 столбцами и простым значком под ней. Мы хотели бы переместить значок вправо на основе значения (числа), которое я получаю от серверной части (HTTP-вызов).

Изображение (690×450):

H1 H2 H3 H4
1 2 3 4

Значок (26×48):

введите описание изображения здесь

HTTP-вызов возвращает число, равное 1, 2, 3 или 4, это номер столбца, в котором должен быть значок ниже.

Например, если серверная часть вернула число 3, результат должен быть:

введите описание изображения здесь

Мне нужно найти способ передать это число стилям, чтобы инициировать переход слева направо. Поскольку изображение имеет фиксированную ширину (690×450), мы можем разделить его на 4 и каким-то образом получить расстояние, которое нам нужно применить к переходу.

Компонент:

 @Component({
  templateUrl: './my.component.html',
  styleUrls: ['./my.component.scss']
})
export class MyComponent {

  number$: Observable<number> = this.service.fetchNumber();

  constructor(
    private service: CalculatorService,
  ) {
  }

}
 

Шаблон:

   <div class="row justify-content-center">
    <div class="col-auto">
      <div class="band-container">
        <table class="table table-borderless">
          <tbody>
          <tr>
            <td class="p-0">
              <img src="assets/imgs/table.png" width="590" height="350"/>
            </td>
          </tr>
          <tr *ngIf="(number$ | async) as number">
            <td class="p-0">
              <img id="slide" src="assets/icons/hand.png" />
            </td>
          </tr>
          </tbody>
        </table>
      </div>
    </div>
  </div>
 

Стили:

 .band-container {
  width: 590px;
}

    #slide {
      position: absolute;
      width: 100px;
      height: 100px;
      -webkit-animation: slide 0.5s forwards;
      -webkit-animation-delay: 0.5s;
      animation: slide 0.5s forwards;
      animation-delay: 2s;
    }
    
    @-webkit-keyframes slide {
      100% { left: 0; }
    }
    
    @keyframes slide {
      100% { left: 0; }
    }
 

Я пытался переместить значок, но я не знаю на 100%, как это сделать правильно, кроме того, я не уверен, как передать число, полученное из серверной части, в стили и применить правильный расчет.

Моя цель — переместить значок руки слева направо в определенную позицию (под столбцом) на основе числа (номера столбца), которое я получаю от серверной части.

Ответ №1:

Вы можете использовать переменные CSS.

 #slide {
  position: absolute;
  width: 100px;
  height: 100px;
  -webkit-animation: slide 0.5s forwards;
  -webkit-animation-delay: 0.5s;
  animation: slide 0.5s forwards;
  animation-delay: 2s;
}

@-webkit-keyframes slide {
  100% { var(--left); }
}

@keyframes slide {
  100% { var(--left); }
}
 

И передать его через HTML

  <div class="row justify-content-center">
    <div class="col-auto">
      <div class="band-container">
        <table class="table table-borderless">
          <tbody>
          <tr>
            <td class="p-0">
              <img src="assets/imgs/table.png" width="590" height="350"/>
            </td>
          </tr>
          <tr *ngIf="(number$ | async) as number">
            <td class="p-0">
              <img id="slide" style="--left: distance;" src="assets/icons/hand.png" />
            </td>
          </tr>
          </tbody>
        </table>
      </div>
    </div>
  </div>
 

Вот пример https://jsfiddle.net/204aubw6 /

Он не имеет полной поддержки для всех браузеров, но поскольку вы используете Angular 11, IE в любом случае не будет иметь значения https://caniuse.com/css-variables .

Комментарии:

1. Потрясающе, большое вам спасибо. Я запутался, когда увидел distance название, я не знал, должно ли оно быть с px ним или без него, но у меня это работает. Кроме того, я не знал этого трюка, чтобы передавать значение стилям в качестве переменной.