讲师中心 微信公众号
AI工具推荐 视频效率加速

CSS容器如何实现卡片式布局?通过box-shadow和border-radius打造卡片效果

秋雪吖_5101

秋雪吖_5101

发布时间:2025-08-28 15:26:01

|

460人浏览过

|

来源于php中文网

原创

卡片式布局通过border-radius和box-shadow实现立体感与圆角效果,结合hover交互与响应式设计,提升视觉层次与用户体验。

css容器如何实现卡片式布局?通过box-shadow和border-radius打造卡片效果

卡片式布局,说到底就是给一个容器加上一点立体感和柔和的边缘。CSS里,这主要通过

box-shadow
赋予深度,再用
border-radius
柔化尖角来实现。两者结合,就能让任何一个
div
看起来像一张可点击、可交互的卡片,这种视觉上的区隔和层次感,是现代网页设计中非常常用且高效的手段。

解决方案

要实现一个基础的卡片效果,我们通常会给一个

div
元素设置背景色、内边距,然后关键地应用
border-radius
和
box-shadow
。我个人觉得,一个好的卡片,它的阴影不应该太突兀,圆角也要适中,这样才能显得精致而不失活泼。

<div class="card-container">
  <div class="card">
    <h3 class="card-title">精选文章标题</h3>
    <p class="card-content">
      这篇内容简述了卡片式布局的核心理念,以及如何通过CSS的几个关键属性来快速构建它们。
      我们追求的不仅仅是功能,更是用户体验上的美观与舒适。
    </p>
    <a href="#" class="card-link">阅读全文 &rarr;</a>
  </div>

  <div class="card">
    <h3 class="card-title">项目展示卡片</h3>
    <p class="card-content">
      这里可以放一些项目的简介,比如技术栈、完成时间等。卡片是展示小块信息的绝佳载体。
    </p>
    <a href="#" class="card-link">查看项目 &rarr;</a>
  </div>
</div>
/* 容器,用于排列多张卡片 */
.card-container {
  display: flex;
  flex-wrap: wrap; /* 允许卡片换行 */
  gap: 25px; /* 卡片之间的间距 */
  justify-content: center; /* 居中对齐卡片 */
  padding: 30px;
  background-color: #f5f7fa; /* 稍微深一点的背景,让卡片更突出 */
}

/* 核心卡片样式 */
.card {
  background-color: #ffffff; /* 卡片背景色 */
  border-radius: 12px; /* 柔和的圆角,我通常喜欢用8px到12px之间 */
  box-shadow: 0 6px 15px rgba(0, 0, 0, 0.08); /* 关键的阴影,轻微的Y轴偏移和模糊 */
  padding: 25px;
  margin: 0; /* 间距由容器的gap控制 */
  width: calc(33% - 25px); /* 假设一行三张卡片,减去间距 */
  min-width: 280px; /* 最小宽度,防止过窄 */
  box-sizing: border-box; /* 确保padding和border不增加元素总宽度 */
  text-align: left; /* 文本左对齐 */
  transition: transform 0.3s ease, box-shadow 0.3s ease; /* 增加交互动画 */
}

.card:hover {
  transform: translateY(-8px); /* 鼠标悬停时轻微上浮,增加立体感 */
  box-shadow: 0 12px 25px rgba(0, 0, 0, 0.15); /* 阴影加深,更突出 */
}

.card-title {
  font-size: 1.5em;
  color: #333;
  margin-bottom: 10px;
}

.card-content {
  font-size: 0.95em;
  color: #666;
  line-height: 1.6;
  margin-bottom: 20px;
}

.card-link {
  display: inline-block;
  color: #007bff;
  text-decoration: none;
  font-weight: bold;
  transition: color 0.2s ease;
}

.card-link:hover {
  color: #0056b3;
}

/* 响应式调整 */
@media (max-width: 768px) {
  .card {
    width: calc(50% - 25px); /* 两张卡片一行 */
  }
}

@media (max-width: 480px) {
  .card {
    width: 100%; /* 单张卡片一行 */
  }
}

box-shadow
的参数详解与高级应用:如何调整阴影实现不同深度和方向感?

box-shadow
这个属性,初看很简单,不就是给盒子加个阴影嘛。但实际上,它能玩的花样可太多了,远不止一个简单的灰色模糊。它有几个核心参数:
h-offset
(水平偏移)、
v-offset
(垂直偏移)、
blur-radius
(模糊半径)、
spread-radius
(扩散半径)和
color
(颜色),以及一个可选的
inset
关键字。

在我看来,掌握阴影的关键在于理解光线的方向。一个好的阴影能暗示光线从哪里来,从而赋予元素真实的立体感。

