ポケモン図鑑を作ってみる[Visualforce]
概要

Visualforceでポケモン図鑑を作成します。
PokéAPIを使用しています。
ソースコード
PokemonPic.vfp
<apex:page docType="html-5.0" LightningStylesheets="true">
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ポケモン図鑑(初代)</title>
<link href="https://fonts.googleapis.com/css2?family=DotGothic16" rel="stylesheet"/>
<style type="text/css">
p {
font-family: 'DotGothic16', sans-serif;
}
.col_center {
max-width: 600px;
}
.pokemon-img {
width: 200px;
}
.box-size {
width: 400px;
height: 300px;
}
.slds-input.input-number {
width: 70px;
}
.slds-button.slds-button_brand {
vertical-align: initial;
}
</style>
<apex:slds />
</head>
<body>
<div class="slds-grid">
<div class="slds-col">
</div>
<div class="col_center slds-col">
<apex:pageBlock >
<div class="slds-grid slds-einstein-header slds-card__header">
<header class="slds-media slds-media_center slds-has-flexi-truncate">
<div class="slds-grid slds-grid_vertical-align-center slds-size_3-of-4 slds-medium-size_2-of-3">
<h1 class="slds-truncate" title="ポケモン図鑑(初代)">
<span class="slds-text-heading_large">ポケモン図鑑(初代)</span>
</h1>
</div>
<div class="slds-einstein-header__figure slds-size_1-of-4 slds-medium-size_1-of-3"></div>
</header>
</div>
<div class="slds-align_absolute-center">
<div class="slds-m-top_large">
<header class="slds-align_absolute-center">
<apex:form >
<span class="slds-text-heading_medium">図鑑番号:
<input type="number" class="slds-input input-number slds-p-right_none" min="1" max="151" value="1"/></span>
<button class="slds-button slds-button_brand slds-m-left_medium slds-text-heading_medium slds-p-around_xx-small">検索する</button>
</apex:form>
</header>
<main class="slds-m-top_large">
<section class="pokemon-container">
</section>
</main>
</div>
</div>
</apex:pageBlock>
</div>
<div class="slds-col">
</div>
</div>
<apex:include pageName="PokemonPicJs"/>
</body>
</html>
</apex:page>
PokemonPicJs.vfp
<apex:page >
<script>
const baseUrl = 'https://pokeapi.co/api/v2/pokemon/';
const speciesUrl = 'https://pokeapi.co/api/v2/pokemon-species/';
const searchInput = document.querySelector('.slds-input'),
searchButton = document.querySelector('.slds-button'),
container = document.querySelector('.pokemon-container');
let pokemon,
pokeSpecies;
// PokéAPIからポケモンの情報を取得する
function requestPokeInfo(number) {
fetch(baseUrl + number).then(response => response.json())
.then(data => {
pokemon = data;
return fetch(speciesUrl + number);
})
.then(response => response.json())
.then(data => {
pokeSpecies = data;
})
.catch(err => console.log(err));
}
// 取得したポケモンの情報を整理してHTML要素を設定する
function createCard () {
const pokeName = pokeSpecies.names.find((v) => v.language.name == "ja").name;
const pokeType = pokeSpecies.genera.find((v) => v.language.name == "ja");
let pokeNumber = ('000' + pokeSpecies.id).slice( -3 );
const flavorText = pokeSpecies.flavor_text_entries.filter(function(v) {
return (v.language.name == "ja") && (v.version.name == "x");
})
let card = `
<div class="slds-grid">
<div class="slds-col slds-size_2-of-5">
<img src="${pokemon.sprites.versions['generation-i']['red-blue'].front_default}" class="pokemon-img"/>
<p class="slds-text-heading_medium slds-align_absolute-center">No.${pokeNumber}</p>
</div>
<div class="slds-col slds-size_3-of-5">
<p class="slds-text-heading_medium slds-m-around_medium">${pokeName}</p>
<p class="slds-text-heading_medium slds-m-around_medium">${pokeType.genus}</p>
<p class="slds-text-heading_medium slds-m-around_medium">たかさ<span class="slds-m-left_large">${pokemon.height / 10}m</span></p>
<p class="slds-text-heading_medium slds-m-around_medium">おもさ<span class="slds-m-left_large">${pokemon.weight / 10}kg</span></p>
</div>
</div>
<hr class="slds-m-vertical_x-small">
<p class="slds-text-heading_medium slds-text-align_left">${flavorText[0]['flavor_text']}</p>`;
return card;
}
function startApp(pokeNumber) {
// PokéAPIからポケモン情報を取得する
requestPokeInfo(pokeNumber);
// 取得したポケモンの情報を整理して要素を追加する
setTimeout(function () {
container.innerHTML = createCard();
container.classList.add('slds-box');
container.classList.add('slds-m-bottom_medium');
container.classList.add('box-size');
}, 1000);
}
searchButton.addEventListener('click', event => {
event.preventDefault();
let pokeNumber = searchInput.value; // 図鑑番号
startApp(pokeNumber);
})
</script>
</apex:page>
