edit icon

创建者:
Ray_ming
Fork(复制)
下载
嵌入
BUG反馈
index.html
index.html
            
            <!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>高级考试成绩排名分析报告</title>
    <style>
        :root {
            --primary: #8b5cf6;
            --secondary: #6d28d9;
            --accent: #10b981;
            --success: #10b981;
            --warning: #f59e0b;
            --danger: #ef4444;
            --dark-bg: #0f0f13;
            --card-bg: #1a1a23;
            --card-hover: #23232e;
            --text: #e2e8f0;
            --text-secondary: #94a3b8;
            --border: #2d2d3a;
        }
        
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Inter', 'Segoe UI', 'Microsoft YaHei', sans-serif;
        }
        
        body {
            background: linear-gradient(135deg, #0f0f13 0%, #1a1a23 100%);
            color: var(--text);
            line-height: 1.6;
            min-height: 100vh;
            padding: 20px;
        }
        
        .container {
            max-width: 1400px;
            margin: 0 auto;
            background: var(--dark-bg);
            border-radius: 20px;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
            overflow: hidden;
            border: 1px solid var(--border);
        }
        
        header {
            background: linear-gradient(135deg, var(--primary), var(--secondary));
            color: white;
            padding: 50px 40px;
            text-align: center;
            position: relative;
            overflow: hidden;
        }
        
        header::before {
            content: "";
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320"><path fill="%23000000" fill-opacity="0.15" d="M0,224L48,213.3C96,203,192,181,288,181.3C384,181,480,203,576,192C672,181,768,139,864,138.7C960,139,1056,181,1152,197.3C1248,213,1344,203,1392,197.3L1440,192L1440,320L1392,320C1344,320,1248,320,1152,320C1056,320,960,320,864,320C768,320,672,320,576,320C480,320,384,320,288,320C192,320,96,320,48,320L0,320Z"></path></svg>');
            background-size: cover;
            background-position: bottom;
        }
        
        .header-content {
            position: relative;
            z-index: 1;
        }
        
        h1 {
            font-size: 2.8rem;
            margin-bottom: 15px;
            letter-spacing: 1px;
            text-shadow: 0 2px 10px rgba(0,0,0,0.3);
            font-weight: 700;
        }
        
        .subtitle {
            font-size: 1.2rem;
            opacity: 0.9;
            max-width: 700px;
            margin: 0 auto;
            font-weight: 400;
        }
        
        .content {
            padding: 40px;
        }
        
        .stats-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
            gap: 25px;
            margin-bottom: 40px;
        }
        
        .stat-card {
            background: var(--card-bg);
            border-radius: 16px;
            padding: 25px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
            text-align: center;
            border: 1px solid var(--border);
            transition: all 0.4s ease;
            position: relative;
            overflow: hidden;
        }
        
        .stat-card::before {
            content: "";
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 4px;
            background: linear-gradient(90deg, var(--primary), var(--accent));
        }
        
        .stat-card:hover {
            transform: translateY(-8px);
            box-shadow: 0 15px 30px rgba(0, 0, 0, 0.4);
            background: var(--card-hover);
        }
        
        .stat-icon {
            font-size: 2.5rem;
            color: var(--primary);
            margin-bottom: 15px;
        }
        
        .stat-value {
            font-size: 3rem;
            font-weight: 800;
            background: linear-gradient(135deg, var(--primary), var(--accent));
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            margin: 10px 0;
        }
        
        .stat-label {
            font-size: 1.1rem;
            color: var(--text-secondary);
            font-weight: 500;
        }
        
        .stat-desc {
            font-size: 0.9rem;
            color: var(--text-secondary);
            margin-top: 8px;
        }
        
        .chart-container {
            background: var(--card-bg);
            border-radius: 16px;
            padding: 30px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
            margin-bottom: 40px;
            position: relative;
            border: 1px solid var(--border);
        }
        
        .chart-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 25px;
            flex-wrap: wrap;
            gap: 15px;
        }
        
        .chart-title {
            font-size: 1.5rem;
            color: var(--text);
            font-weight: 600;
        }
        
        .chart-controls {
            display: flex;
            gap: 10px;
        }
        
        .chart-btn {
            padding: 10px 20px;
            background: var(--card-bg);
            border: 1px solid var(--border);
            border-radius: 8px;
            cursor: pointer;
            transition: all 0.3s;
            font-weight: 500;
            color: var(--text);
        }
        
        .chart-btn.active {
            background: linear-gradient(135deg, var(--primary), var(--secondary));
            color: white;
            border-color: transparent;
        }
        
        .chart-btn:hover:not(.active) {
            background: var(--card-hover);
        }
        
        .data-table-container {
            background: var(--card-bg);
            border-radius: 16px;
            padding: 30px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
            margin-bottom: 40px;
            overflow: hidden;
            border: 1px solid var(--border);
        }
        
        .data-table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 20px;
        }
        
        .data-table th {
            background: linear-gradient(135deg, var(--primary), var(--secondary));
            color: white;
            padding: 16px;
            text-align: left;
            font-weight: 600;
        }
        
        .data-table td {
            padding: 16px;
            border-bottom: 1px solid var(--border);
        }
        
        .data-table tr:nth-child(even) {
            background-color: rgba(255, 255, 255, 0.03);
        }
        
        .data-table tr:hover {
            background-color: rgba(255, 255, 255, 0.08);
        }
        
        .trend-up {
            color: var(--success);
            font-weight: 600;
        }
        
        .trend-down {
            color: var(--danger);
            font-weight: 600;
        }
        
        .analysis-section {
            background: var(--card-bg);
            border-radius: 16px;
            padding: 30px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
            margin-bottom: 40px;
            border: 1px solid var(--border);
        }
        
        .section-title {
            font-size: 1.5rem;
            color: var(--text);
            margin-bottom: 25px;
            padding-bottom: 15px;
            border-bottom: 2px solid var(--border);
            font-weight: 600;
        }
        
        .analysis-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 25px;
        }
        
        .analysis-card {
            background: var(--card-bg);
            border-radius: 12px;
            padding: 20px;
            border-left: 4px solid var(--primary);
            transition: all 0.3s ease;
            border: 1px solid var(--border);
        }
        
        .analysis-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
        }
        
        .analysis-card h3 {
            color: var(--text);
            margin-bottom: 15px;
            font-size: 1.2rem;
        }
        
        .analysis-points {
            margin-left: 15px;
        }
        
        .analysis-points li {
            margin-bottom: 10px;
            padding-left: 10px;
        }
        
        .highlight {
            color: var(--primary);
            font-weight: 600;
        }
        
        .positive {
            color: var(--success);
            font-weight: 600;
        }
        
        .negative {
            color: var(--danger);
            font-weight: 600;
        }
        
        .improvement-section {
            background: var(--card-bg);
            border-radius: 16px;
            padding: 30px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
            border: 1px solid var(--border);
        }
        
        .recommendation-list {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 20px;
        }
        
        .recommendation-item {
            display: flex;
            align-items: flex-start;
            gap: 15px;
            padding: 20px;
            background: var(--card-bg);
            border-radius: 12px;
            transition: all 0.3s ease;
            border: 1px solid var(--border);
        }
        
        .recommendation-item:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
            background: var(--card-hover);
        }
        
        .recommendation-icon {
            font-size: 1.8rem;
            color: var(--primary);
            flex-shrink: 0;
        }
        
        footer {
            text-align: center;
            padding: 30px;
            color: var(--text-secondary);
            font-size: 0.95rem;
            border-top: 1px solid var(--border);
            margin-top: 30px;
            background: var(--card-bg);
        }
        
        @media (max-width: 768px) {
            .content {
                padding: 25px;
            }
            
            h1 {
                font-size: 2.2rem;
            }
            
            .stats-grid {
                grid-template-columns: 1fr;
            }
            
            .chart-header {
                flex-direction: column;
                align-items: flex-start;
            }
            
            .analysis-grid, .recommendation-list {
                grid-template-columns: 1fr;
            }
        }
        
        /* 自定义图标 */
        .icon-trophy::before { content: "🏆"; }
        .icon-graph-down::before { content: "📉"; }
        .icon-calculator::before { content: "🧮"; }
        .icon-arrow-up::before { content: "📈"; }
        .icon-graph-up::before { content: "📊"; }
        .icon-calendar::before { content: "📅"; }
        .icon-speedometer::before { content: "⚡"; }
        .icon-journal::before { content: "📚"; }
        .icon-clipboard::before { content: "📋"; }
        .icon-bullseye::before { content: "🎯"; }
        .icon-lightbulb::before { content: "💡"; }
        
        /* 图表容器 */
        #chartCanvas {
            width: 100%;
            height: 400px;
        }
        
        /* 动画效果 */
        @keyframes fadeIn {
            from { opacity: 0; transform: translateY(20px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        .fade-in {
            animation: fadeIn 0.6s ease forwards;
        }
        
        .delay-1 { animation-delay: 0.1s; }
        .delay-2 { animation-delay: 0.2s; }
        .delay-3 { animation-delay: 0.3s; }
        .delay-4 { animation-delay: 0.4s; }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <div class="header-content">
                <h1>考试成绩排名分析报告</h1>
                <p class="subtitle">七年级至八年级上学期期中成绩排名变化趋势分析与学习策略建议</p>
            </div>
        </header>
        
        <div class="content">
            <div class="stats-grid">
                <div class="stat-card fade-in">
                    <div class="stat-icon icon-trophy"></div>
                    <div class="stat-value">7</div>
                    <div class="stat-label">最佳排名</div>
                    <div class="stat-desc">七年级上学期期末</div>
                </div>
                <div class="stat-card fade-in delay-1">
                    <div class="stat-icon icon-graph-down"></div>
                    <div class="stat-value">31</div>
                    <div class="stat-label">最差排名</div>
                    <div class="stat-desc">入校时</div>
                </div>
                <div class="stat-card fade-in delay-2">
                    <div class="stat-icon icon-calculator"></div>
                    <div class="stat-value">15.3</div>
                    <div class="stat-label">平均排名</div>
                    <div class="stat-desc">七次考试平均</div>
                </div>
                <div class="stat-card fade-in delay-3">
                    <div class="stat-icon icon-arrow-up"></div>
                    <div class="stat-value">23</div>
                    <div class="stat-label">排名进步</div>
                    <div class="stat-desc">从入校到最佳排名</div>
                </div>
            </div>
            
            <div class="chart-container fade-in delay-1">
                <div class="chart-header">
                    <h2 class="chart-title">成绩排名变化趋势</h2>
                    <div class="chart-controls">
                        <button class="chart-btn active" id="lineChartBtn">折线图</button>
                        <button class="chart-btn" id="barChartBtn">柱状图</button>
                    </div>
                </div>
                <canvas id="chartCanvas"></canvas>
            </div>
            
            <div class="data-table-container fade-in delay-2">
                <h2 class="section-title">详细数据</h2>
                <table class="data-table">
                    <thead>
                        <tr>
                            <th>考试阶段</th>
                            <th>排名</th>
                            <th>变化趋势</th>
                            <th>备注</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>入校</td>
                            <td>31</td>
                            <td>—</td>
                            <td>起点</td>
                        </tr>
                        <tr>
                            <td>七上期中</td>
                            <td>14</td>
                            <td class="trend-up">↑ 进步17名</td>
                            <td>显著进步</td>
                        </tr>
                        <tr>
                            <td>七上期末</td>
                            <td>7</td>
                            <td class="trend-up">↑ 进步7名</td>
                            <td>最佳排名</td>
                        </tr>
                        <tr>
                            <td>七下期中</td>
                            <td>8</td>
                            <td class="trend-down">↓ 退步1名</td>
                            <td>保持稳定</td>
                        </tr>
                        <tr>
                            <td>七下期末</td>
                            <td>29</td>
                            <td class="trend-down">↓ 退步21名</td>
                            <td>明显波动</td>
                        </tr>
                        <tr>
                            <td>八上期中</td>
                            <td>8</td>
                            <td class="trend-up">↑ 进步21名</td>
                            <td>恢复良好状态</td>
                        </tr>
                    </tbody>
                </table>
            </div>
            
            <div class="analysis-section fade-in delay-3">
                <h2 class="section-title">数据分析</h2>
                <div class="analysis-grid">
                    <div class="analysis-card">
                        <h3><span class="icon-graph-up"></span> 总体趋势</h3>
                        <ul class="analysis-points">
                            <li>从入校排名<span class="negative">31名</span>到七年级上学期期末的<span class="positive">7名</span>,展现了显著的进步</li>
                            <li>适应能力和学习潜力较强,能够快速提升</li>
                            <li>七年级下学期期末出现较大波动,但能迅速调整恢复</li>
                        </ul>
                    </div>
                    <div class="analysis-card">
                        <h3><span class="icon-calendar"></span> 阶段表现</h3>
                        <ul class="analysis-points">
                            <li>七年级期间整体表现优异,排名稳定在前10名左右</li>
                            <li>七年级下学期期末出现异常波动,需分析原因</li>
                            <li>八年级上学期期中排名<span class="positive">8名</span>,表明已恢复良好状态</li>
                        </ul>
                    </div>
                    <div class="analysis-card">
                        <h3><span class="icon-speedometer"></span> 稳定性分析</h3>
                        <ul class="analysis-points">
                            <li>除七年级下学期期末外,排名波动相对较小</li>
                            <li>显示出较为稳定的学习能力和心理素质</li>
                            <li>应对挫折的能力较强,能够快速调整状态</li>
                        </ul>
                    </div>
                </div>
            </div>
            
            <div class="improvement-section fade-in delay-4">
                <h2 class="section-title">学习策略建议</h2>
                <div class="recommendation-list">
                    <div class="recommendation-item">
                        <div class="recommendation-icon icon-journal"></div>
                        <div>
                            <h3>保持优势科目</h3>
                            <p>分析七年级上学期期末取得最佳排名时的学习方法,继续保持优势科目的学习策略。</p>
                        </div>
                    </div>
                    <div class="recommendation-item">
                        <div class="recommendation-icon icon-clipboard"></div>
                        <div>
                            <h3>应对波动</h3>
                            <p>深入分析七年级下学期期末排名下降的原因,制定应对类似情况的有效策略。</p>
                        </div>
                    </div>
                    <div class="recommendation-item">
                        <div class="recommendation-icon icon-bullseye"></div>
                        <div>
                            <h3>目标设定</h3>
                            <p>基于当前<span class="positive">8名</span>的排名,设定进入前5名的短期目标,并制定具体实施计划。</p>
                        </div>
                    </div>
                    <div class="recommendation-item">
                        <div class="recommendation-icon icon-lightbulb"></div>
                        <div>
                            <h3>学习方法优化</h3>
                            <p>尝试更高效的学习方法,如主动学习、分散练习和自测,提高学习效率。</p>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        
        <footer>
            <p>当前时间:<span id="currentDate"></span> | 加油!</p>
        </footer>
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            // 设置当前日期
            const currentDate = new Date().toLocaleDateString('zh-CN', {
                year: 'numeric',
                month: 'long',
                day: 'numeric'
            });
            document.getElementById('currentDate').textContent = currentDate;
            
            // 图表数据
            const labels = ['入校', '七上期中', '七上期末', '七下期中', '七下期末', '八上期中'];
            const data = [31, 14, 7, 8, 29, 8];
            
            // 获取Canvas元素和上下文
            const canvas = document.getElementById('chartCanvas');
            const ctx = canvas.getContext('2d');
            
            // 设置Canvas尺寸
            canvas.width = canvas.offsetWidth;
            canvas.height = canvas.offsetHeight;
            
            // 图表配置
            const chartConfig = {
                type: 'line', // 'line' 或 'bar'
                padding: 40,
                colors: {
                    primary: '#8b5cf6',
                    accent: '#10b981',
                    background: 'rgba(139, 92, 246, 0.1)',
                    grid: 'rgba(255, 255, 255, 0.05)',
                    text: '#e2e8f0'
                }
            };
            
            // 绘制图表函数
            function drawChart() {
                // 清除画布
                ctx.clearRect(0, 0, canvas.width, canvas.height);
                
                // 计算图表区域
                const padding = chartConfig.padding;
                const chartWidth = canvas.width - padding * 2;
                const chartHeight = canvas.height - padding * 2;
                
                // 绘制背景
                ctx.fillStyle = '#1a1a23';
                ctx.fillRect(0, 0, canvas.width, canvas.height);
                
                // 绘制网格
                ctx.strokeStyle = chartConfig.colors.grid;
                ctx.lineWidth = 1;
                
                // 水平网格线
                const horizontalLines = 6;
                for (let i = 0; i <= horizontalLines; i++) {
                    const y = padding + (chartHeight / horizontalLines) * i;
                    ctx.beginPath();
                    ctx.moveTo(padding, y);
                    ctx.lineTo(canvas.width - padding, y);
                    ctx.stroke();
                    
                    // Y轴标签
                    ctx.fillStyle = chartConfig.colors.text;
                    ctx.font = '12px Arial';
                    ctx.textAlign = 'right';
                    ctx.fillText(35 - (i * 5), padding - 10, y + 4);
                }
                
                // 垂直网格线
                const verticalLines = labels.length - 1;
                for (let i = 0; i <= verticalLines; i++) {
                    const x = padding + (chartWidth / verticalLines) * i;
                    ctx.beginPath();
                    ctx.moveTo(x, padding);
                    ctx.lineTo(x, canvas.height - padding);
                    ctx.stroke();
                    
                    // X轴标签
                    ctx.fillStyle = chartConfig.colors.text;
                    ctx.font = '12px Arial';
                    ctx.textAlign = 'center';
                    ctx.fillText(labels[i], x, canvas.height - padding + 20);
                }
                
                // Y轴标题
                ctx.save();
                ctx.translate(20, canvas.height / 2);
                ctx.rotate(-Math.PI / 2);
                ctx.fillStyle = chartConfig.colors.text;
                ctx.font = '14px Arial';
                ctx.textAlign = 'center';
                ctx.fillText('排名(数字越小越好)', 0, 0);
                ctx.restore();
                
                // 绘制数据点
                if (chartConfig.type === 'line') {
                    drawLineChart();
                } else {
                    drawBarChart();
                }
            }
            
            // 绘制折线图
            function drawLineChart() {
                const padding = chartConfig.padding;
                const chartWidth = canvas.width - padding * 2;
                const chartHeight = canvas.height - padding * 2;
                
                // 绘制连线
                ctx.beginPath();
                ctx.strokeStyle = chartConfig.colors.primary;
                ctx.lineWidth = 3;
                ctx.lineJoin = 'round';
                
                for (let i = 0; i < data.length; i++) {
                    const x = padding + (chartWidth / (data.length - 1)) * i;
                    const y = padding + (chartHeight / 35) * data[i];
                    
                    if (i === 0) {
                        ctx.moveTo(x, y);
                    } else {
                        ctx.lineTo(x, y);
                    }
                }
                
                ctx.stroke();
                
                // 绘制数据点
                for (let i = 0; i < data.length; i++) {
                    const x = padding + (chartWidth / (data.length - 1)) * i;
                    const y = padding + (chartHeight / 35) * data[i];
                    
                    // 点外圈
                    ctx.beginPath();
                    ctx.arc(x, y, 8, 0, Math.PI * 2);
                    ctx.fillStyle = '#1a1a23';
                    ctx.fill();
                    ctx.strokeStyle = chartConfig.colors.primary;
                    ctx.lineWidth = 2;
                    ctx.stroke();
                    
                    // 点内圈
                    ctx.beginPath();
                    ctx.arc(x, y, 4, 0, Math.PI * 2);
                    ctx.fillStyle = chartConfig.colors.primary;
                    ctx.fill();
                    
                    // 数据标签
                    ctx.fillStyle = chartConfig.colors.text;
                    ctx.font = 'bold 14px Arial';
                    ctx.textAlign = 'center';
                    ctx.fillText(data[i], x, y - 15);
                }
                
                // 填充区域
                ctx.beginPath();
                for (let i = 0; i < data.length; i++) {
                    const x = padding + (chartWidth / (data.length - 1)) * i;
                    const y = padding + (chartHeight / 35) * data[i];
                    
                    if (i === 0) {
                        ctx.moveTo(x, y);
                    } else {
                        ctx.lineTo(x, y);
                    }
                }
                ctx.lineTo(canvas.width - padding, canvas.height - padding);
                ctx.lineTo(padding, canvas.height - padding);
                ctx.closePath();
                
                const gradient = ctx.createLinearGradient(0, padding, 0, canvas.height - padding);
                gradient.addColorStop(0, 'rgba(139, 92, 246, 0.3)');
                gradient.addColorStop(1, 'rgba(139, 92, 246, 0.05)');
                ctx.fillStyle = gradient;
                ctx.fill();
            }
            
            // 绘制柱状图
            function drawBarChart() {
                const padding = chartConfig.padding;
                const chartWidth = canvas.width - padding * 2;
                const chartHeight = canvas.height - padding * 2;
                const barWidth = chartWidth / data.length * 0.6;
                const barSpacing = chartWidth / data.length * 0.4;
                
                for (let i = 0; i < data.length; i++) {
                    const x = padding + (chartWidth / data.length) * i + barSpacing / 2;
                    const barHeight = (chartHeight / 35) * data[i];
                    const y = canvas.height - padding - barHeight;
                    
                    // 绘制柱子
                    const gradient = ctx.createLinearGradient(0, y, 0, canvas.height - padding);
                    gradient.addColorStop(0, chartConfig.colors.primary);
                    gradient.addColorStop(1, '#a78bfa');
                    
                    ctx.fillStyle = gradient;
                    ctx.fillRect(x, y, barWidth, barHeight);
                    
                    // 柱子边框
                    ctx.strokeStyle = '#7c3aed';
                    ctx.lineWidth = 1;
                    ctx.strokeRect(x, y, barWidth, barHeight);
                    
                    // 数据标签
                    ctx.fillStyle = chartConfig.colors.text;
                    ctx.font = 'bold 14px Arial';
                    ctx.textAlign = 'center';
                    ctx.fillText(data[i], x + barWidth / 2, y - 10);
                }
            }
            
            // 初始绘制
            drawChart();
            
            // 图表切换功能
            const lineChartBtn = document.getElementById('lineChartBtn');
            const barChartBtn = document.getElementById('barChartBtn');
            
            lineChartBtn.addEventListener('click', function() {
                if (chartConfig.type !== 'line') {
                    chartConfig.type = 'line';
                    drawChart();
                    lineChartBtn.classList.add('active');
                    barChartBtn.classList.remove('active');
                }
            });
            
            barChartBtn.addEventListener('click', function() {
                if (chartConfig.type !== 'bar') {
                    chartConfig.type = 'bar';
                    drawChart();
                    barChartBtn.classList.add('active');
                    lineChartBtn.classList.remove('active');
                }
            });
            
            // 窗口调整大小时重绘图表
            window.addEventListener('resize', function() {
                canvas.width = canvas.offsetWidth;
                canvas.height = canvas.offsetHeight;
                drawChart();
            });
            
            // 添加滚动动画效果
            const fadeElements = document.querySelectorAll('.fade-in');
            
            const fadeInObserver = new IntersectionObserver((entries) => {
                entries.forEach(entry => {
                    if (entry.isIntersecting) {
                        entry.target.style.opacity = 1;
                        entry.target.style.transform = 'translateY(0)';
                    }
                });
            }, { threshold: 0.1 });
            
            fadeElements.forEach(element => {
                element.style.opacity = 0;
                element.style.transform = 'translateY(20px)';
                element.style.transition = 'opacity 0.6s ease, transform 0.6s ease';
                fadeInObserver.observe(element);
            });
        });
    </script>
</body>
</html>
        
编辑器加载中
预览
控制台