【Angular】画像選択画面を作ろう!

ANGULAR

みなさんこんにちは、現役エンジニアのサメハックです

未経験からWebエンジニアに転職し、
正社員として5年働いたのちフリーランスとして独立しました。

Angularの解説シリーズです。

今回は画像選択画面を作る方法について学んでいきましょう!

駆け出しエンジニアや未経験の方、
また新入社員を指導する先輩社員にとっても
わかりやすいように解説していきます!

この記事を読むと・・・
  • 画像選択画面が作成できる!

※PCにnpm、nodeがインストールされている前提で記述します。
 yarn等をお使いの方は読み替えてください。

環境がない人はcodesansbox等を使ってね!

作りたいもの

これが今回の完成形だよ!

実行環境

Angularのバージョンが古いと動かないことがあるよ!
うまく動かなければアップデートしてね!

画像選択画面を作ろう!

画像選択画面をつくるには

  • 画像をループ表示
  • 画像のidにindex(何番目の画像か)を割り振る
  • 画像クリックで選択中のindexを保管
  • index番目の配列を保管
  • 画像のindexと選択中のindexが一致する場合、専用のCSSを適用

という処理を作る必要があります。

1つ1つは単純な処理だよ!

実際に作ってみよう!

初期設定

ng new my-app
cd my-app
ng serve -o

app.component.html

<section>
  <div class="container">
    <!-- ユーザ数分繰り返し表示 -->
    <!-- ポイントはidにindexを設定すること -->
    <!-- "selectedItem == index"を満たす場合のみselectedというクラス名が付与される -->
    <div
      *ngFor="let user of users; let index = index"
      class="image-wrap"
      id="index"
      [class.selected]="selectedItem == index"
      (click)="onSelectItem(index)"
    >
      <!-- 画像のパスを設定  -->
      <!-- ※srcを単方向データバインディングすること -->
      <img [src]="user.path" />
    </div>
  </div>
</section>

<section>
  <h2>選択したユーザー</h2>
  <!-- ユーザが選択されたら表示される -->
  <div *ngIf="selectedUser">
    <p>I D :{{ selectedUser.id }}</p>
    <p>名前:{{ selectedUser.name }}</p>
    <p>年齢:{{ selectedUser.age }}</p>
  </div>
</section>

ポイントはコメントに書いているよ!

app.component.ts

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
})
export class AppComponent {
  // ユーザの配列
  // ※画像は必ずassetsに格納すること
  users = [
    {
      name: 'サメハック',
      age: 30,
      id: 0,
      path: '../assets/images/samehack.png',
    },
    { name: 'ねこハック', age: 31, id: 1, path: '../assets/images/neko.png' },
    { name: 'いぬハック', age: 40, id: 2, path: '../assets/images/inu.png' },
    { name: 'ぶたハック', age: 23, id: 3, path: '../assets/images/buta.png' },
  ];

  /**
   * 選択された画像のindexが入る
   * 赤枠で囲うCSSを適用するために使用
   */
  selectedItem: number | null;
  /**選択されたユーザ */
  selectedUser: any;

  /**画像クリックで動く */
  onSelectItem(index: number) {
    // 同じ画像をクリックすると、選択中表示を外す
    if (this.selectedItem === index) {
      this.selectedItem = null;
      this.selectedUser = null;
      return;
    }

    // 選択中の画像を更新
    this.selectedItem = index;
    this.selectedUser = this.users[index];
  }
}
画像は必ずassetsに格納してね!

app.component.scss

.container {
  // 画像を横に並べる
  display: flex;
  // ディスプレイ幅に応じて折り返す
  flex-wrap: wrap;
  .image-wrap {
    // 画像サイズ等の設定
    width: 200px;
    height: 200px;
    background-color: lightgoldenrodyellow;
    margin: 10px 10px 0 0;
    img {
      height: 100%;
      width: 100%;
    }
    // 選択された画像のみに適用するCSS
    &.selected {
      border: solid 5px red;
      width: 195px;
      height: 195px;
    }
  }
}
選択中の画像にはselectedクラスが適用されるよ!

GitHubのサンプルコード

今回作ったものはGitHubにあげているので
うまく動作しなかった方は是非ダウンロードしてみてください。

GitHub - same-hack/Angular-image-click
Contribute to same-hack/Angular-image-click development by creating an account on GitHub.

まとめ

  • 画像をループ表示
  • 画像のidにindex(何番目の画像か)を割り振る
  • 画像クリックで選択中のindexを保管
  • index番目の配列を保管
  • 画像のindexと選択中のindexが一致する場合、専用のCSSを適用

満足いただけたら、1クリックなのでSNSフォローしてもらえると嬉しいです🦈

タイトルとURLをコピーしました