立即学习“前端免费学习笔记(深入)”;

  • h-offset
    和
    v-offset
    (水平/垂直偏移):
    这决定了阴影相对于元素的位置。正值向右/向下偏移,负值向左/向上。如果你想模拟光线从左上方打过来,那么阴影就应该向右下方偏移,即
    h-offset
    和
    v-offset
    都取正值。反之亦然。我发现很多初学者会把这两个值设得很大,结果阴影看起来就像是盒子旁边多了一块黑斑,而不是盒子本身投射的影子。
  • blur-radius
    (模糊半径):
    这是让阴影看起来自然的关键。值越大,阴影越模糊,看起来就越“远”或越“柔和”。我通常喜欢用一个比偏移量稍大的模糊半径,这样阴影的边缘就不会显得太生硬。例如,
    0 6px 15px
    中的
    15px
    就是模糊半径,它比
    6px
    的垂直偏移大,这样阴影就显得比较柔和。
  • spread-radius
    (扩散半径):
    这个参数可以控制阴影的大小。正值会使阴影向外扩散,负值则会使其向内收缩。我个人在设计卡片时很少使用很大的扩散半径,因为它很容易让阴影看起来像一个背景色块,而不是真实的投影。通常,我会保持它为0或者很小的正值,除非我刻意想要一个更宽的阴影区域。
  • color
    (颜色):
    阴影颜色不一定非得是黑色。一个好的做法是使用
    rgba
    ,让阴影带一点透明度。
    rgba(0, 0, 0, 0.1)
    是一个非常经典的用法,它能让阴影自然地融入背景,而不是突兀地跳出来。有时候,我也会根据页面的主色调选择一个略带色彩的深色阴影,比如深蓝色或深灰色,这样能让整个设计更协调。
  • inset
    (内阴影):
    这个关键字会让阴影出现在元素的内部,模拟一种“下陷”的效果。这在卡片设计中不常用,但在按钮、输入框等需要内凹效果的组件上非常有用。

高级应用:多层阴影

box-shadow
最酷的地方之一就是可以叠加多个阴影。你可以用逗号分隔不同的阴影声明。这能模拟更复杂的光照效果,比如一个轻微的底部阴影加上一个更模糊、范围更大的背景阴影,这样能营造出一种“卡片浮动在另一个平面上”的感觉。

.card-advanced-shadow {
  /* 第一层:模拟近距离、更实体的阴影 */
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.07),
              /* 第二层:模拟远距离、更扩散、更模糊的阴影 */
              0 10px 20px rgba(0, 0, 0, 0.12);
  border-radius: 10px;
  background-color: #fff;
  padding: 20px;
}

这种多层阴影的组合,能让卡片在视觉上拥有更丰富的层次感,避免了单层阴影可能带来的扁平感。不过,也要注意,阴影越多,对性能的开销可能就越大,所以要适度。

border-radius
的灵活运用与常见陷阱:除了圆角,还能玩出什么花样?有没有什么需要注意的地方?

border-radius
,这个属性大家都很熟悉,就是让元素的边角变圆。但它远不止“圆角”这么简单,它的灵活度超出了很多人的想象。

首先,最基础的用法是给所有角设置一个统一的半径,比如

border-radius: 8px;
。这会给元素一个柔和的整体外观。但如果你想玩点花样,可以为每个角设置不同的半径。它的顺序是
top-left
、
top-right
、
bottom-right
、
bottom-left
,比如
border-radius: 10px 20px 30px 40px;
。甚至可以只设置水平和垂直半径,用斜杠
/
分隔,例如
border-radius: 10px / 20px;
,这会创建一个椭圆形角。

我个人比较喜欢用百分比来设置

border-radius
,比如
border-radius: 50%;
,这能直接把一个正方形变成圆形,或者把一个矩形变成胶囊状。这在做头像、圆形按钮或者特殊形状的卡片时非常有用。

/* 胶囊形卡片 */
.pill-card {
  border-radius: 9999px; /* 或者一个足够大的值,比如50% */
  background-color: #e0f7fa;
  padding: 10px 25px;
  display: inline-block; /* 保持宽度适应内容 */
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.05);
}

/* 底部圆角,顶部直角卡片 */
.bottom-rounded-card {
  border-radius: 0 0 15px 15px; /* 只有左下和右下角有圆角 */
  background-color: #fff;
  padding: 20px;
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.07);
}

