电商项目通用优惠券 HTML 组件实战
在电商类项目中,优惠券是高频业务组件。本文分享一套经过实际业务打磨的优惠券 HTML 组件,支持 PC 与移动端自适应,内置多主题及多状态样式,代码开箱即用。
核心特性
- 多端适配:PC 端采用网格自动填充,卡片多列平铺并带有悬停上浮效果;移动端自动切换为单列布局,字号与高度智能缩放,确保内容不拥挤。
- 状态丰富:内置过期、已使用状态逻辑。对应状态下卡片整体置灰,右上角通过旋转印章标记状态,操作按钮自动禁用。
- 风格多样:提供多种渐变主题色,同时包含简约白底版本,适用于浅色页面及商务风格场景。
PC 端效果图
移动端效果图
完整代码实现
以下代码包含完整的 HTML 结构与 CSS 样式,无第三方依赖,可直接复制运行。
<!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>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: #f5f6f8;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
padding: 40px 20px;
min-height: 100vh;
}
.container {
max-width: 900px;
margin: 0 auto;
}
.coupon-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));
gap: 20px;
margin-bottom:15px;
}
.coupon {
position: relative;
display: flex;
height: 140px;
border-radius: 10px;
overflow: hidden;
color: #fff;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.coupon:hover {
transform: translateY(-2px);
}
.coupon-theme-red {
background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);
box-shadow: 0 4px 12px rgba(255, 77, 79, 0.25);
}
.coupon-theme-orange {
background: linear-gradient(135deg, #fa8c16 0%, #ffa940 100%);
box-shadow: 0 4px 12px rgba(250, 140, 22, 0.25);
}
.coupon-theme-purple {
background: linear-gradient(135deg, #722ed1 0%, #9254de 100%);
box-shadow: 0 4px 12px rgba(114, 46, 209, 0.25);
}
.coupon-theme-blue {
background: linear-gradient(135deg, #1890ff 0%, #40a9ff 100%);
box-shadow: 0 4px 12px rgba(24, 144, 255, 0.25);
}
.coupon::after {
content: "";
position: absolute;
left: 130px;
top: 12px;
bottom: 12px;
width: 0;
border-left: 1px dashed rgba(255, 255, 255, 0.4);
z-index: 1;
}
.coupon-left {
width: 130px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.coupon-amount {
display: flex;
align-items: baseline;
font-weight: 700;
line-height: 1;
}
.coupon-amount .currency {
font-size: 18px;
margin-right: 2px;
}
.coupon-amount .value {
font-size: 40px;
}
.coupon-amount .unit {
font-size: 16px;
margin-left: 2px;
}
.coupon-condition {
font-size: 12px;
opacity: 0.9;
margin-top: 8px;
}
.coupon-right {
flex: 1;
padding: 18px 16px;
display: flex;
flex-direction: column;
justify-content: space-between;
min-width: 0;
}
.coupon-info {
flex: 1;
}
.coupon-name {
font-size: 16px;
font-weight: 600;
margin-bottom: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.coupon-desc {
font-size: 12px;
opacity: 0.85;
line-height: 1.5;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.coupon-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 10px;
}
.coupon-validity {
font-size: 11px;
opacity: 0.75;
}
.coupon-btn {
background: #fff;
border: none;
border-radius: 14px;
padding: 5px 14px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: opacity 0.2s;
flex-shrink: 0;
}
.coupon-btn:hover {
opacity: 0.9;
}
.coupon-theme-red .coupon-btn { color: #ff4d4f; }
.coupon-theme-orange .coupon-btn { color: #fa8c16; }
.coupon-theme-purple .coupon-btn { color: #722ed1; }
.coupon-theme-blue .coupon-btn { color: #1890ff; }
.coupon-claimed .coupon-btn {
background: rgba(255, 255, 255, 0.2);
color: #fff;
cursor: default;
}
.coupon-expired {
background: linear-gradient(135deg, #bfbfbf 0%, #d9d9d9 100%) !important;
box-shadow: none !important;
color: #8c8c8c;
}
.coupon-expired::after {
border-left-color: rgba(0, 0, 0, 0.12);
}
.coupon-expired .coupon-btn {
background: #f0f0f0;
color: #bfbfbf;
cursor: not-allowed;
}
.coupon-expired .coupon-amount,
.coupon-expired .coupon-name,
.coupon-expired .coupon-desc {
color: #8c8c8c;
}
.coupon-used {
background: linear-gradient(135deg, #d9d9d9 0%, #e8e8e8 100%) !important;
box-shadow: none !important;
color: #999;
}
.coupon-used::after {
border-left-color: rgba(0, 0, 0, 0.1);
}
.coupon-used .coupon-btn {
background: #f5f5f5;
color: #bfbfbf;
cursor: default;
}
.coupon-stamp {
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%) rotate(-15deg);
border: 2px solid currentColor;
border-radius: 6px;
padding: 4px 10px;
font-size: 14px;
font-weight: 700;
opacity: 0.5;
z-index: 2;
letter-spacing: 2px;
}
.coupon-horizontal {
height: 100px;
}
.coupon-horizontal .coupon-left {
width: 110px;
}
.coupon-horizontal::after {
left: 110px;
}
.coupon-horizontal .coupon-amount .value {
font-size: 32px;
}
.coupon-horizontal .coupon-right {
padding: 14px 14px;
}
.coupon-horizontal .coupon-name {
font-size: 14px;
}
.coupon-horizontal .coupon-desc {
-webkit-line-clamp: 1;
}
.coupon-minimal {
background: #fff !important;
color: #333 !important;
border: 1px solid #eee;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06) !important;
}
.coupon-minimal::after {
border-left-color: #eee;
}
.coupon-minimal .coupon-amount {
color: #ff4d4f;
}
.coupon-minimal .coupon-condition {
color: #999;
}
.coupon-minimal .coupon-name {
color: #333;
}
.coupon-minimal .coupon-desc {
color: #999;
}
.coupon-minimal .coupon-validity {
color: #bbb;
}
.coupon-minimal .coupon-btn {
background: #ff4d4f;
color: #fff;
}
@media (max-width: 480px) {
body {
padding: 20px 12px;
}
.coupon-grid {
grid-template-columns: 1fr;
gap: 14px;
}
.coupon {
height: 120px;
}
.coupon-left {
width: 110px;
}
.coupon::after {
left: 110px;
}
.coupon-amount .value {
font-size: 32px;
}
.coupon-right {
padding: 14px 12px;
}
.coupon-name {
font-size: 14px;
}
.coupon-desc {
font-size: 11px;
}
.coupon-btn {
padding: 4px 12px;
font-size: 11px;
}
}
</style>
</head>
<body>
<div class="container">
<div class="coupon-grid">
<div class="coupon coupon-theme-red">
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">50</span>
</div>
<div class="coupon-condition">满 200 可用</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">全场通用券</div>
<div class="coupon-desc">全店商品可用,不与其他活动叠加</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">有效期至 2026-12-31</span>
<button class="coupon-btn">立即领取</button>
</div>
</div>
</div>
<div class="coupon coupon-theme-orange">
<div class="coupon-left">
<div class="coupon-amount">
<span class="value">8.5</span>
<span class="unit">折</span>
</div>
<div class="coupon-condition">无门槛</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">新人专享折扣券</div>
<div class="coupon-desc">首次下单用户专享,全场商品通用</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">领取后 7 天内有效</span>
<button class="coupon-btn">立即领取</button>
</div>
</div>
</div>
<div class="coupon coupon-theme-purple">
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">100</span>
</div>
<div class="coupon-condition">满 500 可用</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">数码品类券</div>
<div class="coupon-desc">仅限数码家电类目使用,部分商品除外</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">有效期至 2026-10-31</span>
<button class="coupon-btn">立即领取</button>
</div>
</div>
</div>
<div class="coupon coupon-theme-blue">
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">20</span>
</div>
<div class="coupon-condition">无门槛</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">会员日专享券</div>
<div class="coupon-desc">每月会员日专属,全场通用无门槛</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">仅限每月 18 日使用</span>
<button class="coupon-btn">立即领取</button>
</div>
</div>
</div>
</div>
<div class="coupon-grid">
<div class="coupon coupon-theme-red coupon-claimed">
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">50</span>
</div>
<div class="coupon-condition">满 200 可用</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">全场通用券</div>
<div class="coupon-desc">全店商品可用,不与其他活动叠加</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">有效期至 2026-12-31</span>
<button class="coupon-btn" disabled>已领取</button>
</div>
</div>
</div>
<div class="coupon coupon-theme-orange coupon-claimed">
<div class="coupon-left">
<div class="coupon-amount">
<span class="value">8.5</span>
<span class="unit">折</span>
</div>
<div class="coupon-condition">无门槛</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">新人专享折扣券</div>
<div class="coupon-desc">首次下单用户专享,全场商品通用</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">领取后 7 天内有效</span>
<button class="coupon-btn" disabled>已领取</button>
</div>
</div>
</div>
</div>
<div class="coupon-grid">
<div class="coupon coupon-expired">
<div class="coupon-stamp">已过期</div>
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">30</span>
</div>
<div class="coupon-condition">满 100 可用</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">限时促销券</div>
<div class="coupon-desc">618 活动专属,已超过使用期限</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">已于 2026-06-20 过期</span>
<button class="coupon-btn" disabled>已失效</button>
</div>
</div>
</div>
<div class="coupon coupon-used">
<div class="coupon-stamp">已使用</div>
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">80</span>
</div>
<div class="coupon-condition">满 300 可用</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">品类满减券</div>
<div class="coupon-desc">订单号:2026081500123,已使用</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">使用时间 2026-08-15</span>
<button class="coupon-btn" disabled>已使用</button>
</div>
</div>
</div>
</div>
<div class="coupon-grid">
<div class="coupon coupon-horizontal coupon-theme-red">
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">15</span>
</div>
<div class="coupon-condition">满 99 可用</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">每日签到券</div>
<div class="coupon-desc">连续签到 7 天获得,全场通用</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">3 天内有效</span>
<button class="coupon-btn">去使用</button>
</div>
</div>
</div>
<div class="coupon coupon-horizontal coupon-theme-blue">
<div class="coupon-left">
<div class="coupon-amount">
<span class="value">9</span>
<span class="unit">折</span>
</div>
<div class="coupon-condition">满 200 可用</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">服饰品类券</div>
<div class="coupon-desc">仅限服装鞋包类目,换季清仓专用</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">有效期至 2026-09-30</span>
<button class="coupon-btn">去使用</button>
</div>
</div>
</div>
</div>
<div class="coupon-grid">
<div class="coupon coupon-minimal">
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">25</span>
</div>
<div class="coupon-condition">满 150 可用</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">食品生鲜券</div>
<div class="coupon-desc">仅限食品饮料、生鲜水果类目使用</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">有效期至 2026-11-30</span>
<button class="coupon-btn">立即领取</button>
</div>
</div>
</div>
<div class="coupon coupon-minimal coupon-expired">
<div class="coupon-stamp">已过期</div>
<div class="coupon-left">
<div class="coupon-amount">
<span class="currency">¥</span>
<span class="value">10</span>
</div>
<div class="coupon-condition">无门槛</div>
</div>
<div class="coupon-right">
<div class="coupon-info">
<div class="coupon-name">新人见面礼</div>
<div class="coupon-desc">新用户注册即送,已过期未使用</div>
</div>
<div class="coupon-footer">
<span class="coupon-validity">已于 2026-07-01 过期</span>
<button class="coupon-btn" disabled>已失效</button>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
使用说明与扩展
主题切换
通过修改根元素的类名即可切换不同渐变颜色:
- 红色主题:
coupon-theme-red - 橙色主题:
coupon-theme-orange - 紫色主题:
coupon-theme-purple - 蓝色主题:
coupon-theme-blue
状态控制
- 已领取:增加类名
coupon-claimed,并将按钮添加disabled属性。 - 已过期:增加类名
coupon-expired,并在容器内添加<div class="coupon-stamp">已过期</div>。 - 已使用:增加类名
coupon-used,并在容器内添加<div class="coupon-stamp">已使用</div>。
尺寸与风格切换
- 紧凑小券:增加
coupon-horizontal类名。 - 简约白底:增加
coupon-minimal类名。
后端渲染与适配
该组件无第三方依赖,采用原生 CSS 与 HTML 编写。在后端循环输出时,仅需动态替换金额、名称、描述、有效期等文本内容,并根据业务逻辑追加对应的状态类名即可。组件内置媒体查询(Media Query),可自动适配手机浏览器,适用于 Vue、React、PHP 等各类项目。
#html 优惠券 #css 响应式 #前端实战 #H5 组件 #电商

