写点什么

七夕,画个动态星空送给 Ta

  • 2025-08-29
    北京
  • 本文字数:7470 字

    阅读完需:约 25 分钟

七夕,画个动态星空送给Ta

七夕

源于牛郎织女星河相会的古老传说

星河浩瀚,喜鹊搭桥

一年一度,始得相逢

而今,我们虽不能令喜鹊飞临

却可用代码绘就一片璀璨星空

让星光随思念明灭,让星轨如鹊桥延展

让 AI 替你书写浪漫的告白!


现在,就向文心快码 Zulu 许愿!

一起,用代码绘出一片动态星空!


一、愿望构思

1.为了让 Zulu 生成的星空更符合预期,可以找一张参考图给它,需要参考图片设计动态星空。

2.为了让这个星空不那么单调,需要星空中有爱情相关的古诗文出现。

3.同时为了页面美观度,我们可以描述一下文字的样式,比如白色光芒、动态效果。


二、输入赛博版“乞巧愿”

请帮我开发一个网页版动态星空电子情书,具体需求如下:
背景:制作动态星空效果,包含闪烁的星星(明暗交替)、缓慢移动的星轨或流星轨迹,参考图片
文字内容:参考 #poems ,文字颜色为纯白色。
文字排版与动画:
文字采用竖向排列(从上到下阅读)
文字需添加动态效果(渐显渐隐)
文字周围要有白色光芒/辉光效果(类似发光滤镜,增强梦幻感)
整体风格:浪漫、沉浸式,适配PC端屏幕,动画效果流畅不卡顿。
技术实现:使用HTML、CSS、JavaScript结合Canvas或CSS动画实现,星空背景和文字动画需协调搭配,营造星空下情书的氛围感。
复制代码



三、Zulu 帮你实现

Zulu 在 10 秒内就输出了完整代码框架。并且现在最新版的文心快码 Zulu 已经支持在执行过程中展示 Todo list,我们可以在开发流程中更好地监控 Zulu 的执行。


分析星星图片/stars-1837306.jpg 获取星空样式参考

查看/poems 目录获取诗歌内容

设计 HTML/CSS/JavaScript 实现方案

创建基础 HTML 结构和 CSS 样式

实现星空动画效果

实现诗歌文字动画效果

整合所有元素并测试效果


四、持续优化

Zulu 实现了第一版,但是这个动态星空的电子情书并不是很美观,可以继续迭代优化。


  1. 我注意到有的诗文换行了,每行诗文需要纵向排列,错落有致,分布均匀


  1. 这个星空背景还有点单调,星星的颜色可以丰富一些,可以加入一些流星特效


  1. 星空背景颜色需要更浪漫一点,参考颜色:background-image: linear-gradient (135deg, #FAB2FF 10%, #1904E5 100%),并调整各图层透明度,确保效果


最后,我们就成功实现了

动态星空的电子情书!👉点击观看视频


五、更多功能

文心快码 Zulu 能做的不只这些!还能化身你的专属爱情保安,守护你的七夕甜蜜计划!

1 帮你提高编码效率,七夕早下班

还在为繁琐的代码调试头疼?文心快码助你拉满编码效率!

  • 超级代码补全: 智能预测,一键补全,大幅减少重复输入

  • 智能 Debug: 精准定位错误,并提供修复建议

  • 自动生成单测: 支持多种测试框架,快速生成高覆盖率的单元测试用例

早下班不是梦,更多时间陪 Ta 过节!

2 帮你解决送什么难题,创意无限

用 AI 编程,创意不重样,亲手为 Ta 打造一个独一无二的赛博礼物!

  • 照片回忆册: 用代码快速整理你们的照片,生成专属回忆相册

  • 爱心代码动画: 几行代码就能生成动态爱心图案,炫技又浪漫

  • 个性化网页: 快速搭建一个专属七夕告白页面,记录专属日常

  • 小游戏开发: 简单几步制作一个互动小游戏,共渡休闲时光


0 基础也没关系! 告诉文心快码 Zulu 你的想法,自动生成代码,稍作修改就能送出特别的浪漫!


这个七夕,让 Coding Agent 成为你的爱情保安,bug 退散,love 满分,有 AI 更有爱!

点击获取Zulu定制的文心快码Comate AI IDE七夕专属页面,下载体验 Coding Agent 的超能力!


附录 1:七夕产品宣传页生成 prompt 示例

我要做一个 AI IDE的七夕宣传页面,请帮我设计下,我的产品名叫 Comate AI IDE,重点突出 Agent、补全、Debug、前端预览调试。 第一屏使用这个背景图 https://comate.baidu.com/ai-ide/raw/520-background.png   ide 的下载链接是 https://comate.baidu.com/zh/download#aiIde
复制代码


附录 2:动态星空代码

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Starry Night</title>    <style>        body {            margin: 0;            overflow: hidden;            background-image: linear-gradient(135deg, #FAB2FF 10%, #1904E5 100%);            font-family: 'SimSun', serif;            color: white;        }                #poems-container {            position: absolute;            top: 0;            left: 0;            width: 100%;            height: 100%;            pointer-events: none;        }                .poem {            position: absolute;            writing-mode: vertical-rl;            text-orientation: upright;            font-size: 20px;            line-height: 1.6;            white-space: nowrap;            letter-spacing: 2px;            text-shadow: 0 0 6px rgba(255,182,255,0.9), 0 0 12px rgba(255,255,255,0.7), 0 0 20px rgba(255,255,255,0.5);            opacity: 0;            animation: fadeInOut 15s infinite ease-in-out, float 15s infinite ease-in-out;            transform-origin: center;            padding: 10px 0;        }                @keyframes fadeInOut {            0%, 100% { opacity: 0; }            50% { opacity: 1; }        }                @keyframes float {            0%, 100% { transform: translateY(0); }            50% { transform: translateY(-20px); }        }        canvas {            display: block;            opacity: 0.8;            mix-blend-mode: screen;        }    </style></head><body>    <canvas id="stars"></canvas>    <div id="poems-container"></div>    <script>        const canvas = document.getElementById('stars');        const ctx = canvas.getContext('2d');                // 设置画布大小为窗口大小        canvas.width = window.innerWidth;        canvas.height = window.innerHeight;                // 星星数组        const stars = [];        const starCount = 500;                // 流星数组        const meteors = [];        const maxMeteors = 3;                // 初始化星星        for (let i = 0; i < starCount; i++) {            stars.push({                x: Math.random() * canvas.width,                y: Math.random() * canvas.height,                radius: Math.random() * 1.5,                vx: Math.random() * 0.3 - 0.15,                vy: Math.random() * 0.3 - 0.15,                brightness: Math.random(),                twinkleSpeed: Math.random() * 0.05 + 0.01            });        }                // 绘制银河        function drawMilkyWay() {            const centerX = canvas.width / 2;            const centerY = canvas.height / 2;            const angle = Math.PI / 4; // 银河倾斜角度            const width = canvas.width * 0.8;            const height = canvas.height * 0.15;                        // 创建银河渐变            const gradient = ctx.createLinearGradient(                centerX - width * Math.cos(angle) / 2,                centerY - width * Math.sin(angle) / 2,                centerX + width * Math.cos(angle) / 2,                centerY + width * Math.sin(angle) / 2            );                        gradient.addColorStop(0, 'rgba(255,255,255,0)');            gradient.addColorStop(0.3, 'rgba(200,220,255,0.1)');            gradient.addColorStop(0.5, 'rgba(180,200,255,0.15)');            gradient.addColorStop(0.7, 'rgba(200,220,255,0.1)');            gradient.addColorStop(1, 'rgba(255,255,255,0)');                        ctx.save();            ctx.translate(centerX, centerY);            ctx.rotate(angle);                        // 绘制银河核心            ctx.fillStyle = gradient;            ctx.beginPath();            ctx.ellipse(0, 0, width / 2, height / 2, 0, 0, Math.PI * 2);            ctx.fill();                        // 绘制银河光晕            ctx.globalCompositeOperation = 'lighter';            ctx.filter = 'blur(10px)';            ctx.beginPath();            ctx.ellipse(0, 0, width / 2, height, 0, 0, Math.PI * 2);            ctx.fill();                        ctx.restore();        }                // 绘制星星和流星        function drawStars() {            ctx.clearRect(0, 0, canvas.width, canvas.height);            drawMilkyWay();            ctx.fillStyle = 'rgba(255, 255, 255, 0.9)';                        // 生成自然流动的流星            if (meteors.length < maxMeteors && Math.random() < 0.025) {                // 从左侧或上侧开始,更符合自然规律                const startFromTop = Math.random() > 0.7;                const x = startFromTop ?                     Math.random() * canvas.width :                     0;                const y = startFromTop ?                     0 :                     Math.random() * canvas.height * 0.8;                                // 自然的速度和角度变化                const baseSpeed = Math.random() * 2 + 3;                const speedVariation = Math.random() * 1.5;                const angle = (Math.random() - 0.5) * 0.4; // 自然的角度变化                                meteors.push({                    x: x,                    y: y,                    vx: baseSpeed * Math.cos(angle) + speedVariation,                    vy: baseSpeed * Math.sin(angle) + speedVariation * 0.5,                    life: 120, // 更长的生命周期                    length: Math.random() * 50 + 70,                    brightness: 1.3,                    tailWidth: Math.random() * 2 + 1,                    tailParticles: [] // 尾迹粒子数组                });            }                        // 绘制流星            for (let i = meteors.length - 1; i >= 0; i--) {                const meteor = meteors[i];                                // 流星主体 - 带光晕效果                ctx.save();                ctx.shadowBlur = 15;                ctx.shadowColor = `rgba(255, 255, 255, ${meteor.brightness * 0.7})`;                                // 主尾迹                const gradient = ctx.createLinearGradient(                    meteor.x, meteor.y,                    meteor.x - meteor.vx * meteor.length * 0.7, meteor.y - meteor.vy * meteor.length * 0.7                );                gradient.addColorStop(0, `rgba(255, 255, 255, ${meteor.brightness})`);                gradient.addColorStop(1, `rgba(180, 200, 255, ${meteor.brightness * 0.2})`);                                ctx.strokeStyle = gradient;                ctx.lineWidth = meteor.tailWidth;                ctx.beginPath();                ctx.moveTo(meteor.x, meteor.y);                ctx.lineTo(meteor.x - meteor.vx * meteor.length * 0.7, meteor.y - meteor.vy * meteor.length * 0.7);                ctx.stroke();                                // 次尾迹 - 更淡更长的效果                ctx.strokeStyle = `rgba(180, 200, 255, ${meteor.brightness * 0.15})`;                ctx.lineWidth = meteor.tailWidth * 0.6;                ctx.beginPath();                ctx.moveTo(meteor.x - meteor.vx * meteor.length * 0.3, meteor.y - meteor.vy * meteor.length * 0.3);                ctx.lineTo(meteor.x - meteor.vx * meteor.length, meteor.y - meteor.vy * meteor.length);                ctx.stroke();                                ctx.restore();                                // 随机生成尾迹粒子                if (Math.random() < 0.3) {                    meteor.tailParticles.push({                        x: meteor.x - meteor.vx * Math.random() * meteor.length * 0.5,                        y: meteor.y - meteor.vy * Math.random() * meteor.length * 0.5,                        life: 20 + Math.random() * 30,                        size: Math.random() * 1.5 + 0.5                    });                }                                // 绘制尾迹粒子                meteor.tailParticles.forEach((particle, index) => {                    ctx.fillStyle = `rgba(255, 255, 255, ${particle.life / 50})`;                    ctx.beginPath();                    ctx.arc(particle.x, particle.y, particle.size, 0, Math.PI * 2);                    ctx.fill();                                        particle.life--;                    if (particle.life <= 0) {                        meteor.tailParticles.splice(index, 1);                    }                });                                // 流星头部                ctx.fillStyle = `rgba(255, 255, 255, ${meteor.brightness})`;                ctx.beginPath();                ctx.arc(meteor.x, meteor.y, 2, 0, Math.PI * 2);                ctx.fill();                                // 更新流星位置和生命周期                meteor.x += meteor.vx;                meteor.y += meteor.vy;                meteor.life--;                meteor.brightness = meteor.life / 100;                                // 移除消失的流星                if (meteor.life <= 0 ||                     meteor.x < 0 || meteor.x > canvas.width ||                     meteor.y < 0 || meteor.y > canvas.height) {                    meteors.splice(i, 1);                }            }                        stars.forEach(star => {                ctx.beginPath();                ctx.arc(star.x, star.y, star.radius, 0, Math.PI * 2);                ctx.fill();                                // 星星闪烁效果                star.brightness += (Math.random() - 0.5) * star.twinkleSpeed;                star.brightness = Math.max(0.3, Math.min(1, star.brightness));                ctx.globalAlpha = star.brightness * 0.9 + 0.1; // 确保最小可见度                                // 星星移动                star.x += star.vx;                star.y += star.vy;                                // 边界检查                if (star.x < 0) star.x = canvas.width;                if (star.x > canvas.width) star.x = 0;                if (star.y < 0) star.y = canvas.height;                if (star.y > canvas.height) star.y = 0;            });                        requestAnimationFrame(drawStars);        }                // 窗口大小调整时重设画布大小        window.addEventListener('resize', () => {            canvas.width = window.innerWidth;            canvas.height = window.innerHeight;        });                // 添加诗歌文字        function addPoems() {            const container = document.getElementById('poems-container');            const poems = [                "山有木兮木有枝,心悦君兮君不知。",                "春蚕到死丝方尽,蜡炬成灰泪始干。",                "老来多健忘,唯不忘相思。",                "衣带渐宽终不悔,为伊消得人憔悴。",                "晓看天色暮看云,行也思君,坐也思君。",                "曾经沧海难为水,除却巫山不是云。",                "愿我如星君如月,夜夜流光相皎洁。",                "只愿君心似我心,定不负相思意。",                "换我心,为你心,始知相忆深。",                "既见君子,云胡不喜?",                "南风知我意,吹梦到西洲。",                "枕前发尽千般愿,要休且待青山烂。"            ];                        poems.forEach((line, index) => {                const poem = document.createElement('div');                poem.className = 'poem';                poem.textContent = line;                                // 优化分布算法 - 确保不重叠且均匀分布                const col = index % 4;                const row = Math.floor(index / 4);                const left = 15 + col * 25 + (Math.random() * 10 - 5);                const top = 10 + row * 20 + (Math.random() * 10 - 5);                const delay = index * 1.2 + Math.random() * 2;                                poem.style.left = `${left}%`;                poem.style.top = `${top}%`;                poem.style.animationDelay = `${delay}s`;                poem.style.animationDuration = `${8 + Math.random() * 4}s`;                                container.appendChild(poem);            });        }                // 开始动画        drawStars();        addPoems();    </script></body></html>
复制代码


用户头像

码随心动,快人一步,更懂你的智能代码助手 2025-06-18 加入

基于文心大模型,结合百度积累多年的编程现场大数据和外部优秀开源数据,为你生成更符合实际研发场景的优质代码。提升编码效率,释放“十倍“软件生产力。

评论

发布
暂无评论
七夕,画个动态星空送给Ta_七夕_Comate编码助手_InfoQ写作社区