聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

如何使用css实现更加立体的阴影效果?下面本篇文章给大家聊聊css 阴影进阶,介绍一下巧用使用css实现立体阴影效果的方法,希望对大家有所帮助!

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

CSS 阴影的存在,让物体看上去更加有型立体。【推荐学习:css视频教程】

然而,在最简单的阴影使用之上,我们可以实现更多有意思且更加立体的阴影效果。

CSS 阴影基础

CSS 中,明面上可以实现阴影的有三个属性:

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

box-shadow – 盒阴影text-shadow – 文字阴影filter: drop-shaodw() – 滤镜内的阴影

关于它们的基础语法和使用就不过多描述,这一部分大家可以先在 MDN 补齐,贴几张图快速复习一下:

box-shadow – 盒阴影:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

text-shadow – 文字阴影:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

filter: drop-shaodw() – 滤镜内的阴影:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

基本上 3 种阴影大同小异,需要注意的就是:

box-shadow 还区分内阴影,内阴影使用关键字 inset 进行描述;box-shadow 多一个阴影扩散半径参数。

长投影

上面提到了通过多层阴影叠加实现文字的立体阴影。运用在 div 这些容器上也是可以的。当然这里还有一种挺有意思的方法。假设我们,有一个矩形元素,希望给他添加一个长投影,像下面这样:

image

要生成这种长投影,刚刚说的叠加多层阴影可以,再就是借助元素的两个伪元素,其实上面的图是这样的:

image

关键点在于,我们通过对两个伪元素的 transform: skew() 变换以及从实色到透明色的背景色变化,实现了长投影的效果:

CodePen Demo — 线性渐变模拟长阴影https://codepen.io/Chokcoco/pen/qJvVGy

立体投影

好,我们继续。下一个主题是立体投影

这个说法很奇怪,阴影的出现,本就是为了让原本的元素看起来更加的立体,那这里所谓的立体投影,是个怎么立体法?

这里所谓的立体投影,并不一定是使用了 box-shadowtext-shadow 或者 drop-shadow,而是我们使用其他元素或者属性模拟元素的阴影。而这样做的目的,是为了能够突破 box-shadow 这类元素的一些定位局限。让阴影的位置、大小、模糊度可以更加的灵活

OK,让我们来看看,这样一个元素,我们希望通过自定义阴影的位置,让它更加立体:

image

上图 div 只是带了一个非常浅的 box-shadow ,看上去和立体没什么关系,接下来,我们通过 div 的伪元素,给它生成一个和原图边角形状类似的图形,再通过 transform 位移一下,可能是这样:

image

OK,最后对这个用伪元素生成的元素进行一些虚化效果(filter或者box-shadow都可以),就可以实现一个边角看起来像被撕开的立体效果:

image

代码非常简单,伪 CSS 代码示意如下:

div {    position: relative;    width: 600px;    height: 100px;    background: hsl(48, 100%, 50%);    border-radius: 20px;}div::before {    content: "";    position: absolute;    top: 50%;    left: 5%;    right: 5%;    bottom: 0;    border-radius: 10px;    background: hsl(48, 100%, 20%);    transform: translate(0, -15%) rotate(-4deg);    transform-origin: center center;    box-shadow: 0 0 20px 15px hsl(48, 100%, 20%);}

所以总结一下:

立体投影的关键点在于利于伪元素生成一个大小与父元素相近的元素,然后对其进行 rotate 以及定位到合适位置,再赋于阴影操作颜色的运用也很重要,阴影的颜色通常比本身颜色要更深,这里使用 hsl 表示颜色更容易操作,l 控制颜色的明暗度

还有其他很多场景,都可以用类似的技巧实现:

image

详细完整的代码,你可以戳这里:CodePen Demo — 立体投影

https://codepen.io/Chokcoco/pen/LgdRKE?editors=1100

浮雕阴影

还有一类立体效果的阴影就是浮雕阴影,它的本质还是 box-shadowtext-shadow,只是需要控制好颜色的配合以及内外阴影的一起使用。核心就是 2 点:

背景色与内容(文本或者盒子颜色)一致

