• 仿github微型数量日历


    GITHUB 日历效果

    使用PHP SVG实现效果

    中文化、月份线条区分

    实现代码:

    <?php
    
    date_default_timezone_set("PRC");
    error_reporting(E_ALL & ~E_NOTICE);
    set_time_limit(30);
    
    header('Content-Type:image/svg+xml; charset=utf-8'); 
    header('Content-Encoding:gzip'); 
    
    $dt = $_GET['dt'] ?: date('Y-m-d');
    $today = strtotime($dt);
    
    // 颜色
    $colors = ['#ddd'];
    for ($i=1; $i<=100; $i++)
    {
        $colors[] = 'rgb(0,' . (255 - $i*2) . ',0)';
    }
    
    // 计算最近一年日期
    $day_list = [];
    if (date('w', $today) == 0)
    {
        $day = $today - (52 * 7 - 1) * 24*3600;
    }
    else
    {
        $day = $today - (51 * 7 + date('w', $today) - 1) * 24*3600;
    }
    while ($day <= $today)
    {
        $day_list[] = [
            'month' => date('m', $day),
            'date'  => date('Y-m-d', $day),
            'week'  => intval(date('w', $day)) ?: 7,
            'count' => max(0, rand(-100, 100)),     // 日期的数量
        ];
    
        $day += 24*3600;
    }
    
    // 创建SVG图片
    $svg = '<svg version="1.1" width="810" height="128" viewBox="0 0 810 128" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">';
    $svg .= '<g transform="translate(25, 20)">';
    $svg .= '<g transform="translate(0, 0)">';
    $week = 0;
    $month_list = [];
    $last_month = '';
    const RS = 15;
    
    for ($i=0; $i<count($day_list); $i++)
    {
        $r = $day_list[$i];
        if ($r['month'] != @$day_list[$i-1]['month'] ?: '')
        {
            // 计算月份
            $pre = $day_list[$i-1];
            $month_list[] = [
                'week' => $r['week'] == 1 ? ($week - 1) : $week,
                'name' => intval($r['month']) . ' 月',
            ];
    
            // 绘制月份分割线
            if ($r['week'] == 1)
            {
                if ($i > 0)
                {
                    $svg .= '<rect width="1" height="117" x="' . ($week * RS - 2) . '" y="-15" fill="#66f" />'; 
                }
            }
            else
            {
                $y = $pre['week'] * RS - 2;
                $svg .= '<rect width="1" height="' . ($y+RS) . '" x="' . (($week + 1) * RS - 2) . '" y="-15" fill="#66f" />'; 
                $svg .= '<rect width="16" height="1" x="' . ($week * RS - 2) . '" y="' . $y . '" fill="#66f" />'; 
                $svg .= '<rect width="1" height="' . (105-$y) . '" x="' . ($week * RS - 2) . '" y="' . $y . '" fill="#66f" />'; 
            }
        }
    
        // 绘制日期色块
        $svg .= '<rect width="12" height="12" rx="2" ry="2" x="' . $week * RS . '" y="' . ($r['week'] - 1) * RS . '" fill="' . $colors[$r['count']] . '" />';
    
        if ($r['week'] == 7)
        {
            $week++;
            $svg .= '<g transform="translate(' . $week * RS . ', 0)">';
            $svg .= '</g>';
        }
    }
    $svg .= '</g>';
    
    // 绘制月份
    $svg .= '<g transform="translate(25, 0)">';
    foreach ($month_list as $r)
    {
        $first = $r['week'] == -1 && $month_list[1]['week'] > 2;
        if (($r['week'] !== -1 && $r['week'] < 51) || $first)
        {
            $svg .= '<text text-anchor="start" font-size="10" dx="' . ($r['week'] * RS - 5) . '" dy="-5" >' . $r['name'] . '</text>';
        }
    }
    $svg .= '</g>';
    
    // 绘制星期标识
    $svg .= '<g transform="translate(-17, 10)">';
    $svg .= '<text text-anchor="start" font-size="10" dx="0" dy="0" >一</text>';
    $svg .= '<text text-anchor="start" font-size="10" dx="0" dy="15">二</text>';
    $svg .= '<text text-anchor="start" font-size="10" dx="0" dy="30">三</text>';
    $svg .= '<text text-anchor="start" font-size="10" dx="0" dy="45">四</text>';
    $svg .= '<text text-anchor="start" font-size="10" dx="0" dy="60">五</text>';
    $svg .= '<text text-anchor="start" font-size="10" dx="0" dy="75">六</text>';
    $svg .= '<text text-anchor="start" font-size="10" dx="0" dy="90">日</text>';
    $svg .= '</g>';
    $svg .= '</g>';
    $svg .= '</svg>';
    
    $svg = gzencode($svg, 9);
    
    echo $svg;
  • 相关阅读:
    软件工程课后作业一之30道随机四则运算程序2设计思想
    软件工程课后作业一之30道随机四则运算程序
    2015春季学期软件工程之阅读计划
    第一次冲刺 站立会议6
    第一次冲刺 站立会议5
    第一次冲刺 站立会议4
    第一次冲刺 站立会议3
    第一次冲刺 站立会议2
    第一次冲刺 站立会议1
    cnblogs用户体验
  • 原文地址:https://www.cnblogs.com/zjfree/p/14188657.html
Copyright © 2020-2023  润新知