css实现全套液体玻璃ui控件代码
代码语言:html
所属分类:布局界面
代码描述:css实现全套液体玻璃ui控件代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<style>
/* ==========================================================================
LIQUID GLASS UI KIT
Following CSS Guidelines (cssguidelin.es) — BEM methodology,
single responsibility, progressive enhancement.
==========================================================================
TABLE OF CONTENTS
-----------------
1. Custom Properties — Complete Design Token System
2. Reset & Base
3. Light Theme Tokens
4. @supports — Graceful Degradation
5. prefers-reduced-motion
6. Animated Background Scene
7. Glass Utility Classes
8. Focus Visible
9. Component: Card
10. Component: Button
11. Component: Badge & Tag
12. Component: Input
13. Component: Checkbox & Radio
14. Component: Switch
15. Component: Navigation
16. Component: Tabs + Panels
17. Component: Accordion
18. Component: Modal / Dialog
19. Component: Toast / Snackbar
20. Component: Tooltip
21. Component: Dropdown / Select
22. Component: Chip
23. Component: Avatar Group
24. Component: Breadcrumb
25. Component: Skeleton Loader
26. Component: Stepper
27. Component: Data Table
28. 12 Liquid Glass Animations
29. Page Layout & Hero
30. Theme Toggle Button
31. Responsive
========================================================================== */
/* --------------------------------------------------------------------------
1. CUSTOM PROPERTIES — Complete Design Token System
-------------------------------------------------------------------------- */
:root {
/* ── Glass surface tints ── */
--glass-white: rgba(255, 255, 255, 0.12);
--glass-white-md: rgba(255, 255, 255, 0.2);
--glass-white-lg: rgba(255, 255, 255, 0.3);
--glass-dark: rgba(0, 0, 0, 0.18);
--glass-dark-md: rgba(0, 0, 0, 0.28);
/* ── Borders ── */
--glass-border: rgba(255, 255, 255, 0.25);
--glass-border-subtle: rgba(255, 255, 255, 0.12);
--glass-border-bright: rgba(255, 255, 255, 0.5);
/* ── Blur values ── */
--blur-sm: blur(8px);
--blur-md: blur(18px);
--blur-lg: blur(32px);
--blur-xl: blur(60px);
/* ── Shadows ── */
--shadow-glass: 0 8px 32px rgba(0, 0, 0, 0.28),
inset 0 1px 0 rgba(255, 255, 255, 0.3);
--shadow-float: 0 20px 60px rgba(0, 0, 0, 0.4), 0 4px 16px rgba(0, 0, 0, 0.2);
--shadow-glow: 0 0 40px rgba(120, 200, 255, 0.35);
/* ── Reflections ── */
--reflection-top: linear-gradient(
135deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0) 50%
);
--reflection-inner: inset 0 1px 1px rgba(255, 255, 255, 0.45),
inset 0 -1px 1px rgba(0, 0, 0, 0.1);
/* ── Colour palette ── */
--accent-aqua: #5ee7df;
--accent-violet: #b490f5;
--accent-rose: #f7a8c4;
--accent-amber: #ffd27f;
--accent-lime: #a8f08a;
/* ── Semantic surface / text ── */
--color-bg: #0b0e1a;
--color-surface: rgba(255, 255, 255, 0.04);
--color-text: #ffffff;
--color-text-muted: rgba(255, 255, 255, 0.55);
--color-text-subtle: rgba(255, 255, 255, 0.35);
/* ── Spacing scale ── */
--space-2xs: 4px;
--space-xs: 8px;
--space-sm: 12px;
--space-md: 16px;
--space-lg: 24px;
--space-xl: 32px;
--space-2xl: 48px;
--space-3xl: 64px;
--space-4xl: 96px;
/* ── Type scale ── */
--text-2xs: 0.68rem;
--text-xs: 0.75rem;
--text-sm: 0.82rem;
--text-md: 0.9rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.3rem;
--text-2xl: 1.6rem;
--text-3xl: 2rem;
--text-4xl: 2.8rem;
/* ── Radius scale ── */
--radius-xs: 6px;
--radius-sm: 10px;
--radius-md: 14px;
--radius-lg: 20px;
--radius-xl: 24px;
--radius-2xl: 32px;
--radius-full: 9999px;
/* ── Z-index scale ── */
--z-base: 1;
--z-raised: 10;
--z-overlay: 100;
--z-modal: 500;
--z-toast: 800;
--z-tooltip: 900;
/* ── Easing tokens ── */
--ease-glass: cubic-bezier(0.22, 0.68, 0, 1.2);
--ease-liquid: cubic-bezier(0.34, 1.56, 0.64, 1);
--ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
--ease-out: cubic-bezier(0, 0, 0.2, 1);
/* ── Duration tokens ── */
--dur-fast: 180ms;
--dur-mid: 360ms;
--dur-slow: 600ms;
/* ── Typography ── */
--font-display: "Italiana", serif;
--font-body: "DM Sans", sans-serif;
}
/* --------------------------------------------------------------------------
3. LIGHT THEME TOKENS
-------------------------------------------------------------------------- */
[data-theme="light"] {
/* ── Surfaces ── */
--glass-white: rgba(255, 255, 255, 0.62);
--glass-white-md: rgba(255, 255, 255, 0.78);
--glass-white-lg: rgba(255, 255, 255, 0.9);
--glass-dark: rgba(0, 0, 0, 0.06);
--glass-dark-md: rgba(15, 23, 42, 0.08);
/* ── Borders — dark on light bg (white borders are invisible) ── */
--glass-border: rgba(15, 23, 42, 0.14);
--glass-border-subtle: rgba(15, 23, 42, 0.09);
--glass-border-bright: rgba(15, 23, 42, 0.22);
/* ── Shadows ── */
--shadow-glass: 0 8px 32px rgba(0, 0, 0, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.9);
--shadow-float: 0 20px 60px rgba(0, 0, 0, 0.16),
0 4px 16px rgba(0, 0, 0, 0.08);
/* ── Background ── */
--color-bg: #e8f0fa;
--color-surface: rgba(255, 255, 255, 0.55);
--color-text: #0f172a;
--color-text-muted: rgba(15, 23, 42, 0.58);
--color-text-subtle: rgba(15, 23, 42, 0.38);
/* ── Reflections ── */
--reflection-top: linear-gradient(
135deg,
rgba(255, 255, 255, 0.65) 0%,
rgba(255, 255, 255, 0) 50%
);
--reflection-inner: inset 0 1px 1px rgba(255, 255, 255, 0.95),
inset 0 -1px 1px rgba(0, 0, 0, 0.04);
/* ── Accent colours — darkened for WCAG AA on light backgrounds ── */
--accent-aqua: #0891b2; /* cyan-600 — was #5ee7df */
--accent-violet: #6d28d9; /* violet-700 — was #b490f5 */
--accent-rose: #be185d; /* pink-700 — was #f7a8c4 */
--accent-amber: #b45309; /* amber-700 — was #ffd27f */
--accent-lime: #15803d; /* green-700 — was #a8f08a */
}
/* --------------------------------------------------------------------------
4. @supports — Graceful Degradation
When backdrop-filter is unsupported (older Firefox / Edge),
fall back to a solid-ish semi-transparent surface.
-------------------------------------------------------------------------- */
@supports not (backdrop-filter: blur(1px)) {
.glass {
background: rgba(20, 25, 45, 0.88) !important;
border-color: rgba(255, 255, 255, 0.15) !important;
}
[data-theme="light"] .glass {
background: rgba(255, 255, 255, 0.92) !important;
border-color: rgba(15, 23, 42, 0.18) !important;
}
.glass-modal-backdrop {
background: rgba(0, 0, 0, 0.7) !important;
}
}
/* --------------------------------------------------------------------------
5. prefers-reduced-motion — legal requirement in many markets
-------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
.scene__blob {
animation: none !important;
}
.hero__title,
.hero__kicker,
.hero__sub,
.hero__cta,
.stats,
.section {
animation: none !important;
opacity: 1 !important;
transform: none !important;
}
}
/* --------------------------------------------------------------------------
2. RESET & BASE
-------------------------------------------------------------------------- */
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
-webkit-font-smoothing: antialiased;
}
body {
font-family: var(--font-body);
font-weight: 300;
color: var(--color-text);
background: var(--color-bg);
overflow-x: hidden;
min-height: 100vh;
transition: background var(--dur-mid) var(--ease-smooth),
color var(--dur-mid) var(--ease-smooth);
}
/* --------------------------------------------------------------------------
6. ANIMATED BACKGROUND SCENE
-------------------------------------------------------------------------- */
.scene {
position: fixed;
inset: 0;
z-index: 0;
overflow: hidden;
pointer-events: none;
}
.scene__blob {
position: absolute;
border-radius: 50%;
filter: blur(80px);
opacity: 0.55;
animation: blob-drift var(--dur, 18s) ease-in-out infinite alternate;
}
[data-theme="light"] .scene__blob {
opacity: 0.3;
}
.scene__blob--1 {
width: 700px;
height: 700px;
background: radial-gradient(circle, #5ee7df, #3b82f6);
top: -200px;
left: -150px;
--dur: 22s;
}
.scene__blob--2 {
width: 600px;
height: 600px;
background: radial-gradient(circle, #b490f5, #ec4899);
bottom: -200px;
right: -100px;
--dur: 17s;
animation-delay: -8s;
}
.scene__blob--3 {
width: 400px;
height: 400px;
background: radial-gradient(circle, #ffd27f, #f7a8c4);
top: 40%;
left: 50%;
--dur: 25s;
animation-delay: -13s;
}
@keyframes blob-drift {
0% {
transform: translate(0, 0) scale(1);
}
33% {
transform: translate(60px, -40px) scale(1.08);
}
66% {
transform: translate(-40px, 60px) scale(0.94);
}
100% {
transform: translate(30px, 30px) scale(1.04);
}
}
/* --------------------------------------------------------------------------
7. GLASS UTILITY CLASSES
-------------------------------------------------------------------------- */
.glass {
backdrop-filter: var(--blur-md);
-webkit-backdrop-filter: var(--blur-md);
background: var(--glass-white);
border: 1px solid var(--glass-border);
box-shadow: var(--shadow-glass);
position: relative;
overflow: hidden;
}
.glass::before {
content: "";
position: absolute;
inset: 0;
background: var(--reflection-top);
pointer-events: none;
border-radius: inherit;
z-index: 1;
}
.glass--dark {
background: var(--glass-dark-md);
border-color: rgba(255, 255, 255, 0.1);
}
.glass--bright {
background: var(--glass-white-lg);
border-color: var(--glass-border-bright);
}
.glass--frosted {
backdrop-filter: var(--blur-lg);
-webkit-backdrop-filter: var(--blur-lg);
background: rgba(255, 255, 255, 0.08);
}
.glass--liquid {
backdrop-filter: var(--blur-xl);
-webkit-backdrop-filter: var(--blur-xl);
background: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.18);
}
/* --------------------------------------------------------------------------
8. FOCUS VISIBLE — Keyboard accessibility
-------------------------------------------------------------------------- */
:focus {
outline: none;
}
:focus-visible {
outline: 2px solid var(--accent-aqua);
outline-offset: 3px;
border-radius: var(--radius-xs);
}
.glass-btn:focus-visible,
.glass-nav__item:focus-visible,
.glass-toggle__opt:focus-visible {
outline: 2px solid var(--accent-aqua);
outline-offset: 2px;
}
.glass-input:focus-visible {
outline: none; /* handled by box-shadow below */
}
/* --------------------------------------------------------------------------
9. COMPONENT: CARD
-------------------------------------------------------------------------- */
.glass-card {
border-radius: var(--radius-xl);
padding: var(--space-xl);
transition: transform var(--dur-mid) var(--ease-glass),
box-shadow var(--dur-mid) var(--ease-glass), background var(--dur-mid);
}
.glass-card:hover {
transform: translateY(-6px) scale(1.01);
box-shadow: var(--shadow-float);
background: var(--glass-white-md);
}
.glass-card::after {
content: "";
position: absolute;
inset: -1px;
border-radius: inherit;
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.22) 0%,
rgba(255, 255, 255, 0) 40%,
rgba(255, 255, 255, 0.08) 100%
);
opacity: 0;
transition: opacity var(--dur-mid);
pointer-events: none;
z-index: 2;
}
.glass-card:hover::after {
opacity: 1;
}
.glass-card__label {
font-size: var(--text-2xs);
letter-spacing: 0.14em;
text-transform: uppercase;
opacity: 0.55;
margin-bottom: var(--space-xs);
}
.glass-card__title {
font-family: var(--font-display);
font-size: clamp(1.4rem, 2.5vw, 2rem);
line-height: 1.15;
margin-bottom: var(--space-sm);
}
.glass-card__body {
font-size: var(--text-md);
line-height: 1.65;
opacity: 0.75;
}
/* --------------------------------------------------------------------------
10. COMPONENT: BUTTON
-------------------------------------------------------------------------- */
.glass-btn {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
padding: var(--space-sm) var(--space-lg);
border-radius: var(--radius-full);
border: none;
cursor: pointer;
font-family: var(--font-body);
font-size: var(--text-sm);
font-weight: 500;
letter-spacing: 0.04em;
color: var(--color-text);
text-decoration: none;
transition: transform var(--dur-fast) var(--ease-liquid),
box-shadow var(--dur-fast), background var(--dur-fast);
}
.glass-btn::before {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
background: var(--reflection-top);
pointer-events: none;
}
.glass-btn:active {
transform: scale(0.96);
}
.glass-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
pointer-events: none;
}
.glass-btn--primary {
background: linear-gradient(
135deg,
rgba(94, 231, 223, 0.5) 0%,
rgba(59, 130, 246, 0.5) 100%
);
border: 1px solid rgba(94, 231, 223, 0.45);
box-shadow: 0 4px 24px rgba(94, 231, 223, 0.3), var(--reflection-inner);
}
.glass-btn--primary:hover {
background: linear-gradient(
135deg,
rgba(94, 231, 223, 0.7) 0%,
rgba(59, 130, 246, 0.7) 100%
);
box-shadow: 0 8px 36px rgba(94, 231, 223, 0.5), var(--reflection-inner);
transform: translateY(-2px);
}
.glass-btn--ghost {
background: var(--glass-white);
border: 1px solid var(--glass-border);
box-shadow: var(--shadow-glass);
}
.glass-btn--ghost:hover {
background: var(--glass-white-md);
transform: translateY(-2px);
}
.glass-btn--accent {
background: linear-gradient(
135deg,
rgba(180, 144, 245, 0.5) 0%,
rgba(247, 168, 196, 0.5) 100%
);
border: 1px solid rgba(180, 144, 245, 0.45);
box-shadow: 0 4px 24px rgba(180, 144, 245, 0.3), var(--reflection-inner);
}
.glass-btn--accent:hover {
transform: translateY(-2px);
box-shadow: 0 8px 40px rgba(180, 144, 245, 0.5), var(--reflection-inner);
}
.glass-btn--danger {
background: linear-gradient(
135deg,
rgba(239, 68, 68, 0.45) 0%,
rgba(220, 38, 38, 0.45) 100%
);
border: 1px solid rgba(239, 68, 68, 0.4);
box-shadow: 0 4px 24px rgba(239, 68, 68, 0.25), var(--reflection-inner);
}
.glass-btn--danger:hover {
transform: translateY(-2px);
box-shadow: 0 8px 36px rgba(239, 68, 68, 0.45), var(--reflection-inner);
}
.glass-btn--icon {
width: 48px;
height: 48px;
padding: 0;
justify-content: center;
line-height: 1;
}
.glass-btn--sm {
padding: var(--space-2xs) var(--space-md);
font-size: var(--text-xs);
}
.glass-btn--lg {
padding: var(--space-md) var(--space-xl);
font-size: var(--text-base);
}
/* --------------------------------------------------------------------------
11. COMPONENT: BADGE & TAG
-------------------------------------------------------------------------- */
.glass-badge {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 5px 14px;
border-radius: var(--radius-full);
font-size: var(--text-2xs);
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.glass-badge--aqua {
background: rgba(94, 231, 223, 0.2);
border: 1px solid rgba(94, 231, 223, 0.4);
color: var(--accent-aqua);
box-shadow: 0 0 12px rgba(94, 231, 223, 0.18);
}
.glass-badge--violet {
background: rgba(180, 144, 245, 0.2);
border: 1px solid rgba(180, 144, 245, 0.4);
color: var(--accent-violet);
box-shadow: 0 0 12px rgba(180, 144, 245, 0.18);
}
.glass-badge--rose {
background: rgba(247, 168, 196, 0.2);
border: 1px solid rgba(247, 168, 196, 0.4);
color: var(--accent-rose);
}
.glass-badge--amber {
background: rgba(255, 210, 127, 0.2);
border: 1px solid rgba(255, 210, 127, 0.4);
color: var(--accent-amber);
}
.glass-badge--lime {
background: rgba(168, 240, 138, 0.2);
border: 1px solid rgba(168, 240, 138, 0.4);
color: var(--accent-lime);
}
.glass-badge--error {
background: rgba(239, 68, 68, 0.2);
border: 1px solid rgba(239, 68, 68, 0.4);
color: #f87171;
}
.glass-badge__dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: currentColor;
animation: pulse-badge 2s ease infinite;
}
@keyframes pulse-badge {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.4;
transform: scale(0.7);
}
}
.glass-tag {
display: inline-block;
padding: 6px 16px;
border-radius: var(--radius-sm);
font-size: var(--text-xs);
font-weight: 400;
background: var(--glass-white);
border: 1px solid var(--glass-border-subtle);
backdrop-filter: var(--blur-sm);
-webkit-backdrop-filter: var(--blur-sm);
transition: transform var(--dur-fast) var(--ease-liquid),
background var(--dur-fast);
cursor: default;
}
.glass-tag:hover {
background: var(--glass-white-md);
transform: translateY(-2px);
}
/* --------------------------------------------------------------------------
12. COMPONENT: INPUT
-------------------------------------------------------------------------- */
.glass-input-wrap {
position: relative;
display: flex;
align-items: center;
}
.glass-input {
width: 100%;
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-md);
border: 1px solid var(--glass-border-subtle);
background: var(--glass-white);
backdrop-filter: var(--blur-sm);
-webkit-backdrop-filter: var(--blur-sm);
color: var(--color-text);
font-family: var(--font-body);
font-size: var(--text-md);
outline: none;
transition: border-color var(--dur-fast), box-shadow var(--dur-fast),
background var(--dur-fast);
}
.glass-input::placeholder {
opacity: 0.45;
}
.glass-input:focus {
border-color: rgba(94, 231, 223, 0.6);
background: var(--glass-white-md);
box-shadow: 0 0 0 3px rgba(94, 231, 223, 0.15), var(--shadow-glass);
}
.glass-input[aria-invalid="true"] {
border-color: rgba(239, 68, 68, 0.6);
box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);
}
.glass-input-icon {
position: absolute;
right: 16px;
opacity: 0.5;
pointer-events: none;
font-size: 1rem;
}
/* Textarea */
.glass-textarea {
width: 100%;
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-md);
border: 1px solid var(--glass-border-subtle);
background: var(--glass-white);
backdrop-filter: var(--blur-sm);
-webkit-backdrop-filter: var(--blur-sm);
color: var(--color-text);
font-family: var(--font-body);
font-size: var(--text-md);
outline: none;
resize: vertical;
min-height: 100px;
transition: border-color var(--dur-fast), box-shadow var(--dur-fast),
background var(--dur-fast);
}
.glass-textarea::placeholder {
opacity: 0.45;
}
.glass-textarea:focus {
border-color: rgba(94, 231, 223, 0.6);
background: var(--glass-white-md);
box-shadow: 0 0 0 3px rgba(94, 231, 223, 0.15), var(--shadow-glass);
}
/* Select */
.glass-select {
width: 100%;
padding: var(--space-sm) 40px var(--space-sm) var(--space-md);
border-radius: var(--radius-md);
border: 1px solid var(--glass-border-subtle);
background: var(--glass-white);
backdrop-filter: var(--blur-sm);
-webkit-backdrop-filter: var(--blur-sm);
color: var(--color-text);
font-family: var(--font-body);
font-size: var(--text-md);
outline: none;
appearance: none;
-webkit-appearance: none;
cursor: pointer;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='rgba(255,255,255,0.5)' stroke-width='2' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 14px center;
transition: border-color var(--dur-fast), box-shadow var(--dur-fast),
background-color var(--dur-fast);
}
.glass-select:focus {
border-color: rgba(94, 231, 223, 0.6);
box-shadow: 0 0 0 3px rgba(94, 231, 223, 0.15), var(--shadow-glass);
}
.glass-select option {
background:.........完整代码请登录后点击上方下载按钮下载查看















网友评论0