Command Palette

Search for a command to run...

如何在 CSS 中制作新形态软 UI:阴影、形状和对比度问题

如何在 CSS 中制作新形态软 UI:阴影、形状和对比度问题

T
Toolz Team
|Sep 19, 2026|13 最小读数
Google 上的首选 Toolz.dev

CSS与设计集合的一部分

CSS 变态生成器

使用实时预览创建软 UI(气态)元素,并控制距离、模糊、强度、半径、表面颜色和平坦/凹/凸/压形状 - 然后复制 CSS。

用CSS 变态生成器

Neumorphism 是指一个按钮或卡片似乎被压出页面本身的外观,就像是由软塑料模制的形状,没有边框,没有与背景不同的填充颜色,只是一侧的苍白高光和另一侧的柔和阴影,它在设计模型中拍摄得很漂亮,在真实的界面中很容易在两个方面出错:效果消失,或者控制变得难以看到。

2个问题都归结为关于颜色和阴影的少量算术,本指南解释了软UI效果是如何从两个构建起来的 box-shadow 层(layers),浅色和深色色调是如何从一种表面颜色中衍生出来的,平坦的、凹的、凸的和压制的形状会发生什么变化,以及如何在wcag对比度规则下保持新形态界面可用 CSS 变态生成器 通过实时预览生成下面的所有代码。

TL;博士: 新形态元素具有与页面相同的背景颜色和两个框阴影:较暗的向下和向右偏移,较浅的向上和向左偏移。使用两者的插入关键字使元素看起来像是按压的。 CSS 新形态生成器从您的表面颜色导出两种阴影颜色,带有滑块,用于距离(2 至 50 px)、模糊(0 至 100 px)、强度(2 至 40%)和半径(0 至 80 px),加上平坦、凹入、凸出和按压形状。默认光表面给出 box-shadow: 12px 12px 24px #bababa, -12px -12px 24px #ffffff。那些阴影与表面相比仅达到约1.5:1的对比度,远低于3:1 WCAG要求控制边界,因此交互元素需要可见的边界或焦点状态,它是客户端的,免费的,没有注册。

UI设计中的变态是什么?

义(Neumorphism),也叫软UI,是一种视觉风格,其中界面元素出现从背景中挤出或压入,使用成对的明暗阴影而不是边框或对比填充,这个名字融合了"新"和"骨质同构",模仿物理材料的旧风格,新形态模仿一种材料,单一的连续表面,并依赖于左上角的想象光源。

2020年左右,这种风格在设计展示网站上流行起来,它非常适合装饰面板,在好的屏幕上查看的仪表板和一次性的英雄图形,它不太适合密集的形式,户外使用的任何东西,以及用户必须快速找到任何控件,原因在无障碍部分中涵盖。

CSS中新形态效应是如何工作的?

效果需要三件事:元素上与页面匹配的背景颜色、边框半径以及两个相反方向投射的阴影。 CSS box-shadow property接受一个逗号分隔的阴影列表,每个阴影都有一个x偏移,一个y偏移,一个模糊半径和一个颜色,如上所述 MDN's 盒子-影子参考 并指定于 CSS 背景和边界级别 3。

这是生成器的输出's默认灯预设:

border-radius: 24px;
background: #e0e0e0;
box-shadow: 12px 12px 24px #bababa, -12px -12px 24px #ffffff;

从左到右读取阴影列表。第一个阴影偏移 12 像素向右和 12 向下,模糊超过 24 像素,在比表面更深的灰色中:即远离光线一侧的阴影。第二个偏移 12 像素向左和 12 向上,在比表面更浅的颜色中:面向光线一侧的高光。因为元素'自己的背景是一样的 #e0e0e0 为页,没有可见的边,形只作为两影相交的边界而存在。

为什么我的变态效应没有出现?

素's背景和后面什么都不匹配是最常见的原因,如果页面是白色的,卡片是 #e0e0e0,你看到的是带阴影的灰卡,不是软挤压,将父's背景设置为与元素相同的颜色,生成器's预览面板会自动执行此操作,这就是为什么粘贴到白色页面时看起来对了,错了。

2个原因就是看不到的高光色,在很轻的表面上"光"影子可能已经是纯白色了,在纯白色的页面上,一个白色的影子是看不见的,这也是为什么几乎从不做新形态的原因 #ffffff。

浅色和深色阴影颜色是如何计算的?

Generator将表面颜色的每个红、绿、蓝通道移位相同的量:强度百分比为255,浅色阴影加上该量,深色阴影减去,每个通道被夹在0到255范围内并取圆。

