JSON数据展示工具

发布于 2025-05-10 浏览 30 人次

一个包含文本区域和按钮的页面,点击按钮可以将 JSON 数据转换为字符串并填充到文本区域中。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSON数据展示工具</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" rel="stylesheet">
    <script>
        tailwind.config = {
            theme: {
                extend: {
                    colors: {
                        primary: '#3B82F6',
                        secondary: '#64748B',
                        accent: '#0EA5E9',
                        dark: '#1E293B',
                        light: '#F8FAFC'
                    },
                    fontFamily: {
                        inter: ['Inter', 'sans-serif'],
                    },
                }
            }
        }
    </script>
    <style type="text/tailwindcss">
        @layer utilities {
            .content-auto {
                content-visibility: auto;
            }
            .text-shadow {
                text-shadow: 0 2px 4px rgba(0,0,0,0.1);
            }
            .transition-custom {
                transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
            }
        }
    </style>
</head>
<body class="bg-gradient-to-br from-light to-gray-100 min-h-screen font-inter text-dark">
    <div class="container mx-auto px-4 py-8 max-w-4xl">
        <!-- 页面标题 -->
        <header class="mb-10 text-center">
            <h1 class="text-[clamp(2rem,5vw,3rem)] font-bold text-dark mb-2 text-shadow">JSON数据展示工具</h1>
            <p class="text-secondary text-lg max-w-2xl mx-auto">将JSON数据格式化后展示在文本区域中,支持一键复制和清空功能</p>
        </header>

        <!-- 主要内容区域 -->
        <main class="bg-white rounded-2xl shadow-xl overflow-hidden transform transition-all duration-300 hover:shadow-2xl">
            <!-- 控制面板 -->
            <div class="bg-primary/10 p-4 flex flex-wrap gap-3 justify-between items-center border-b border-primary/20">
                <div class="flex flex-wrap gap-3">
                    <button id="fillButton" class="bg-primary hover:bg-primary/90 text-white px-5 py-2 rounded-lg shadow-md flex items-center gap-2 transition-custom">
                        <i class="fa-solid fa-database"></i>
                        <span>填充示例数据</span>
                    </button>
                    <button id="clearButton" class="bg-secondary hover:bg-secondary/90 text-white px-5 py-2 rounded-lg shadow-md flex items-center gap-2 transition-custom">
                        <i class="fa-solid fa-eraser"></i>
                        <span>清空</span>
                    </button>
                </div>
                <div class="flex items-center gap-2">
                    <span class="text-secondary">缩进空格数:</span>
                    <select id="indentSelect" class="bg-white border border-gray-300 rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-primary/50 transition-custom">
                        <option value="2">2个空格</option>
                        <option value="4" selected>4个空格</option>
                        <option value="6">6个空格</option>
                        <option value="8">8个空格</option>
                    </select>
                </div>
            </div>

            <!-- 文本区域容器 -->
            <div class="p-4">
                <div class="relative mb-4">
                    <label for="presentCode" class="block text-sm font-medium text-secondary mb-1">JSON数据</label>
                    <button id="copyButton" class="absolute top-2 right-2 bg-dark/80 hover:bg-dark text-white px-3 py-1 rounded-md text-sm shadow-sm flex items-center gap-1 transition-custom opacity-0 group-hover:opacity-100">
                        <i class="fa-solid fa-copy"></i>
                        <span>复制</span>
                    </button>
                </div>
                <textarea id="presentCode" class="w-full h-[400px] p-4 bg-gray-50 border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary/50 resize-none font-mono text-sm transition-custom" placeholder="JSON数据将显示在这里..."></textarea>
            </div>

            <!-- 状态栏 -->
            <div class="bg-gray-50 p-3 border-t border-gray-200 flex justify-between items-center">
                <div id="statusMessage" class="text-sm text-secondary">就绪</div>
                <div class="text-sm text-secondary">
                    <span id="charCount">0</span> 字符
                </div>
            </div>
        </main>

        <!-- 功能说明 -->
        <section class="mt-10 bg-white/70 backdrop-blur-sm rounded-xl p-6 shadow-lg">
            <h2 class="text-xl font-bold text-dark mb-4 flex items-center gap-2">
                <i class="fa-solid fa-info-circle text-primary"></i>
                使用说明
            </h2>
            <ul class="space-y-2 text-gray-700">
                <li class="flex items-start gap-2">
                    <i class="fa-solid fa-check-circle text-primary mt-1"></i>
                    <span>点击"填充示例数据"按钮,将自动生成并显示JSON数据</span>
                </li>
                <li class="flex items-start gap-2">
                    <i class="fa-solid fa-check-circle text-primary mt-1"></i>
                    <span>通过下拉菜单可以选择不同的缩进空格数,使JSON数据更易读</span>
                </li>
                <li class="flex items-start gap-2">
                    <i class="fa-solid fa-check-circle text-primary mt-1"></i>
                    <span>将鼠标悬停在文本区域右上角时,可以看到"复制"按钮,点击可复制全部内容</span>
                </li>
                <li class="flex items-start gap-2">
                    <i class="fa-solid fa-check-circle text-primary mt-1"></i>
                    <span>点击"清空"按钮可以清除文本区域中的所有内容</span>
                </li>
            </ul>
        </section>
    </div>

    <!-- 页脚 -->
    <footer class="mt-16 text-center text-secondary text-sm pb-6">
        <p>© 2025 JSON数据展示工具 | 使用 Tailwind CSS 构建</p>
    </footer>

    <script>
        // 示例JSON数据
        const sampleJson = {
            "用户信息": {
                "姓名": "张三",
                "年龄": 30,
                "联系方式": {
                    "电话": ["13800138000", "13900139000"],
                    "邮箱": "zhangsan@example.com"
                },
                "地址": {
                    "省份": "北京市",
                    "城市": "北京市",
                    "街道": "朝阳区建国路88号",
                    "邮编": "100022"
                }
            },
            "订单信息": [
                {
                    "订单号": "ORD20250510001",
                    "商品": [
                        {
                            "名称": "智能手机",
                            "数量": 1,
                            "价格": 4999.00,
                            "规格": {
                                "颜色": "星空蓝",
                                "存储": "256GB"
                            }
                        },
                        {
                            "名称": "无线耳机",
                            "数量": 1,
                            "价格": 899.00,
                            "规格": {
                                "颜色": "白色"
                            }
                        }
                    ],
                    "订单日期": "2025-05-10",
                    "状态": "已支付",
                    "支付方式": "微信支付"
                },
                {
                    "订单号": "ORD20250509002",
                    "商品": [
                        {
                            "名称": "笔记本电脑",
                            "数量": 1,
                            "价格": 8999.00,
                            "规格": {
                                "处理器": "Intel i7",
                                "内存": "16GB",
                                "存储": "512GB SSD"
                            }
                        }
                    ],
                    "订单日期": "2025-05-09",
                    "状态": "已发货",
                    "支付方式": "支付宝"
                }
            ],
            "会员信息": {
                "会员等级": "白金会员",
                "积分": 12500,
                "注册日期": "2024-01-15",
                "上次登录": "2025-05-10T08:30:00"
            }
        };

        // 获取DOM元素
        const fillButton = document.getElementById('fillButton');
        const clearButton = document.getElementById('clearButton');
        const copyButton = document.getElementById('copyButton');
        const presentCode = document.getElementById('presentCode');
        const indentSelect = document.getElementById('indentSelect');
        const statusMessage = document.getElementById('statusMessage');
        const charCount = document.getElementById('charCount');

        // 填充JSON数据到文本区域
        function fillJsonData() {
            const indent = parseInt(indentSelect.value);
            presentCode.value = JSON.stringify(sampleJson, null, indent);
            updateCharCount();
            showStatus('已成功填充示例数据', 'success');
        }

        // 清空文本区域
        function clearTextArea() {
            presentCode.value = '';
            updateCharCount();
            showStatus('已清空文本区域', 'info');
        }

        // 复制文本区域内容
        function copyToClipboard() {
            presentCode.select();
            document.execCommand('copy');
            showStatus('已复制到剪贴板', 'success');
            
            // 复制成功动画
            copyButton.innerHTML = '<i class="fa-solid fa-check"></i><span>已复制</span>';
            copyButton.classList.add('bg-green-600');
            setTimeout(() => {
                copyButton.innerHTML = '<i class="fa-solid fa-copy"></i><span>复制</span>';
                copyButton.classList.remove('bg-green-600');
            }, 2000);
        }

        // 更新字符计数
        function updateCharCount() {
            charCount.textContent = presentCode.value.length;
        }

        // 显示状态消息
        function showStatus(message, type = 'info') {
            statusMessage.textContent = message;
            
            // 添加状态样式
            statusMessage.className = 'text-sm';
            if (type === 'success') {
                statusMessage.classList.add('text-green-600');
            } else if (type === 'error') {
                statusMessage.classList.add('text-red-600');
            } else {
                statusMessage.classList.add('text-secondary');
            }
            
            // 3秒后恢复默认状态
            setTimeout(() => {
                statusMessage.textContent = '就绪';
                statusMessage.className = 'text-sm text-secondary';
            }, 3000);
        }

        // 事件监听器
        fillButton.addEventListener('click', fillJsonData);
        clearButton.addEventListener('click', clearTextArea);
        copyButton.addEventListener('click', copyToClipboard);
        indentSelect.addEventListener('change', () => {
            if (presentCode.value.trim() !== '') {
                fillJsonData();
            }
        });
        presentCode.addEventListener('input', updateCharCount);

        // 初始化
        updateCharCount();

        // 添加文本区域动画效果
        presentCode.addEventListener('focus', () => {
            presentCode.classList.add('ring-2', 'ring-primary/50');
        });

        presentCode.addEventListener('blur', () => {
            presentCode.classList.remove('ring-2', 'ring-primary/50');
        });

        // 按钮悬停效果
        const buttons = [fillButton, clearButton, copyButton];
        buttons.forEach(button => {
            button.addEventListener('mouseenter', () => {
                button.classList.add('scale-105');
            });
            button.addEventListener('mouseleave', () => {
                button.classList.remove('scale-105');
            });
        });
    </script>
</body>
</html>
    

这个页面具有以下特点:

  1. 美观的界面设计,采用蓝色为主色调,搭配现代化的卡片式布局
  2. 响应式设计,在不同屏幕尺寸上都能良好显示
  3. 交互友好,按钮有悬停效果,状态变更有动画反馈
  4. 实用功能:填充示例数据、清空内容、复制内容、调整缩进空格数
  5. 实时字符计数和操作状态提示

你可以点击"填充示例数据"按钮来查看JSON数据展示效果。