CSS响应式布局卡片

实现的效果截图

可以直接复制代码,在浏览器中打开。

响应式卡片网格布局

我将创建一个使用CSS Grid实现的响应式卡片布局,当容器宽度变化时,卡片会自动调整每行显示的数量。

思路分析

  1. 使用CSS Grid的auto-fitminmax()函数实现自适应布局
  2. 设置断点确保在不同屏幕尺寸下都有良好的显示效果
  3. 添加平滑的过渡效果提升用户体验
  4. 设计简洁美观的卡片样式

最终实现代码

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>

功能说明

  1. 响应式布局 :使用CSS Grid的auto-fillminmax()函数,卡片会根据容器宽度自动调整每行显示的数量。

  2. 交互控制

    • 窄容器:每行显示1-2张卡片
    • 中等容器:每行显示2-3张卡片
    • 宽容器:每行显示3-4张卡片
    • 全宽容器:每行显示4张或更多卡片
  3. 视觉效果

    • 卡片悬停效果
    • 平滑的布局过渡
    • 美观的阴影和颜色设计
  4. 移动端适配

    • 在小屏幕上自动调整为单列布局
    • 触摸友好的按钮大小

这个实现展示了如何使用CSS Grid创建灵活、响应式的卡片布局,无需媒体查询即可适应不同宽度的容器。

相关推荐
苏打水com14 小时前
第十篇:Day28-30 工程化优化与部署——从“能跑”到“好用”(对标职场“项目上线”需求)
前端·css·vue·html·js
用户66006766853914 小时前
纯 CSS 复刻星战开场:让文字在宇宙中滚动
前端·css
李少兄15 小时前
前端开发中的多列布局(Multi-column Layout)
前端·css
苏打水com15 小时前
第十一篇:Day31-33 前端安全与性能监控——从“能用”到“安全可靠”(对标职场“系统稳定性”需求)
前端·javascript·css·vue.js·html
syt_101316 小时前
grid布局之-子项放置1
前端·javascript·css
syt_101316 小时前
grid布局之-子项放置2
前端·javascript·css
Youyzq1 天前
前端项目发布到cdn上css被编译失效问题rgba失效和rgb失效
前端·css·算法·cdn
茄汁面1 天前
实现紧贴边框的高亮流光动画效果(长方形适配)
前端·javascript·css
小明记账簿1 天前
解锁前端新技能:让JavaScript与CSS变量共舞
前端·javascript·css
棒棒的唐2 天前
avue uploader图片预览拉伸变型的css处理方法
前端·css