Mayuka-Kawaguchi
@Mayuka-Kawaguchi

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

値に応じた、ゲージ内データの表示ができません。

解決したいこと

JavaScript初心者です。
下記画像のゲージの表示を "data-value" に応じて赤色でアニメーション付きで塗られるようにしたいのですが、表示がされません。

CSSは念の為、記載しております。

例)
スクリーンショット 2024-01-02 18.37.27.png

HTML部

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Animated Bar Graphs</title>
</head>

<body>
    <div class="graph-row">
        <div class="graph-container" data-value="30">
            <span>Skill1</span>
            <div class="bar">
                <div class="outer">
                    <div class="inner"></div>
                </div>
            </div>
        </div>

        <div class="graph-container" data-value="60">
            <span>Skill2</span>
            <div class="bar">
                <div class="outer">
                    <div class="inner"></div>
                </div>
            </div>
        </div>

        <div class="graph-container" data-value="80">
            <span>Skill3</span>
            <div class="bar">
                <div class="outer">
                    <div class="inner"></div>
                </div>
            </div>
        </div>
    </div>

    <div class="graph-row">
        <div class="graph-container" data-value="40">
            <span>Skill4</span>
            <div class="bar">
                <div class="outer">
                    <div class="inner"></div>
                </div>
            </div>
        </div>

        <div class="graph-container" data-value="70">
            <span>Skill5</span>
            <div class="bar">
                <div class="outer">
                    <div class="inner"></div>
                </div>
            </div>
        </div>

        <div class="graph-container" data-value="50">
            <span>Skill6</span>
            <div class="bar">
                <div class="outer">
                    <div class="inner"></div>
                </div>
            </div>
        </div>
    </div>
</body>

JavaScript部

        document.addEventListener("DOMContentLoaded", function () {
            const bars = document.querySelectorAll('.bar .inner');
            let animationStarted = false;

            // 0.5秒後にアニメーション開始
            setTimeout(() => {
                // スクロールイベントのリスナーを追加
                window.addEventListener('scroll', () => {
                    // ゲージの位置(例として10px)までスクロールされたらアニメーションを開始
                    if (window.scrollY > 10 && !animationStarted) {
                        bars.forEach((bar, index) => {
                            const value = bar.parentElement.getAttribute('data-value');
                            setTimeout(() => {
                                bar.style.width = `${value}%`; // 各要素ごとに設定
                                animationStarted = true;
                            }, index * 500); // 各要素を0.5秒ごとにアニメーション
                        });
                    }
                });
            }, 500);
        });

CSS部

        body {
            font-family: Arial, sans-serif;
            display: flex;
            flex-direction: column;
            align-items: center;
            padding: 20px;
            margin-bottom: 600px;
        }

        .graph-row {
            display: flex;
            justify-content: space-between;
            width: 80%;
            margin-bottom: 20px;
        }

        .graph-container {
            width: 250px;
            margin: 10px;
            position: relative;
        }

        .bar {
            position: relative;
            height: 30px;
            margin-bottom: 5px;
            border-radius: 10px; /* 角丸 */
            overflow: hidden;
            border: 2px solid #000; /* 黒い枠 */
        }

        .bar .outer {
            height: 100%;
            background-color: #eee; /* ゲージの背景色 */
        }

        .bar .inner {
            height: 100%;
            background-color: #e74c3c; /* 赤い色 */
            transition: width 1s ease-in-out;
            width: 0; /* 初期状態でゲージを非表示にするための設定 */
        }

        .bar span {
            display: block;
            height: 100%;
            color: #fff;
            text-align: center;
            line-height: 30px;
            position: absolute;
            top: 0;
            left: 0;
            padding: 0 5px;
            width: 100%;
        }

解決方法

JavaScript内の

const value = bar.parentElement.getAttribute('data-value');

const value = bar.closest('.graph-container').getAttribute('data-value');

に変更することで解決できました!

0

1Answer

ブラウザの開発者ツールを使ってデバッグしましたか? やってなければ、まずそれをやって、どこに問題があるか絞り込むようにしてください。今すぐそういうことができるのは質問者さんだけなのですから。コードの丸投げしてデバッグしてくださいというのは無しでお願いします。

0Like

Comments

  1. ご指摘いただきありがとうございます。

    開発経験が浅く、デバックのやり方を調べていたため返信が遅れてしまいました。

    JavaScript部コード内
    const value = bar.parentElement.getAttribute('data-value');
    の部分で value=null となってしまっていることがわかりました。

    このような場合は、どのように解決すれば良いのかを教えていただきことはできますでしょうか。

  2. 解決できました!
    ありがとうございました

Your answer might help someone💌