使用两个相反的方向,使用两组对比明显的颜色值,来实现凹凸效果

首先,我们来看一个文字版的浮雕效果。

先实现一个凸起的效果,我们需要实现一个背景色和文字色一样的文字:

浮雕阴影
body {    background: #999;}div {    color: #999;}

效果如下,由于背景色和文字色的颜色一样,所以我们什么都看不到。

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

不过没事,我们给文字添加一个 1px x、y 方向的黑色阴影:

div {    color: #999;    text-shadow: 1px 1px 1px #000;}

效果如下:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

有点感觉了,再反向,也就是 -1px x、y 方向添加一个黑色相对,也就白色的阴影:

div {    color: #999;    text-shadow:         1px 1px 1px #000,         -1px -1px 1px #fff;}

效果如下,这样我们就得到了一个凸起质感的浮雕阴影:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

如果我们把颜色对调一下呢?

div {    color: #999;    text-shadow:         1px 1px 1px #fff,         -1px -1px 1px #000;}

就能很轻松的得到凹下质感的浮雕阴影:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

上述 DEMO 的完整代码:CodePen Demo – Embossed Shadow

https://codepen.io/Chokcoco/pen/yLPmMXM

新拟态风格阴影

我们将运用在文字上的技巧,扩展延伸到容器上,就能得到最近比较火的拟态风格阴影,其原理也是大同小异。

两个阴影,使用两个相反的方向,使用两组对比明显的颜色值,来实现凹凸效果。与文字不同的是,这里的凹效果,我们需要使用盒子的内阴影实现

浮雕阴影
浮雕阴影
div {    width: 120px;    height: 120px;    background: #e9ecef;    color: #333;    box-shadow:        7px 7px 12px rgba(0, 0, 0, .4),        -7px -7px 12px rgba(255, 255, 255, .9);}div:nth-child(2) {    box-shadow:        inset -7px -7px 12px rgba(255, 255, 255, .9),        inset 7px 7px 12px rgba(0, 0, 0, .4);}

这样,就可以得到拟态风格的按钮,如下图所示,左凸右凹:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

再通过一个简单的过渡,就可以实现整个点击的交互:

div {    transition: .2s all;    box-shadow:        7px 7px 12px rgba(0, 0, 0, .4),        -7px -7px 12px rgba(255, 255, 255, .9),        inset 0 0 0x rgba(255, 255, 255, .9),        inset 0 0 0 rgba(0, 0, 0, .4);        &:active {        box-shadow:            0 0 0 rgba(0, 0, 0, .4),            0 0 0 rgba(255, 255, 255, .9),            inset -7px -7px 12px rgba(255, 255, 255, .9),            inset 7px 7px 12px rgba(0, 0, 0, .4);    }}

看看效果:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

文字立体投影 / 文字长阴影

上面的立体效果在文字上就完全不适用了,所以对待文字的立体阴影效果,还需要另辟蹊径。

正常而言,我们使用 text-shadow 来生成文字阴影,像这样:

Txt Shadow
-----div { text-shadow: 6px 6px 3px hsla(14, 100%, 30%, 1);}

image

嗯,挺好的,就是不够立体。那么要做到立体文字阴影,最常见的方法就是使用多层文字阴影叠加。

Tips:和 box-shadow 一样,text-shadow 是可以叠加多层的!但是对于单个元素而言, drop-shadow 的话就只能是一层。

好,上面的文字,我们试着叠加个 50 层文字阴影试一下。额,50 层手写,其实很快的~

好吧,手写真的太慢了,还容易出错,所以这里我们需要借助一下 SASS/LESS 帮忙,写一个生成 50 层阴影的 function 就好,我们每向右和向下偏移 1px,生成一层 text-shadow:

@function makeLongShadow($color) {    $val: 0px 0px $color;    @for $i from 1 through 50 {        $val: #{$val}, #{$i}px #{$i}px #{$color};    }    @return $val;}div {    text-shadow: makeLongShadow(hsl(14, 100%, 30%));}

上面的 SCSS 代码。经过编译后,就会生成如下 CSS:

div {      text-shadow: 0px 0px #992400, 1px 1px #992400, 2px 2px #992400, 3px 3px #992400, 4px 4px #992400, 5px 5px #992400, 6px 6px #992400, 7px 7px #992400, 8px 8px #992400, 9px 9px #992400, 10px 10px #992400, 11px 11px #992400, 12px 12px #992400, 13px 13px #992400, 14px 14px #992400, 15px 15px #992400, 16px 16px #992400, 17px 17px #992400, 18px 18px #992400, 19px 19px #992400, 20px 20px #992400, 21px 21px #992400, 22px 22px #992400, 23px 23px #992400, 24px 24px #992400, 25px 25px #992400, 26px 26px #992400, 27px 27px #992400, 28px 28px #992400, 29px 29px #992400, 30px 30px #992400, 31px 31px #992400, 32px 32px #992400, 33px 33px #992400, 34px 34px #992400, 35px 35px #992400, 36px 36px #992400, 37px 37px #992400, 38px 38px #992400, 39px 39px #992400, 40px 40px #992400, 41px 41px #992400, 42px 42px #992400, 43px 43px #992400, 44px 44px #992400, 45px 45px #992400, 46px 46px #992400, 47px 47px #992400, 48px 48px #992400, 49px 49px #992400, 50px 50px #992400;}

看看效果:

image

额,很不错,很立体。但是,就是丑,而且说不上来的奇怪。

问题出在哪里呢,阴影其实是存在明暗度和透明度的变化的,所以,对于渐进的每一层文字阴影,明暗度和透明度应该都是不断变化的。这个需求,SASS 可以很好的实现,下面是两个 SASS 颜色函数:

fade-out 改变颜色的透明度,让颜色更加透明desaturate 改变颜色的饱和度值,让颜色更少的饱和

关于 SASS 颜色函数,可以看看这里:Sass基础—颜色函数

我们使用上面两个 SASS 颜色函数修改一下我们的 CSS 代码,主要是修改上面的 makeLongShadow function 函数:

@function makelongrightshadow($color) {    $val: 0px 0px $color;    @for $i from 1 through 50 {        $color: fade-out(desaturate($color, 1%), .02);        $val: #{$val}, #{$i}px #{$i}px #{$color};    }    @return $val;}

好,看看最终效果:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

嗯,大功告成,这次顺眼了很多~

详细完整的代码,你可以戳这里:CodePen Demo — 立体文字阴影

https://codepen.io/Chokcoco/pen/JmgNNa

当然,使用 CSS 生成立体文字阴影的方法还有很多,下面再贴出一例,使用了透明色叠加底色的多重线性渐变实现的文字立体阴影,感兴趣的同学可以去看看具体实现:

聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!

详细完整的代码,你可以戳这里:CodePen Demo — 线性渐变配合阴影实现条纹立体阴影条纹字

https://codepen.io/Chokcoco/pen/XxQJEB?editors=1100

(学习视频分享:web前端入门)

以上就是聊聊如何使用CSS实现比普通阴影更加立体的阴影效果!的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1624311.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CSS宽度、高度属性详解
上一篇 2025年12月24日 08:29:48
聊聊怎么使用CSS滤镜实现圆角及波浪效果
下一篇 2025年12月24日 08:30:02

相关推荐

  • 如何创建HTML文件?用什么软件打开HTML格式?

    如何创建HTML文件?用什么软件打开HTML格式?如何创建HTML文件?用什么软件打开HTML格式?如何创建HTML文件?用什么软件打开HTML格式?如何创建HTML文件?用什么软件打开HTML格式?

    创建html文件需用纯文本编辑器编写符合规范的代码并保存为.html或.htm扩展名;2. 打开html文件可用任何现代浏览器直接渲染;3. 基本结构包括声明、根元素、 元数据区和内容区;4. 常见问题如文件扩展名错误、字符编码不匹配、路径错误、语法错误等可通过检查文件名、统一使用utf-8编码、验…

    2026年5月10日 用户投稿
    000
  • 在 React 应用中实施内容安全策略 (CSP) 的实践指南

    本教程探讨了在 React 应用中实施内容安全策略 (CSP) 时遇到的挑战,特别是针对内联样式和脚本的限制。文章提供了通过将样式外部化、使用 SHA256 哈希或 Nonce 来满足 CSP 要求的解决方案,并指导如何配置构建工具以避免不必要的内联脚本,旨在帮助开发者构建更安全的 React 应用…

    2026年5月10日
    000
  • 如何实现图片在页面中宽高一直保持16:9的比例

    本篇文章给大家带来的内容是关于如何实现图片在页面中宽高一直保持16:9的比例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 目标:遇到一个需求,让图片在页面中,不管宽度如何变化。宽高保持16:9的比例。 实现: 方法一:这也是比较经典的一个方法,利用padding-bottom来实…

    用户投稿 2026年5月10日
    000
  • 怎么在css中改变光标样式

    在css中cursor属性是用来定义了鼠标指针放在一个元素边界范围内时所用的光标形状;我们可以通cursor属性来设置鼠标光标(指针)样式。 cursor属性的语法: cursor: auto|crosshair|default|hand|move|help|wait|text|w-resize|s…

    用户投稿 2026年5月10日
    100
  • 父元素active伪类导致子元素onclick失效怎么办?

    父元素active伪类导致子元素点击事件失效的解决方法 问题:当父元素应用active伪类样式时,其子元素的onclick事件无法触发。这是因为active伪类通常在鼠标按下期间生效,如果样式中包含display: none等会隐藏子元素的属性,则子元素将不可见,自然无法响应点击事件。 原因分析:C…

    用户投稿 2026年5月10日
    000
  • 响应式布局中Flex容器内图片与文本错位问题的解决方案

    本文旨在解决在响应式网页设计中,当图片和文本并排置于Flex容器内时,由于不当的max-width设置导致的元素错位问题。通过调整Flex子元素的max-width以确保它们能和谐共存,并结合object-fit属性优化图片缩放效果,从而实现适配移动设备的流畅布局。 理解Flexbox布局与响应式图…

    2026年5月10日
    200
  • PHP sprintf 函数中属性值提取与格式化指南

    本文旨在解决在php中使用`sprintf`函数时,将完整的html属性字符串误用于需要单一属性值(如类名)的场景。通过分析常见错误,我们展示了如何直接从数组中提取目标属性的原始值,并结合空合并运算符`??`提升代码健壮性,从而避免输出格式不符或潜在的错误,确保`sprintf`正确生成预期html…

    2026年5月10日
    000
  • HTML如何设置全屏控制样式?fullscreen-controls伪类的作用是什么?

    要实现全屏控制样式,最有效的方法是放弃原生控件并创建自定义ui,具体步骤为:1. 使用javascript的fullscreen api(如element.requestfullscreen()和document.exitfullscreen())控制全屏状态;2. 隐藏原生控件,例如通过设置vid…

    2026年5月10日
    000
  • JavaScript DOM操作:解决null错误与实现动态显示隐藏效果

    本文旨在解决JavaScript在尝试操作尚未加载的DOM元素时出现的null错误,并详细阐述如何正确地实现基于鼠标悬停的元素显示/隐藏效果。核心内容包括理解脚本加载时机的重要性、script标签的放置策略,以及如何使用事件监听器和CSS类来动态控制元素可见性,同时提供处理多个相似元素的通用方法。 …

    2026年5月10日
    000
  • 如何用原生 JavaScript 实现表格滚动吸附,像 Excel 一样精确控制滚动?

    精准控制表格滚动,就像 Excel 一样 如果你需要在使用原生 JavaScript 时控制网格表格的滚动,使其像 Excel 表格一样精确地隐藏一行或一列,本篇问答提供了解决方案。 问题: 如何使用原生 JS 控制网格表格的滚动,使其能够一次性完全隐藏一整行或一整列表格? 立即学习“Java免费学…

    2026年5月10日
    000
  • CSS 中如何阻止连字符导致文本自动换行?

    在 css 文本当中,连字符导致内容换行的解决方法 在 css 样式中,如果文本包含连字符,而文本中存在空格,则连字符所在位置可能会导致文本自动换行。这可能会破坏页面的布局和可读性。 问题: 以下 css 文本: 立即学习“前端免费学习笔记(深入)”; build 59-port xxxxxxxx …

    2026年5月10日
    000
  • HTML表格数据动态过滤教程

    本文详细介绍了如何使用javascript和jquery实现html表格的客户端动态过滤功能。通过识别并纠正常见的html结构错误,特别是`tbody`和`table`元素的id应用,文章提供了一个高效且易于理解的过滤脚本。教程涵盖了事件监听、输入值获取、行遍历与显示/隐藏逻辑,并强调了`slice…

    2026年5月10日
    000
  • 保留 Redux 状态

    persist redux 状态是什么意思? react 应用程序中的一个常见挑战是在页面重新加载后或在用户会话之间重新水合 redux 状态。典型的解决方法是通过 api 调用重新获取数据并将其存储在 redux 状态中。但是,您现在可以使用称为 persisted redux state 的技术…

    2026年5月10日
    000
  • HTML5怎么制作日历组件_HTML5日历功能完整实现

    答案:该HTML5日历组件通过HTML结构搭建、CSS美化样式、JavaScript实现月份切换与日期渲染,支持高亮当前日期并可扩展事件标记等功能。 制作一个HTML5日历组件,核心是结合HTML、CSS和JavaScript来实现日期展示、交互与样式美化。下面是一个完整的日历功能实现方法,包含基础…

    2026年5月10日
    000
  • React组件命名规范:确保组件正确渲染的关键

    在react开发中,组件命名规范至关重要。本文将深入探讨为何react组件必须以大写字母开头(pascalcase),以及这一规范如何影响组件的识别与渲染。通过具体的代码示例,我们将展示不规范命名导致的问题,并提供正确的实践方法,帮助开发者避免常见错误,确保react应用中的组件能够被正确解析和显示…

    2026年5月10日
    000
  • JavaScript:根据属性值查找并修改HTML元素的类名

    本文详细介绍了如何使用javascript动态查找html元素并修改其css类。通过document.queryselector结合属性选择器,开发者可以精准定位具有特定属性值的元素,再利用classlist api高效地添加、移除或切换类名,从而实现页面交互和ui状态的灵活控制。 在现代Web开发…

    2026年5月10日
    000
  • JavaScript 实现图片上传预览功能:从本地文件到页面展示

    @@##@@注意事项: 安全性: Data URL 可能会比较长,如果直接存储到数据库中,可能会影响性能。建议将图片上传到服务器,存储图片的 URL。兼容性: FileReader 对象在现代浏览器中都支持,但在一些老版本浏览器中可能不支持。需要进行兼容性处理。错误处理: 可以添加错误处理机制,例如…

    2026年5月10日
    000
  • 您应该随 Web 组件一起发送清单

    除了组件之外,自定义元素清单是您可以在库中提供的最重要的东西。 什么是自定义元素清单 (CEM)? 自定义元素清单是一个架构,旨在记录有关自定义元素/web 组件的元数据,包括属性、属性、方法、事件、槽、css 部分和 css 变量。它获取有关组件的所有信息并将其序列化到项目中的单个 json 文件…

    2026年5月10日
    000
  • 在组件中使用 :global 修改 Antd 全局样式为何失效?

    在组件中使用 :global 样式修改 Antd 全局样式的困惑 在 Antd 中,:global 用于在组件内部覆盖全局样式。但是,如果尝试使用此方法时未生效,以下原因可能是罪魁祸首: 导入方式不正确 :global 样式需要显式地导入。将原先的导入方式 import ‘./index…

    2026年5月10日
    000
  • CSS布局:实现图片居中且两侧环绕文本的现代指南

    本教程旨在解决css中图片居中且两侧环绕文本的布局难题。我们将澄清`float: center`并非有效属性的误区,并探讨传统浮动布局的局限性。重点将放在推荐使用css flexbox这一现代布局方案,通过详细的代码示例和解释,指导开发者如何高效、灵活地实现此复杂布局,确保内容结构清晰且响应式良好。…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信