这是默认光预设曲面的计算 #e0e0e0 (224, 224, 224)在15%的强度下:

  1. 轮班金额:255 的 15% = 38.25。
  2. 深色:224 - 38.25 = 185.75,四舍五入为 186,即六角形 ba. 结果: #bababa。
  3. 浅色:224 + 38.25 = 262.25,夹紧至 255,六角形 ff. 结果: #ffffff。

3步显示了一个值得知道的极限。上 #e0e0e0 (255 - 224)/255 = 12.2%强度通过后高光会打出纯白色,任何高于该强度会使阴影变暗而不使高光变亮,因此效果会变得不平衡,在光表面上,将强度保持在那个夹点附近,或者选择稍微暗一点的表面,这样高光就有空间。

相同的规则给出了其他预设:

预设 表面 距离/模糊 强度 深色阴影 浅色
光 #e0e0e0 12/24 磅 15% #bababa #ffffff
卡 #f0f0f3 10/20 磅 12%锛屽悓姣斿? #d1d1d4 #ffffff
暗 #2d2f34 12/24 磅 12%锛屽悓姣斿? #0e1015 #4c4e53
按下 #e0e0e0 12/24 磅 15% #bababa #ffffff
凸 #e0e0e0 12/24 磅 15% #bababa #ffffff

在黑暗预设上,从 (45、47、52) 的每个通道中减去 30.6,得到 (14、16、21),或者 #0e1015并且将其相加得到(76、78、83),或者 #4c4e53。因为跨通道的移位相等,表面的轻微蓝色色调带入两种色调,因此深色新晶卡不会变成平坦的中性灰色。

4种形状有什么变化?

Shape控制元素's背景填充以及阴影是否位于其外部或内部,距离,模糊和半径对于所有四个都表现相同。

形状 背景 阴影 看起来像
平坦的 固体表面颜色 外在的 A高原抬高
凸 linear-gradient(145deg, light, dark) 外在的 一个凸起的圆顶,从左上角点亮
凹 linear-gradient(145deg, dark, light) 外在的 一个向内弯曲的凸起盘子
按下 固体表面颜色 两者 inset 一个空洞被推入页面

按下预设产生:

border-radius: 24px;
background: #e0e0e0;
box-shadow: inset 12px 12px 24px #bababa, inset -12px -12px 24px #ffffff;

与 inset、阴影画在元素内部's的填充框,所以暗色沿左上内缘和右下高光出现,那反转了灯光提示,读作凹陷,是自然"活跃"或"on"状态,用于静止状态平坦的切换。

