当前位置: 首页 > news >正文

【加密社】做一个展示币种价格的组件

具体的代码是以下,可以看到

<div id="crypto-price-widget">
    <p class="loading">Loading cryptocurrency prices... <span class="spinner"></span></p>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    const apiUrl = '/proxy.php'; // 指向你的proxy脚本
    const container = document.getElementById('crypto-price-widget');

    if (!container) {
        console.error('Element with ID "crypto-price-widget" not found.');
        return;
    }

    // 定义币种图标映射表
    const iconMap = {
        'btc': 'https://bqbot.cn/wp-content/themes/onenav/images/BZ/BTC.svg',
        'eth': 'https://bqbot.cn/wp-content/themes/onenav/images/BZ/ETH.svg',
        'doge': 'https://bqbot.cn/wp-content/themes/onenav/images/BZ/DOGE.svg',
        'bnb': 'https://bqbot.cn/wp-content/themes/onenav/images/BZ/BNB.svg',
        'sol': 'https://bqbot.cn/wp-content/themes/onenav/images/BZ/SOL.svg',
    };

    // 定义币种排序优先级
    const priorityOrder = ['btc', 'eth', 'sol', 'bnb', 'doge'];

    // 定义更新价格的函数
    function updatePrices() {
        fetch(apiUrl)
            .then(response => {
                if (!response.ok) {
                    throw new Error(`HTTP error! Status: ${response.status}`);
                }
                return response.json();
            })
            .then(data => {
                if (data.code === 0 && data.data) {
                    // 去掉 USDT 后缀,并按优先级排序
                    const sortedData = data.data
                        .map(item => {
                            const symbol = item.symbol.toLowerCase().replace('usdt', '');
                            return { ...item, symbol };
                        })
                        .sort((a, b) => {
                            const aPriority = priorityOrder.indexOf(a.symbol.toLowerCase());
                            const bPriority = priorityOrder.indexOf(b.symbol.toLowerCase());
                            return aPriority - bPriority;
                        });

                    let html = '<ul>';
                    sortedData.forEach(item => {
                        const price = parseFloat(item.price).toFixed(2);
                        const rate = (parseFloat(item.rate_24h) * 100).toFixed(2);
                        const trendClass = item.is_up ? 'up' : 'down';
                        const trendSymbol = item.is_up ? '↑ 涨' : '↓ 跌'; // 方向符号

                        // 获取币种图标 URL
                        const iconUrl = iconMap[item.symbol.toLowerCase()] || ''; // 如果找不到对应图标,则为空

                        // 动态生成 HTML
                        html += `
                            <li>
                             <span class="currency-icon">
    ${iconUrl ? `<img src="${iconUrl}" alt="${item.symbol.toUpperCase()} Icon" />` : ''}
</span>
<span class="currency-name">${item.symbol.toUpperCase()}</span>
<span class="price">$${price}</span> 
<span class="trend ${trendClass}">${rate}% ${trendSymbol}</span>
                            </li>`;
                    });
                    html += '</ul>';
                    container.innerHTML = html;

                    // 更新时间戳
                    updateTimestamp();
                } else {
                    container.innerHTML = '<p style="color: red;">无法加载加密货币价格,请检查网络连接或稍后再试。</p>';
                }
            })
            .catch(error => {
                console.error('API Error:', error);
                container.innerHTML = '<p style="color: red;">无法加载加密货币价格,请检查网络连接或稍后再试。</p>';
            });
    }

    // 更新时间戳
    function updateTimestamp() {
        const timestamp = document.getElementById('timestamp');
        if (!timestamp) {
            const newTimestamp = document.createElement('p');
            newTimestamp.id = 'timestamp';
            newTimestamp.style.fontSize = '12px';
            newTimestamp.style.color = '#666';
            container.appendChild(newTimestamp);
        }
        document.getElementById('timestamp').textContent = `上次更新时间:${new Date().toLocaleTimeString()}`;
    }

    // 每隔 30 秒更新一次价格
    updatePrices(); // 初始化加载
    setInterval(updatePrices, 30000); // 每 30 秒调用一次
});
</script>

<style>
/* 主容器样式 */
#crypto-price-widget {
    background: linear-gradient(135deg, #f9f9f9, #e0e0ff); /* 渐变背景 */
    border: 2px solid #9b8080; /* 红色边框 */
    padding: 15px;
    font-family: Arial, sans-serif;
    font-size: 14px;
    color: #333333; /* 文字颜色 */
    border-radius: 8px; /* 圆角 */
    max-width: 400px; /* 最大宽度 */
    margin: 0 auto; /* 居中 */
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* 阴影效果 */
}

/* 列表样式 */
#crypto-price-widget ul {
    list-style: none;
    padding: 0;
    margin: 0;
}

