本源码是一款仪式感十足的婚礼电子邀请函单页模板,整体采用香槟金、米白与淡粉腮红三种暖色调,气质温柔雅致,符合中式婚礼与西式简约婚礼的双重审美。页面以新人姓名、婚期倒计时和邀约语作为首屏视觉中心,让受邀宾客第一时间感受到婚礼的浪漫与庄重。
设计亮点非常丰富:首屏双框线边框与 SVG 爱心分隔线营造复古请柬质感;倒计时模块实时显示距离婚礼的天、时、分、秒;爱情故事采用时间轴方式展现相识、相伴、定居、相守四个节点;时光剪影相册使用六宫格渐变占位展示;信息卡片区、当日流程表与在线回执表单相互独立,区块之间节奏清晰。所有交互均为原生 HTML/CSS/JS,无外部依赖,可直接保存为单文件使用。
适合准新人作为婚礼请柬投放到朋友圈、微信群或公众号,也适合婚庆公司、独立设计师作为客户演示模板。只需替换姓名、婚期、地点与故事内容,即可快速生成专属电子请柬。

使用教程
1. 下载与保存
将下方 HTML 源码全部复制,保存为 index.html 文件(注意文件后缀必须是 .html)。
2. 本地预览
直接双击 index.html 文件,浏览器会自动打开并渲染页面效果。也可以在文件夹内运行 python -m http.server 后访问 localhost:8000 进行预览。
3. 自定义修改
替换文字:直接编辑 HTML 中的标题、段落文本与链接。调整配色:修改 <style> 标签内的 CSS 变量(:root 部分)或具体颜色值。更换图片:将 <img> 的 src 属性换成你自己的图片地址,或将背景渐变替换为 background-image。
4. 上线部署
将 index.html 上传到任意支持静态网页托管的服务(GitHub Pages、Vercel、Netlify、阿里云 OSS、腾讯云 COS 等)即可获得独立访问网址。
HTML 源码
复制下方完整代码,保存为 .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{
--champagne:#c8a96a;
--champagne-l:#e3cf9f;
--blush:#f6ece6;
--cream:#fdfaf6;
--ink:#3b332c;
--ink-soft:#7d7166;
--line:#e8ddd0;
}
*{margin:0;padding:0;box-sizing:border-box}
body{
font-family:"Songti SC","Noto Serif SC",Georgia,"Times New Roman",serif;
background:var(--cream);
color:var(--ink);
line-height:1.9;
-webkit-font-smoothing:antialiased;
}
.wrap{max-width:760px;margin:0 auto;background:#fff;box-shadow:0 0 60px rgba(180,150,110,.14)}
/* ---------- 封面 ---------- */
.cover{
position:relative;
padding:88px 32px 76px;
text-align:center;
background:
radial-gradient(circle at 20% 10%, rgba(227,207,159,.32), transparent 55%),
radial-gradient(circle at 82% 88%, rgba(246,236,230,.9), transparent 60%),
linear-gradient(160deg,#fffdf9,#f8efe4);
overflow:hidden;
}
.cover::before,.cover::after{
content:"";position:absolute;border:1px solid var(--champagne-l);
}
.cover::before{inset:18px;opacity:.55}
.cover::after{inset:26px;opacity:.3}
.orn{
display:flex;align-items:center;justify-content:center;gap:14px;
margin-bottom:26px;color:var(--champagne);
}
.orn span{display:block;width:56px;height:1px;background:var(--champagne)}
.orn svg{width:22px;height:22px}
.pre{
font-size:12px;letter-spacing:.55em;text-transform:uppercase;
color:var(--ink-soft);margin-bottom:34px;font-family:"Helvetica Neue",Arial,sans-serif;
}
.names{
font-size:clamp(38px,7.6vw,62px);
letter-spacing:.06em;line-height:1.35;font-weight:400;
}
.amp{
display:block;font-size:26px;color:var(--champagne);
margin:10px 0;font-style:italic;font-family:Georgia,serif;
}
.tagline{
margin-top:26px;font-size:15px;color:var(--ink-soft);letter-spacing:.14em;
}
.date-badge{
display:inline-flex;align-items:center;gap:20px;margin-top:40px;
padding:16px 30px;border-top:1px solid var(--champagne-l);border-bottom:1px solid var(--champagne-l);
}
.date-badge .d{font-size:34px;letter-spacing:.04em}
.date-badge .m{font-size:12px;letter-spacing:.3em;color:var(--ink-soft);
font-family:"Helvetica Neue",Arial,sans-serif;text-align:center}
/* ---------- 倒计时 ---------- */
.count{
display:flex;justify-content:center;gap:10px;flex-wrap:wrap;
padding:38px 24px;background:var(--blush);
}
.cbox{
min-width:82px;padding:14px 8px;background:#fff;border-radius:4px;
text-align:center;box-shadow:0 4px 14px rgba(190,160,120,.1);
}
.cbox b{display:block;font-size:30px;color:var(--champagne);font-weight:500}
.cbox i{
font-style:normal;font-size:11px;letter-spacing:.24em;color:var(--ink-soft);
font-family:"Helvetica Neue",Arial,sans-serif;
}
/* ---------- 通用区块 ---------- */
section{padding:64px 40px}
.sec-title{
text-align:center;margin-bottom:44px;
}
.sec-title small{
display:block;font-size:11px;letter-spacing:.42em;color:var(--champagne);
text-transform:uppercase;margin-bottom:12px;font-family:"Helvetica Neue",Arial,sans-serif;
}
.sec-title h2{font-size:26px;font-weight:400;letter-spacing:.16em}
/* ---------- 我们的故事 ---------- */
.story{background:#fff}
.timeline{position:relative;max-width:520px;margin:0 auto;padding-left:34px}
.timeline::before{
content:"";position:absolute;left:7px;top:8px;bottom:8px;width:1px;background:var(--line);
}
.tl-item{position:relative;padding-bottom:30px}
.tl-item:last-child{padding-bottom:0}
.tl-item::before{
content:"";position:absolute;left:-31px;top:9px;width:11px;height:11px;
border-radius:50%;background:#fff;border:1px solid var(--champagne);
}
.tl-item h4{font-size:16px;font-weight:500;letter-spacing:.06em}
.tl-item .yr{
font-size:12px;color:var(--champagne);letter-spacing:.2em;
font-family:"Helvetica Neue",Arial,sans-serif;
}
.tl-item p{font-size:14px;color:var(--ink-soft);margin-top:4px}
/* ---------- 相册 ---------- */
.gallery{background:var(--blush)}
.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;max-width:600px;margin:0 auto}
.ph{
aspect-ratio:3/4;border-radius:3px;position:relative;overflow:hidden;
display:flex;align-items:flex-end;justify-content:center;padding-bottom:12px;
font-size:11px;letter-spacing:.2em;color:rgba(255,255,255,.9);
font-family:"Helvetica Neue",Arial,sans-serif;
}
.ph:nth-child(1){background:linear-gradient(150deg,#d9c3a5,#b99b74)}
.ph:nth-child(2){background:linear-gradient(150deg,#e6d3cb,#c9a99c)}
.ph:nth-child(3){background:linear-gradient(150deg,#cbc4b4,#a29a89)}
.ph:nth-child(4){background:linear-gradient(150deg,#dccbb0,#bfa27c)}
.ph:nth-child(5){background:linear-gradient(150deg,#e9dcd0,#cbb49c)}
.ph:nth-child(6){background:linear-gradient(150deg,#c9baa8,#a3937f)}
.ph.tall{aspect-ratio:3/4}
/* ---------- 婚礼信息 ---------- */
.info{background:#fff}
.info-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;max-width:600px;margin:0 auto}
.card{
border:1px solid var(--line);padding:26px 22px;text-align:center;background:var(--cream);
}
.card .ic{
width:42px;height:42px;margin:0 auto 14px;border-radius:50%;
border:1px solid var(--champagne-l);display:flex;align-items:center;justify-content:center;
color:var(--champagne);
}
.card h4{font-size:15px;letter-spacing:.14em;font-weight:500;margin-bottom:8px}
.card p{font-size:13.5px;color:var(--ink-soft);line-height:1.8}
.card .hl{color:var(--champagne);font-size:15px;display:block;margin-top:4px}
/* ---------- 流程 ---------- */
.flow{background:var(--blush)}
.flow-list{max-width:460px;margin:0 auto}
.flow-row{
display:flex;align-items:baseline;gap:18px;padding:13px 0;
border-bottom:1px dashed var(--line);
}
.flow-row:last-child{border-bottom:none}
.flow-row .t{
font-size:14px;color:var(--champagne);letter-spacing:.08em;min-width:62px;
font-family:"Helvetica Neue",Arial,sans-serif;
}
.flow-row .n{font-size:14.5px}
.flow-row .n em{font-style:normal;display:block;font-size:12.5px;color:var(--ink-soft)}
/* ---------- RSVP ---------- */
.rsvp{background:#fff;text-align:center}
.rsvp p.lead{
max-width:460px;margin:0 auto 30px;font-size:14.5px;color:var(--ink-soft);
}
.form{max-width:400px;margin:0 auto;text-align:left}
.field{margin-bottom:16px}
.field label{
display:block;font-size:11px;letter-spacing:.24em;color:var(--ink-soft);
margin-bottom:7px;font-family:"Helvetica Neue",Arial,sans-serif;
}
.field input,.field select,.field textarea{
width:100%;padding:11px 13px;border:1px solid var(--line);background:var(--cream);
font-family:inherit;font-size:14px;color:var(--ink);border-radius:2px;outline:none;
transition:border-color .2s;
}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--champagne)}
.field textarea{resize:vertical;min-height:74px}
.radio-row{display:flex;gap:10px}
.radio-row label{
flex:1;text-align:center;padding:11px 0;border:1px solid var(--line);cursor:pointer;
font-size:13.5px;letter-spacing:.1em;background:var(--cream);transition:.2s;
font-family:inherit;color:var(--ink);margin:0;
}
.radio-row input{display:none}
.radio-row input:checked + span{color:#fff}
.radio-row label:has(input:checked){background:var(--champagne);border-color:var(--champagne);color:#fff}
.btn{
width:100%;margin-top:8px;padding:14px;background:var(--champagne);color:#fff;
border:none;font-family:inherit;font-size:14px;letter-spacing:.3em;cursor:pointer;
transition:background .25s;border-radius:2px;
}
.btn:hover{background:#b3945a}
/* ---------- 页脚 ---------- */
footer{
padding:46px 30px;text-align:center;background:linear-gradient(160deg,#f8efe4,#fffdf9);
border-top:1px solid var(--line);
}
footer .bless{font-size:15px;letter-spacing:.18em;color:var(--ink)}
footer .sig{
margin-top:16px;font-size:13px;color:var(--ink-soft);letter-spacing:.24em;
}
footer .tiny{
margin-top:22px;font-size:11px;color:#b7ab9d;letter-spacing:.1em;
font-family:"Helvetica Neue",Arial,sans-serif;
}
@media(max-width:640px){
section{padding:48px 22px}
.cover{padding:64px 22px 56px}
.info-grid{grid-template-columns:1fr}
.grid{grid-template-columns:repeat(2,1fr)}
.cbox{min-width:70px}
}
</style>
</head>
<body>
<div class="wrap">
<!-- 封面 -->
<header class="cover">
<div class="orn">
<span></span>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2">
<path d="M12 21s-7-4.6-9-9a5 5 0 0 1 9-3 5 5 0 0 1 9 3c-2 4.4-9 9-9 9z"/>
</svg>
<span></span>
</div>
<div class="pre">We are getting married</div>
<h1 class="names">
沈亦舟
<em class="amp">&</em>
林知夏
</h1>
<p class="tagline">诚挚邀请您见证我们的幸福时刻</p>
<div class="date-badge">
<div class="m">2026<br>OCT</div>
<div class="d">18</div>
<div class="m">星期日<br>农历九月初八</div>
</div>
</header>
<!-- 倒计时 -->
<div class="count">
<div class="cbox"><b id="dd">88</b><i>DAYS</i></div>
<div class="cbox"><b id="hh">06</b><i>HOURS</i></div>
<div class="cbox"><b id="mm">42</b><i>MINUTES</i></div>
<div class="cbox"><b id="ss">15</b><i>SECONDS</i></div>
</div>
<!-- 我们的故事 -->
<section class="story">
<div class="sec-title"><small>Our Story</small><h2>我 们 的 故 事</h2></div>
<div class="timeline">
<div class="tl-item">
<div class="yr">2019 · 初 见</div>
<h4>在城南的旧书店</h4>
<p>你伸手取下最后一本《人间草木》,而我恰好也伸出了手。</p>
</div>
<div class="tl-item">
<div class="yr">2021 · 相 伴</div>
<h4>第一次一起看海</h4>
<p>凌晨四点的海边,我们裹着同一条毯子等日出,你说以后每年都要来。</p>
</div>
<div class="tl-item">
<div class="yr">2024 · 定 居</div>
<h4>有了自己的小家</h4>
<p>阳台上种满了绿萝和薄荷,厨房里永远有你煮的红豆汤。</p>
</div>
<div class="tl-item">
<div class="yr">2026 · 相 守</div>
<h4>愿以余生共此山海</h4>
<p>这一次,我想把承诺说给所有爱我们的人听。</p>
</div>
</div>
</section>
<!-- 相册 -->
<section class="gallery">
<div class="sec-title"><small>Gallery</small><h2>时 光 剪 影</h2></div>
<div class="grid">
<div class="ph">初 见</div>
<div class="ph">春 日</div>
<div class="ph">海 边</div>
<div class="ph">旅 途</div>
<div class="ph">日 常</div>
<div class="ph">此 刻</div>
</div>
</section>
<!-- 婚礼信息 -->
<section class="info">
<div class="sec-title"><small>Wedding Details</small><h2>婚 礼 信 息</h2></div>
<div class="info-grid">
<div class="card">
<div class="ic">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.3">
<rect x="3" y="5" width="18" height="16" rx="2"/><path d="M8 3v4M16 3v4M3 10h18"/>
</svg>
</div>
<h4>婚礼时间</h4>
<p>2026 年 10 月 18 日<span class="hl">星期日 · 中午 12:00</span>请于 11:30 前入场就座</p>
</div>
<div class="card">
<div class="ic">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.3">
<path d="M12 21s-7-6-7-11a7 7 0 1 1 14 0c0 5-7 11-7 11z"/><circle cx="12" cy="10" r="2.6"/>
</svg>
</div>
<h4>婚礼地点</h4>
<p>云栖山庄 · 听澜厅<span class="hl">杭州市西湖区云栖路 66 号</span>停车场入口在酒店西侧</p>
</div>
<div class="card">
<div class="ic">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.3">
<path d="M22 16.9v3a2 2 0 0 1-2.2 2 19.8 19.8 0 0 1-8.6-3.1 19.5 19.5 0 0 1-6-6A19.8 19.8 0 0 1 2.1 4.2 2 2 0 0 1 4.1 2h3a2 2 0 0 1 2 1.7c.1 1 .4 1.9.7 2.8a2 2 0 0 1-.5 2.1L8.1 9.9a16 16 0 0 0 6 6l1.3-1.2a2 2 0 0 1 2.1-.5c.9.3 1.8.6 2.8.7a2 2 0 0 1 1.7 2z"/>
</svg>
</div>
<h4>联系我们</h4>
<p>新郎 沈亦舟<span class="hl">138 0000 1234</span>新娘 林知夏 · 139 0000 5678</p>
</div>
<div class="card">
<div class="ic">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.3">
<path d="M20 12v7a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-7"/><rect x="2" y="7" width="20" height="5" rx="1"/><path d="M12 21V7M12 7S9.5 3 7.5 4.2 9 7 12 7s6.5-1.5 4.5-2.8S12 7 12 7z"/>
</svg>
</div>
<h4>着装建议</h4>
<p>半正式 Semi-Formal<span class="hl">香槟 · 米白 · 淡雾蓝</span>请避免纯白与大红色系</p>
</div>
</div>
</section>
<!-- 当日流程 -->
<section class="flow">
<div class="sec-title"><small>Schedule</small><h2>当 日 流 程</h2></div>
<div class="flow-list">
<div class="flow-row"><div class="t">11:00</div><div class="n">宾客签到<em>入口领取伴手礼与座位卡</em></div></div>
<div class="flow-row"><div class="t">11:30</div><div class="n">迎宾茶歇<em>庭院区备有甜点与气泡水</em></div></div>
<div class="flow-row"><div class="t">12:00</div><div class="n">婚礼仪式<em>听澜厅主厅 · 请提前入座</em></div></div>
<div class="flow-row"><div class="t">12:40</div><div class="n">午宴开席<em>敬酒环节约 13:30 开始</em></div></div>
<div class="flow-row"><div class="t">14:30</div><div class="n">合影留念<em>庭院拱门处 · 欢迎自由拍照</em></div></div>
<div class="flow-row"><div class="t">15:00</div><div class="n">送别宾客<em>门口备有回礼,感谢您的到来</em></div></div>
</div>
</section>
<!-- RSVP -->
<section class="rsvp">
<div class="sec-title"><small>R.S.V.P.</small><h2>回 执 确 认</h2></div>
<p class="lead">为了给每位来宾准备好座位与伴手礼,恳请您在 <b>2026 年 10 月 5 日</b> 前填写下方回执。</p>
<form class="form" onsubmit="event.preventDefault();alert('感谢您的回执,我们已收到!');">
<div class="field">
<label>您的姓名</label>
<input type="text" placeholder="请输入姓名" required>
</div>
<div class="field">
<label>是否出席</label>
<div class="radio-row">
<label><input type="radio" name="attend" checked><span>准 时 出 席</span></label>
<label><input type="radio" name="attend"><span>抱 歉 缺 席</span></label>
</div>
</div>
<div class="field">
<label>同行人数</label>
<select>
<option>仅本人</option>
<option>2 人(含伴侣)</option>
<option>3 人(含儿童)</option>
<option>4 人及以上</option>
</select>
</div>
<div class="field">
<label>饮食忌口或其他备注</label>
<textarea placeholder="如素食、过敏源、需要儿童座椅等"></textarea>
</div>
<button class="btn" type="submit">提 交 回 执</button>
</form>
</section>
<footer>
<p class="bless">愿 我 们 的 喜 悦 , 有 你 共 享</p>
<p class="sig">沈 亦 舟 · 林 知 夏 敬 邀</p>
<p class="tiny">© 2026 Wedding Invitation · 本页面为演示模板</p>
</footer>
</div>
<script>
// 倒计时
var target = new Date("2026-10-18T12:00:00").getTime();
function pad(n){return n<10?"0"+n:""+n;}
function tick(){
var diff = target - Date.now();
if(diff < 0) diff = 0;
var d = Math.floor(diff/86400000),
h = Math.floor(diff%86400000/3600000),
m = Math.floor(diff%3600000/60000),
s = Math.floor(diff%60000/1000);
document.getElementById("dd").textContent = d;
document.getElementById("hh").textContent = pad(h);
document.getElementById("mm").textContent = pad(m);
document.getElementById("ss").textContent = pad(s);
}
tick(); setInterval(tick, 1000);
</script>
</body>
</html>
原创文章,作者:小蓝IT,如若转载,请注明出处:https://www.xiaolanzy.com/1803.html
微信扫一扫
支付宝扫一扫