常见陷阱和注意事项:

  1. 内容溢出剪裁问题: 当你给一个元素设置了
    border-radius
    ,如果它的内容(比如图片)超出了这个元素的边界,那么内容可能不会被正确地剪裁成圆角。这时候,通常需要配合
    overflow: hidden;
    来确保内容被正确剪裁。这是个小细节,但经常被忽略,导致视觉上的不协调。
    .card-with-image {
      border-radius: 10px;
      overflow: hidden; /* 确保内部图片也被圆角剪裁 */
      /* 其他卡片样式 */
    }
    .card-with-image img {
      width: 100%;
      height: auto;
      display: block;
    }
  2. 响应式设计中的百分比: 使用百分比设置
    border-radius
    时要小心。例如,
    border-radius: 50%;
    在一个正方形上会得到一个完美的圆形,但在一个矩形上会得到一个椭圆形。这通常是期望的效果,但如果你的设计要求在不同宽高比下保持特定的圆角形状,可能需要更复杂的CSS或者JS来动态计算。
  3. 兼容性问题(老旧浏览器): 虽然现在主流浏览器对
    border-radius
    的支持已经非常完善,但在一些非常老的浏览器(IE8及以下)中,它是不被支持的。不过,在现代Web开发中,这通常不是一个需要重点考虑的问题了。
  4. 与
    box-shadow
    的视觉协调:
    圆角和阴影是卡片设计的两个核心,它们之间的协调非常重要。一个锐利的阴影配上一个非常柔和的圆角,或者反过来,都可能让卡片看起来不自然。我倾向于让阴影的模糊半径和圆角半径保持一定的比例,或者至少在视觉上是和谐的。

提升卡片交互体验:过渡动画与无障碍设计

仅仅把卡片做得好看是不够的,它还得“活”起来,并且对所有用户都友好。这主要体现在过渡动画和无障碍设计上。

过渡动画 (

transition
)

让卡片在鼠标悬停时有所反馈,是提升用户体验的绝佳方式。一个微小的上浮、阴影加深或者背景色变化,都能让用户感受到元素的“可交互性”。我通常会给

transform
和
box-shadow
属性添加过渡效果,因为它们的变化最能体现卡片的“生命力”。

.card {
  /* ...之前的样式... */
  transition: transform 0.3s ease-out, box-shadow 0.3s ease-out; /* 注意使用ease-out,效果更自然 */
}

.card:hover {
  transform: translateY(-8px) scale(1.02); /* 稍微上浮并放大一点点 */
  box-shadow: 0 15px 30px rgba(0, 0, 0, 0.2); /* 阴影加深且范围更大 */
}

这里的

ease-out
缓动函数比默认的
ease
在动画结束时更平滑,能给人一种更“轻盈”的感觉。除了
hover
,你也可以考虑在
active
状态(点击时)添加一些反馈,比如轻微的下沉效果,模拟按钮被按下的感觉。不过,动画不宜过多或过于复杂,那样反而会分散用户的注意力,甚至造成眩晕感。我信奉“少即是多”的原则,微妙的变化往往效果最好。

无障碍设计 (Accessibility)

卡片布局在视觉上很吸引人,但在无障碍设计方面,我们不能只停留在视觉层面。我们需要确保使用屏幕阅读器的用户、键盘导航用户以及有其他辅助需求的用户也能顺畅地理解和操作卡片内容。

  1. 语义化HTML: 如果卡片是可点击的,应该使用

    <a>
    标签包裹整个卡片内容,或者至少确保卡片内部的链接是可聚焦和可点击的。如果卡片只是一个信息展示单元,可以考虑使用
    article
    或
    section
    等语义化标签,并辅以
    role="region"
    或
    role="article"
    等ARIA属性,帮助屏幕阅读器理解其结构。

    <!-- 推荐的可点击卡片结构 -->
    <a href="#" class="card-link-wrapper">
      <div class="card">
        <h3>可点击卡片标题</h3>
        <p>卡片内容。</p>
      </div>
    </a>

    或者,如果卡片内部有多个可交互元素,确保它们的焦点顺序是逻辑的。

  2. 键盘导航: 确保用户可以使用

    Tab
    键在卡片之间以及卡片内部的可交互元素之间进行导航。
    <a>
    和
    <button>
    等原生交互元素默认支持键盘导航。如果使用了自定义的交互逻辑,务必添加
    tabindex
    属性和相应的JavaScript事件处理。

  3. 颜色对比度: 卡片内部的文本颜色与背景色之间必须有足够的对比度,以符合WCAG(Web内容无障碍指南)标准。这对于视力障碍用户至关重要。可以使用在线工具检查颜色对比度,确保其达到AA或AAA级别。

  4. 焦点指示器: 当用户通过键盘导航到卡片或卡片内的元素时,必须有清晰的视觉焦点指示(通常是浏览器默认的

    outline
    )。不要轻易移除
    outline
    样式,如果非要自定义,也要确保新的焦点指示器足够明显。

这些无障碍的考量,虽然可能不会直接影响卡片的外观,但它们决定了你的网站是否真正对所有人都开放。一个真正优秀的Web设计师,不仅要让页面看起来漂亮,更要让它用起来方便、高效。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4436

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1355

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

9983

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

980

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2744

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

1569

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

4709

2023.09.21

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS教程
CSS教程

共754课时 | 98.4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn