ポケモン図鑑を作ってみる[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>