实现的效果截图
可以直接复制代码,在浏览器中打开。

响应式卡片网格布局
我将创建一个使用CSS Grid实现的响应式卡片布局,当容器宽度变化时,卡片会自动调整每行显示的数量。
思路分析
- 使用CSS Grid的
auto-fit和minmax()函数实现自适应布局 - 设置断点确保在不同屏幕尺寸下都有良好的显示效果
- 添加平滑的过渡效果提升用户体验
- 设计简洁美观的卡片样式
最终实现代码
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>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
color: #333;
line-height: 1.6;
padding: 20px;
min-height: 100vh;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
header {
text-align: center;
margin-bottom: 40px;
}
h1 {
font-size: 2.5rem;
margin-bottom: 10px;
color: #2c3e50;
}
.subtitle {
font-size: 1.2rem;
color: #7f8c8d;
max-width: 600px;
margin: 0 auto;
}
.controls {
display: flex;
justify-content: center;
gap: 15px;
margin: 30px 0;
flex-wrap: wrap;
}
.control-btn {
padding: 10px 20px;
background: #3498db;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
transition: all 0.3s ease;
font-weight: 600;
}
.control-btn:hover {
background: #2980b9;
transform: translateY(-2px);
}
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 25px;
transition: all 0.3s ease;
}
.card {
background: white;
border-radius: 10px;
overflow: hidden;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.card-img {
height: 180px;
width: 100%;
background-size: cover;
background-position: center;
}
.card-content {
padding: 20px;
}
.card-title {
font-size: 1.4rem;
margin-bottom: 10px;
color: #2c3e50;
}
.card-text {
color: #7f8c8d;
margin-bottom: 15px;
line-height: 1.5;
}
.card-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 15px;
padding-top: 15px;
border-top: 1px solid #eee;
}
.card-tag {
background: #ecf0f1;
color: #34495e;
padding: 5px 10px;
border-radius: 20px;
font-size: 0.8rem;
}
.card-btn {
background: #3498db;
color: white;
border: none;
padding: 8px 15px;
border-radius: 5px;
cursor: pointer;
transition: all 0.3s ease;
font-weight: 600;
}
.card-btn:hover {
background: #2980b9;
}
.info-panel {
background: white;
border-radius: 10px;
padding: 20px;
margin-top: 40px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.info-title {
font-size: 1.5rem;
margin-bottom: 15px;
color: #2c3e50;
}
.info-text {
color: #7f8c8d;
line-height: 1.6;
}
@media (max-width: 768px) {
.card-grid {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
h1 {
font-size: 2rem;
}
}
@media (max-width: 480px) {
.card-grid {
grid-template-columns: 1fr;
}
.controls {
flex-direction: column;
align-items: center;
}
.control-btn {
width: 100%;
max-width: 250px;
}
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>响应式卡片网格布局</h1>
<p class="subtitle">使用CSS Grid实现的自适应卡片布局,当容器宽度变化时,卡片会自动调整每行显示数量</p>
</header>
<div class="controls">
<button class="control-btn" onclick="adjustContainer('narrow')">窄容器</button>
<button class="control-btn" onclick="adjustContainer('medium')">中等容器</button>
<button class="control-btn" onclick="adjustContainer('wide')">宽容器</button>
<button class="control-btn" onclick="adjustContainer('full')">全宽容器</button>
</div>
<div class="card-grid" id="cardGrid">
<!-- 卡片1 -->
<div class="card">
<div class="card-img" style="background-color: #3498db;"></div>
<div class="card-content">
<h3 class="card-title">响应式设计</h3>
<p class="card-text">使用CSS Grid的auto-fit和minmax()函数,实现根据容器宽度自动调整布局。</p>
<div class="card-footer">
<span class="card-tag">CSS</span>
<button class="card-btn">了解更多</button>
</div>
</div>
</div>
<!-- 卡片2 -->
<div class="card">
<div class="card-img" style="background-color: #2ecc71;"></div>
<div class="card-content">
<h3 class="card-title">现代布局技术</h3>
<p class="card-text">Grid布局提供了强大的二维布局能力,比传统布局方法更加灵活。</p>
<div class="card-footer">
<span class="card-tag">布局</span>
<button class="card-btn">了解更多</button>
</div>
</div>
</div>
<!-- 卡片3 -->
<div class="card">
<div class="card-img" style="background-color: #e74c3c;"></div>
<div class="card-content">
<h3 class="card-title">用户体验优化</h3>
<p class="card-text">平滑的过渡效果和响应式设计确保在各种设备上都有良好的体验。</p>
<div class="card-footer">
<span class="card-tag">UX</span>
<button class="card-btn">了解更多</button>
</div>
</div>
</div>
<!-- 卡片4 -->
<div class="card">
<div class="card-img" style="background-color: #f39c12;"></div>
<div class="card-content">
<h3 class="card-title">移动优先设计</h3>
<p class="card-text">采用移动优先的设计策略,确保在小屏幕设备上也有出色的表现。</p>
<div class="card-footer">
<span class="card-tag">移动端</span>
<button class="card-btn">了解更多</button>
</div>
</div>
</div>
<!-- 卡片5 -->
<div class="card">
<div class="card-img" style="background-color: #9b59b6;"></div>
<div class="card-content">
<h3 class="card-title">CSS变量应用</h3>
<p class="card-text">使用CSS变量使代码更加模块化,便于维护和主题切换。</p>
<div class="card-footer">
<span class="card-tag">CSS变量</span>
<button class="card-btn">了解更多</button>
</div>
</div>
</div>
<!-- 卡片6 -->
<div class="card">
<div class="card-img" style="background-color: #1abc9c;"></div>
<div class="card-content">
<h3 class="card-title">无障碍访问</h3>
<p class="card-text">遵循无障碍设计原则,确保所有用户都能方便地使用网站。</p>
<div class="card-footer">
<span class="card-tag">可访问性</span>
<button class="card-btn">了解更多</button>
</div>
</div>
</div>
</div>
<div class="info-panel">
<h3 class="info-title">实现原理</h3>
<p class="info-text">
这个布局使用了CSS Grid的<code>grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));</code>属性。
当容器宽度变化时,Grid会自动计算可以容纳的卡片数量,并相应地调整布局。
在窄屏幕上,每行显示较少的卡片;在宽屏幕上,每行显示更多的卡片。
</p>
</div>
</div>
<script>
function adjustContainer(size) {
const container = document.querySelector('.container');
const cardGrid = document.getElementById('cardGrid');
// 移除之前可能存在的类
container.classList.remove('narrow', 'medium', 'wide', 'full');
// 根据选择添加相应的类
if (size === 'narrow') {
container.classList.add('narrow');
container.style.maxWidth = '600px';
} else if (size === 'medium') {
container.classList.add('medium');
container.style.maxWidth = '800px';
} else if (size === 'wide') {
container.classList.add('wide');
container.style.maxWidth = '1000px';
} else if (size === 'full') {
container.classList.add('full');
container.style.maxWidth = '1200px';
}
}
</script>
</body>
</html>
功能说明
-
响应式布局 :使用CSS Grid的
auto-fill和minmax()函数,卡片会根据容器宽度自动调整每行显示的数量。 -
交互控制:
- 窄容器:每行显示1-2张卡片
- 中等容器:每行显示2-3张卡片
- 宽容器:每行显示3-4张卡片
- 全宽容器:每行显示4张或更多卡片
-
视觉效果:
- 卡片悬停效果
- 平滑的布局过渡
- 美观的阴影和颜色设计
-
移动端适配:
- 在小屏幕上自动调整为单列布局
- 触摸友好的按钮大小
这个实现展示了如何使用CSS Grid创建灵活、响应式的卡片布局,无需媒体查询即可适应不同宽度的容器。