Convex预设使用全明暗色调作为渐变停止, linear-gradient(145deg, #ffffff, #bababa)15%强度时,这是一个相当强的曲线,对于更微妙的圆顶,降低强度;这会使梯度和阴影一起软化,因为两者都来自相同的两种颜色。

距离、模糊和半径如何相互作用?

滑块是独立的,但外观取决于它们的比例。

  • 距离 (2 到 50 px) 设置每个阴影在两个轴上的偏移距离。它控制视在高度:更大的距离使元素漂浮在页面上方更高。
  • 模糊 (0到100 px)设置阴影边缘有多柔软,围绕两倍距离的模糊,就像在每个预设中一样,给出了特有的枕形外观,模糊等于或低于距离会产生看起来更像切口的硬边阴影。
  • 半径 (0到80 px)圆角,软UI几乎都是用大方的圆角;阴影柔和的方角看起来像是渲染错误。
  • 强度 (2至40%)设定了色调离表面颜色移动的距离。

实际的起始比是模糊 = 2 x 距离,半径 = 2 x 距离,您表面的夹点附近的强度。对于 40 像素图标按钮等小元素,将距离缩放到 4 至 6 像素; 40 像素按钮上的 12 像素偏移使阴影比控制更大。

新形态是否可以访问?

Not默认。neumorphic控件's边缘由与表面相差仅百分之几的亮度的阴影定义,并且这不符合交互组件可见边界的WCAG要求。

WCAG 2.2 成功标准 1.4。11,非文本对比的,需要识别用户界面组件所需的视觉信息,以及它的状态,以至少3:1的对比度与相邻的颜色对比度使用定义在的相对亮度公式 WCAG 2.2。为默认预设工作它:

对 相对亮度 对比 遇见3:1?
深色阴影 #bababa vs 表面 #e0e0e0 0.491 vs 0.745 1.47:1左右的時間 否
浅色 #ffffff vs 表面 #e0e0e0 1.000 vs 0.745 大约1.32:1 否
边境 #7f7f7f vs 表面 #e0e0e0 0.212 vs 0.745 大约3.03:1 只是
边境 #767676 vs 表面 #e0e0e0 0.181 vs 0.745 大约3.44:1 是的,有余量
文本 #333333 vs 表面 #e0e0e0 0.033 vs 0.745 9.6:1左右的情形 是(文本也通过4.5:1)

And那些影子人物就是最好的案例,模煳把影子颜色散开,所以大部分可见影子都比浅 #bababa。在光表面上提高强度没有多大帮助,因为亮点已经夹在白色。

为了检查你自己的颜色, 颜色对比度检查器 计算任意对的比率,并且 颜色对比度检查指南 详细解释公式。

如何保持外观并通过对比度规则

式(style),你不必抛弃,对于用户必须感知到的任何事情,你都得停止依赖它。

  1. 使用软 UI 作为容器,而不是用于控制。 卡片、面板和装饰井可以是纯粹的纽莫弗式。标准 1.4。11 是关于交互式组件和有意义的图形,因此内容标识自己的容器比边缘是唯一标志的按钮的风险要小得多。
  2. 为每个交互元素提供真正的提示。 3:1或更好的颜色的1或2像素边框,对比图标,或文本标签。
  3. 使焦点变得明显。 添加a :focus-visible 轮廓采用高对比度颜色。柔和的阴影不是焦点指标。
  4. 不要仅用深度发出信号状态。 如果按下表示 "on",还请更改图标、标签或颜色。
  5. 尊重用户设置。 的 prefers-对比度媒体查询 当用户要求更多对比度时,您可以添加边框或删除效果。
.neu-button {
  border-radius: 16px;
  background: #e0e0e0;
  box-shadow: 8px 8px 16px #bababa, -8px -8px 16px #ffffff;
  border: 2px solid #767676;
  color: #333333;
}
.neu-button:focus-visible {
  outline: 3px solid #1d4ed8;
  outline-offset: 3px;
}
.neu-button[aria-pressed="true"] {
  box-shadow: inset 8px 8px 16px #bababa, inset -8px -8px 16px #ffffff;
}
@media (prefers-contrast: more) {
  .neu-button { box-shadow: none; border-color: #333333; }
}

如何生成新形态CSS,一步一步

  1. 打开 新形态生成器 并选择预设作为起点:光、卡、暗、按压或凸。
  2. 使用颜色选择器设置表面颜色以匹配元素所在的背景。
  3. 调整距离并模糊高度和柔软度,然后调整强度以形成对比,观看现场预览。
  4. 选择形状:扁平、凹入、凸出或压制。
  5. 设置半径以适应元素大小。
  6. CSS 复制,把三个声明粘贴到你的规则里,记得给家长同样的背景颜色。

您如何支持明暗主题?

为每个主题生成一组值, 并与自定义属性交换。上面的光明和黑暗预设给出一个工作对:

:root {
  --neu-surface: #e0e0e0;
  --neu-dark: #bababa;
  --neu-light: #ffffff;
}
@media (prefers-color-scheme: dark) {
  :root {
    --neu-surface: #2d2f34;
    --neu-dark: #0e1015;
    --neu-light: #4c4e53;
  }
}
body, .neu-card { background: var(--neu-surface); }
.neu-card {
  border-radius: 24px;
  box-shadow: 12px 12px 24px var(--neu-dark), -12px -12px 24px var(--neu-light);
}

暗新形态有光面问题的镜子:影子夹向黑色,高光承载效果,每个主题分别检查对比度。

新形态、玻璃形态和平面阴影比较

软UI是显示深度的几种方式之一,并且每种方式都有不同的成本。

风格 核心CSS 深度提示 对比风险 好
新形态 两个对立 box-shadow 层,匹配背景 从页面中挤出 高 装饰面板、展示仪表板
玻璃化 backdrop-filter: blur() 和半透明的填充物 内容上的磨砂层 中,取决于背后的内容 叠加,卡片叠加图像
材料风格的立面 向下一两个 box-shadow 层 卡片漂浮在页面上方 低 一般接口
平坦,有边框 border 并填充颜色 没有 最低 表格、密集的数据、可访问性优先的工作

的 玻璃化生成器 构建磨砂玻璃风格,以及 盒子阴影生成器指南 覆盖单层和分层高程阴影。对于发光或压花的文本而不是盒子, 文本阴影生成器 type 上应用一个类似的想法,它们都列在了 CSS 工具集线器。

生成器是私有的吗?

是的。预览和 CSS 是在您的浏览器中使用 JavaScript 生成的,上传或存储的任何内容都不会,并且页面加载后会保持离线工作。复制 CSS 计入每日使用限制,如果达到该限制,则会出现消息。

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!