/* 列表项样式 */
#crypto-price-widget li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 10px;
    padding: 8px;
    border-bottom: 1px solid #ddd; /* 分割线 */
}

#crypto-price-widget li:last-child {
    border-bottom: none; /* 去掉最后一项的分割线 */
}

/* 币种图标样式 */
#crypto-price-widget .currency-icon img {
    width: 24px; /* 图标大小 */
    height: 24px;
    margin-right: 8px; /* 图标与文字之间的间距 */
    vertical-align: middle;
}

/* 货币名称样式 */
#crypto-price-widget .currency-name {
    font-weight: bold;
    color: #007bff; /* 蓝色文字 */
    margin-right: 8px;
	margin-left: -20px;
}

/* 价格样式 */
#crypto-price-widget .price {
    color: #28a745; /* 绿色文字 */
    font-weight: bold;
}

/* 上涨样式 */
#crypto-price-widget .trend.up {
    color: #28a745; /* 绿色 */
    font-weight: bold;
}

/* 下跌样式 */
#crypto-price-widget .trend.down {
    color: #dc3545; /* 红色 */
    font-weight: bold;
}

/* 加载动画 */
.loading .spinner {
    display: inline-block;
    width: 16px;
    height: 16px;
    border: 2px solid #007bff;
    border-top-color: transparent;
    border-radius: 50%;
    animation: spin 0.8s linear infinite;
}

@keyframes spin {
    from {
        transform: rotate(0deg);
    }
    to {
        transform: rotate(360deg);
    }
}

/* 响应式设计 */
@media (max-width: 600px) {
    #crypto-price-widget {
        font-size: 12px;
    }

    #crypto-price-widget li {
        flex-direction: column;
        align-items: flex-start;
    }

    #crypto-price-widget .price,
    #crypto-price-widget .trend {
        margin-top: 5px;
    }

    /* 小屏幕下的分割线 */
    #crypto-price-widget li {
        padding: 5px 0;
    }
}
</style>

上面的代码可以看到,我是用了proxy的,。

proxy.php

<?php
// proxy.php

// 设置目标 API URL
$apiUrl = '你的获取币价的接口url,这需要你自己提供';

// 使用 file_get_contents 获取 API 数据
$response = file_get_contents($apiUrl);

// 设置响应头为 JSON 格式
header('Content-Type: application/json');

// 输出 API 响应
echo $response;

然后我的接口返回的json是这样的

{"code":0,"data":[{"name":"bnbusdt","symbol":"bnbusdt","price":"621.69","rate_24h":"0.004611172486670822","is_up":0},{"name":"btcusdt","symbol":"btcusdt","price":"87281.51","rate_24h":"0.0062835138609466","is_up":1},{"name":"ethusdt","symbol":"ethusdt","price":"2018.74","rate_24h":"0.0036092827172032487","is_up":1},{"name":"htxusdt","symbol":"htxusdt","price":"1.659E-6","rate_24h":"0.011585365853658504","is_up":1},{"name":"solusdt","symbol":"solusdt","price":"137.9817","rate_24h":"0.00875215517241379","is_up":0}]}

拿着这样的接口数据,我就能在我的前端去展示了

具体演示可以看bqbot.cn

相关文章:

  • STM32F103_LL库+寄存器学习笔记07 - 串口接收缓冲区非空中断
  • Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·下】
  • Linux Shell(Bash) 快捷键整理
  • 2.2.2 Spark单机版环境
  • JAVA中栈内存溢出问题分析
  • REC一些操作解法
  • WPF 依赖项属性
  • Java8通过Stream对list对象某个属性去重
  • 【计科】从操作系统到虚拟化技术(进程调度,内存映射,设备IO,文件、网络管理)
  • 每日总结3.27
  • linux服务器配置jupyter或python上安装字体
  • 单片机时钟树中RTC和IWDG讲解
  • LeetCode hot 100—零钱兑换
  • Open WebUI自定义OpenWebUI图标
  • 基于springcloud微服务架构的巡游出租管理平台
  • SQL优化 | 精准区分 trace_id、sql_id、plan_id(二)
  • HarmonyOS-ArkUI Navigation (导航组件)-第一部分
  • 【网络丢包】原因排查及优化
  • PTA 7-16 一元多项式求导
  • leetcode1248. 统计「优美子数组」
  • 建设网站要求和注意事项/自己有产品怎么网络销售
  • 如何自己做微信小程序/seo初级入门教程
  • 开一家网络公司需要什么条件/关键词优化流程
  • 网站建设项目文档/网络营销活动策划
  • 如何免费建企业网站/培训计划和培训内容
  • 网站建设公司考察/网站备案查询系统