今天分享一个我自用的、可直接上线使用的一言展示卡片。

这是一个纯原生、零依赖、开箱即用的前端小模块,适合放在个人博客首页、侧边栏或文章页中,为网站增加一点文艺气息。
d23ceabbe3824e3586e031ac118076dc-20260225192152.png

效果与特点

  • 纯原生 HTML + CSS + JavaScript,不依赖任何框架
  • 暖黄卡片设计,圆角+柔和阴影,视觉舒适
  • 响应式布局,自动适配手机、平板、PC
  • 加载状态提示,请求失败友好提示
  • 鼠标悬浮平滑显示句子来源,移开隐藏
  • 闭包执行,不污染全局变量
  • 仅使用一言官方基础接口,稳定简洁

效果实装预览:

Freedom2599右侧卡片

如何使用

直接复制以下代码,粘贴到网页任意位置即可运行:

  
<!-- 一言(Hitokoto)独立展示块 - 仅访问基础接口地址 -->
<div id="hitokotoContainer" style="width: 100%; max-width: 600px; background: #FFF8DC; border-radius: 12px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06); padding: 30px 25px; position: relative; overflow: hidden; margin: 20px 0; display: flex; flex-direction: column; gap: 15px; transition: all 0.3s ease; font-family: 'Microsoft YaHei', 'PingFang SC', 'SimSun', serif;">
    <!-- 加载占位符 -->
    <div id="hitokotoContent" style="font-size: 20px; line-height: 1.8; color: #a0aec0; text-align: center; letter-spacing: 0.5px; font-style: italic;">正在加载一言...</div>
    <!-- 来源容器(初始隐藏) -->
    <div id="hitokotoFrom" style="font-size: 14px; color: #718096; text-align: center; padding-top: 10px; border-top: 1px solid #f7fafc; opacity: 0; height: 0; overflow: hidden; transition: opacity 0.3s ease, height 0.3s ease, padding-top 0.3s ease;"></div>

    <!-- 内嵌脚本 -->
    <script>
        (function() {
            // 核心配置(可自定义修改)
            const config = {
                themeColor: '#9f7aea', // 引用符号颜色
                errorText: '加载失败,请稍后重试' // 错误提示
            };

            // 获取元素
            const container = document.getElementById('hitokotoContainer');
            const content = document.getElementById('hitokotoContent');
            const from = document.getElementById('hitokotoFrom');

            // 响应式样式适配
            function setResponsiveStyle() {
                if (window.innerWidth <= 768) {
                    content.style.fontSize = '18px';
                    from.style.fontSize = '13px';
                    container.style.padding = '20px 15px';
                } else {
                    content.style.fontSize = '20px';
                    from.style.fontSize = '14px';
                    container.style.padding = '30px 25px';
                }
            }

            // 加载一言数据(仅访问基础接口地址)
            async function loadHitokoto() {
                try {
                    // 仅请求基础接口地址,不添加任何参数
                    const res = await fetch('https://v1.hitokoto.cn');
                    if (!res.ok) throw new Error(`状态码:${res.status}`);
                    const data = await res.json();

                    // 渲染一言内容
                    content.innerHTML = `<span style="color: ${config.themeColor}; font-size: 24px; font-weight: bold;">「</span>${data.hitokoto}<span style="color: ${config.themeColor}; font-size: 24px; font-weight: bold;">」</span>`;
                    content.style.color = '#2d3748';
                    content.style.fontStyle = 'normal';
                    // 渲染来源
                    from.innerHTML = `—— ${data.from || '未知'}`;
                    
                } catch (err) {
                    content.textContent = `${config.errorText}:${err.message}`;
                    content.style.color = '#e53e3e';
                    console.error('一言加载失败:', err);
                }
            }

            // 初始化
            function init() {
                // 适配响应式
                setResponsiveStyle();
                window.addEventListener('resize', setResponsiveStyle);
                // 加载数据
                loadHitokoto();
                // 悬浮显示来源
                container.addEventListener('mouseenter', () => {
                    from.style.opacity = '1';
                    from.style.height = 'auto';
                    from.style.paddingTop = '10px';
                });
                container.addEventListener('mouseleave', () => {
                    from.style.opacity = '0';
                    from.style.height = '0';
                    from.style.paddingTop = '0';
                });
            }

            // 页面加载完成后初始化
            if (document.readyState === 'complete' || document.readyState === 'interactive') {
                init();
            } else {
                document.addEventListener('DOMContentLoaded', init);
            }
        })();
    </script>
</div>

使用说明

  1. 复制整段代码
  2. 粘贴到你的网页任意位置
  3. 无需引入额外文件,无需配置
  4. 如需修改主题颜色,只需修改:
const config = {
    themeColor: '#9f7aea',
    errorText: '加载失败,请稍后重试'
};

一言接口常用参数

本项目默认使用无参数基础接口,稳定性最高:

https://v1.hitokoto.cn

如果你想指定类型,可以在接口后拼接参数 c :

  • a 动画
  • b 漫画
  • c 游戏
  • d 文学
  • e 原创
  • f 来自网络
  • g 其他
  • h 影视
  • i 诗词
  • j 网易云
  • k 哲学
  • l 抖机灵

示例:
https://v1.hitokoto.cn?c=i

其他可选参数:

  • min_length 最小长度
  • max_length 最大长度
  • encode 返回格式(json / js / xml)

关于作者