みなさんこんにちは、現役エンジニアのサメハックです
未経験から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フォローしてもらえると嬉しいです🦈