🤙《中级前端进阶方向指南》

《中级前端进阶方向 第一步)JavaScript 微任务 / 宏任务机制》

《中级前端进阶方向 第二步)深入事件循环(Event Loop)》

《中级前端进阶方向 第三步)深入javascript原型链,附学习代码》

《中级前端进阶方向 第四步)深入javascript 闭包、this 、作用域提升,附学习案例源码》

《​​中级前端进阶方向 第五步)深入 javascript高级特性Proxy,附学习案例源码》

《​​中级前端进阶方向 第六步)深入 javascript 高级特性Generator生成器,附案例源码》
《​​中级前端进阶方向 第七步)深入 javascript 高级特性Async/Await,附源码》

《​​中级前端进阶方向 第八步)深入 javascript 高级特性 Promise,附案例源码》

《​​中级前端进阶方向 第九步)深入 javascript 高级特性 模块化 与 装饰器,附案例源码》

《中级前端进阶方向 第十步)深入 浏览器性能优化(渲染机制、内存泄漏..),附案例源码》


--🖍《延伸扩展》-----------------------------------------------------------------------------------------
《中级前端进阶方向 延伸扩展一)javascript 私有状态/工厂函数/回调中保持局部状态/防抖与节流/IIFE 捕获》

《中级前端进阶方向 延伸扩展二) Promise API 概览,可视化演示页面》

快速导航:

  1. 选择器增强(结构性/功能性选择器)

  2. 盒模型与布局:Flexbox / Grid / Multi-column / Logical properties

  3. 视觉效果:圆角 / 投影 / 背景 / 渐变 / 多背景 / Blend / Filter

  4. 变换、过渡与动画(transform / transition / keyframes)

  5. 响应与媒体:媒体查询 / 视口单位 / 媒体特性(prefers-*)

  6. 变量、函数与计算:Custom Properties / calc / clamp / min/max

  7. 字体与排版:@font-face / font-variant / text-wrap / hyphens / ligatures

  8. 新伪类与伪元素(:nth-*, :is/:where/:has, ::before/::after)

  9. 特性检测与容错:@supports 与渐进增强

  10. 新兴与高级:Container Queries / CSS Houdini / Typed OM / Subgrid

  11. 可访问性与性能建议、常见陷阱


1. 选择器增强(Selectors)

核心点

CSS3 引入并普及了大量结构性选择器(例如 :nth-child():not() 等),并且后来又出现了更强大的 :is():where():has() 等(Selectors Level 3/4 的成果)。这些选择器让我们能更语义、更少 DOM、更少类地表达复杂匹配逻辑。

代表选择器与示例

/* 结构选择器 */
li:nth-child(odd) { background: #f6f6f6; }
tr:nth-child(2n+1) td { ... }

/* 复杂否定::not() 支持复合选择器(现代浏览器) */
.article :not(:first-child) { margin-top: 1rem; }

/* 匹配任一::is() 简化复杂选择器 */
header :is(h1, h2, h3) { margin-bottom: .5rem; }

/* 优先级友好(:where 0 specificity) */
:is(.a, .b) { color: red; }      /* 特性与 :is 一样,但 :where 不增加 specificity */
:where(.a, .b) { color: blue; }  /* specificity = 0 */

/* 父选择器(关系选择器)::has() —— “父能看到子” */
article:has(img) { padding-bottom: 1rem; }
/* 注意::has 在一些环境可能仍需检查兼容性 */

实战建议

  • :is() 用在重复前缀的复杂选择器上能显著简化代码并提升可读性。

  • :where() 用于默认样式(zero specificity)非常适合库/重置样式。

  • :has() 很强,但要注意对性能和兼容性的影响(在大 DOM 上滥用可能影响渲染/查询)。


2. 盒模型与布局

2.1 box-sizing

* { box-sizing: border-box; }

border-box 是现代 CSS 推荐的盒模型:padding 和 border 包括在 width/height 之内,布局更直观。

2.2 Flexbox(弹性布局)

用途:单维布局(水平或垂直),项自动伸缩、对齐、换行控制。

.container {
  display: flex;
  flex-direction: row;
  align-items: center;    /* 交叉轴对齐 */
  justify-content: space-between; /* 主轴对齐 */
}
.item { flex: 1 1 200px; } /* grow shrink basis */

实战:常用于导航、工具栏、卡片行等。

2.3 CSS Grid(网格布局)

用途:二维布局(行列同时控制),适合复杂网格、应用级布局。

.grid {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;
  grid-template-rows: auto 1fr;
  gap: 16px; /* grid-gap 的现代写法 */
}
.header { grid-column: 1 / -1; }

技巧:grid-auto-flow: dense; 可用于紧凑布局;subgrid 在一些场景用于继承父网格(兼容需检测)。

2.4 多列(Multi-column)

.article { columns: 3 200px; column-gap: 20px; }

适合排版式布局(报刊式排版),要注意断字与图像流。

2.5 逻辑属性(Writing-mode 友好)

逻辑属性(margin-inline-start, padding-block 等)替代物理属性(margin-left),便于国际化、书写模式切换。

.block {
  margin-inline-start: 1rem; /* 左/右依赖写入方向 */
  padding-block: .5rem;      /* 上下依赖写入方向 */
}

3. 视觉效果:背景、圆角、投影、渐变、混合

3.1 圆角(border-radius)

.box { border-radius: 8px; }

可为任意角度、或使用斜切(ellipse): border-radius: 10px 20px / 20px 30px;

3.2 盒阴影(box-shadow)与文本阴影(text-shadow)

.card { box-shadow: 0 6px 18px rgba(0,0,0,.12); }
h1 { text-shadow: 0 1px 2px rgba(0,0,0,.3); }

3.3 多背景与渐变

.hero {
  background:
    linear-gradient(180deg, rgba(0,0,0,.4), rgba(0,0,0,.1)),
    url('hero.jpg') center / cover no-repeat;
}

渐变类型:linear-gradient, radial-gradient, conic-gradient(圆锥渐变)。

3.4 背景混合(background-blend-mode)与混合模式(mix-blend-mode)

.overlay { mix-blend-mode: multiply; } /* 与下层内容混合 */

类似 Photoshop 的 blend 模式,可用于创造复合视觉效果。

3.5 CSS 滤镜(filter)

img { filter: grayscale(.5) blur(2px) contrast(1.2); }

filter 可以在渲染后影响 raster 化结果,动画使用需谨慎(可能触发图层合成)。


4. 变换(Transforms)、过渡(Transitions)与动画(Animations)

4.1 transform(硬件加速友好)

.box { transform: translate3d(0,0,0) rotate(10deg) scale(1.1); }

使用 transform 通常只触发合成层(GPU),比改变 top/left 更流畅。

4.2 transition(简洁交互)

.button {
  transition: background-color .25s ease, transform .2s ease;
}
.button:hover { transform: translateY(-2px); }

4.3 @keyframes 动画

@keyframes bounce {
  0% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
  100% { transform: translateY(0); }
}
.ball { animation: bounce 600ms ease-in-out infinite; }

4.4 动画性能建议

  • 动画属性尽量只使用 transformopacity;避免触发布局(width/height/top/left等)。

  • 使用 will-change 预创建合成层(但别滥用,以免占用显存)。

  • 对用户偏好 prefers-reduced-motion 做降级。


5. 响应与媒体查询

5.1 媒体查询(Media Queries)

@media (max-width: 768px) {
  .sidebar { display: none; }
}

支持条件:宽度、高度、分辨率、方向、hover 能力等。

5.2 视口单位(vw / vh / vmin / vmax)

.hero { height: 100vh; font-size: 4vw; }

注意移动端浏览器地址栏收缩会影响 vh,可用 env(safe-area-inset-bottom) 等处理安全区。

5.3 媒体特性(用户偏好)

@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; transition: none !important; }
}
@media (prefers-color-scheme: dark) {
  body { background: #111; color: #eee; }
}

对无障碍和暗色主题支持非常重要。


6. 变量、计算与新函数

6.1 自定义属性(CSS Variables)

:root {
  --primary: #07c;
  --gutter: 16px;
}

.btn {
  background: var(--primary);
  padding: calc(var(--gutter) / 2);
}

优点:动态、可继承、可以在运行时用 JS 修改(document.documentElement.style.setProperty('--primary', '#f00'))。

6.2 calc() 与 clamp()/min()/max()

h1 { font-size: calc(16px + 2vw); }

/* clamp(min, preferred, max) */
p { font-size: clamp(14px, 2vw, 18px); }

clamp 用于流式字体大小,优雅地限定范围。

6.3 color-mix / color-contrast(现代色彩函数)

现代 CSS 提供更复杂色彩操作(不同浏览器实现程度不同),例如 color-mix(), color-contrast()。用于动态调色、可访问性对比判断(需检测兼容性)。


7. 字体与排版

7.1 @font-face(自托管字体)

@font-face {
  font-family: 'InterVar';
  src: url('Inter.woff2') format('woff2');
  font-display: swap; /* swap / fallback 策略 */
}
body { font-family: 'InterVar', system-ui, sans-serif; }

font-display 决定字体加载策略(性能/可用性权衡)。

7.2 可变字体(Variable Fonts)

可变字体通过一个文件提供多个 weight/width/optical sizes,非常有利于性能与设计灵活度:

body { font-variation-settings: 'wght' 500; }

7.3 排版增强

  • text-wrap: balance;(部分浏览器)平衡行切分

  • hyphens: auto; 自动断字

  • text-overflow: ellipsis; white-space: nowrap; overflow: hidden; 单行省略


8. 新伪类与伪元素

8.1 常见伪元素

.btn::before { content: ''; display: inline-block; width: 1em; height: 1em; }

::marker, ::selection 等提供更细粒度的样式控制。

8.2 结构性伪类

:first-child, :last-child, :nth-child() 常用于无类名布局。

8.3 新增/现代伪类

  • :focus-within:当元素或其子元素获得焦点时被匹配。

  • :focus-visible:只有在键盘导航/可见焦点时才匹配(用于更好地控制焦点样式)。

  • :checked/:disabled:表单状态伪类。

  • :has():父选择器能力(见前文)。


9. 特性检测:@supports

@supports 检测浏览器是否支持某 CSS 特性,优雅降级或 progressive enhancement。

@supports (display: grid) {
  .layout { display: grid; }
}
@supports not (display: grid) {
  .layout { display: flex; /* fallback */ }
}

10. 新兴与高级特性

10.1 Container Queries(容器查询)

可以基于容器尺寸而不是视口做响应式(组件化响应式 CSS 的重要支持)。

.card {
  container-type: inline-size; /* 让卡片成为容器查询上下文 */
}
@container (min-width: 300px) {
  .card { grid-template-columns: 1fr 200px; }
}

非常适合组件化、避免全局断点。

10.2 CSS Houdini(Paint API、Typed OM 等)

Houdini 打开了 CSS 与 JS 的接口:可以自定义绘制(Paint Worklet)、控制布局(Layout Worklet)、访问高性能 Typed OM 操作样式等。适合高级定制与高性能渲染(复杂图表、微动画)。示例(Paint API 高概念):

// registerPaint('my-painter', class { paint(ctx, size, props) { /* canvas-like draw */ }});
/* CSS: background-image: paint(my-painter); */

注意:Houdini 功能并非所有环境都完整支持。

10.3 Typed Object Model(Typed OM)

提供更快、更安全的脚本级样式读取与写入接口(避免字符串解析的开销),适合高频率动画或复杂交互。

10.4 Subgrid(Grid 的继承网格)

subgrid 允许子元素继承父网格的行/列定义,便于更加一致的复杂布局(兼容性需确认)。


11. 可访问性、性能建议与常见陷阱

11.1 可访问性

  • 使用 prefers-reduced-motion 提供动画降级。

  • 焦点样式不要完全移除(outline: none 要配合可见替代),使用 :focus-visible 精细控制。

  • 在 color 选择上保证对比度,使用 color-contrast()(若可用)或工具检测。

11.2 性能

  • 动画只动 transformopacity,避免触发行/绘制。

  • will-change 用于关键动画前提示浏览器,但滥用会占用显存。

  • 使用 contain(如 contain: layout paint)限制渲染影响域,有助组件化性能。

  • 合理使用 image-rendering、WebP/AVIF、loading="lazy" 等减少网络与绘制开销。

11.3 常见陷阱

  • 误用 vh 在移动端导致布局抖动(地址栏)。

  • CSS 变量在使用时未提供 fallback(color: var(--c, #000) 提供后备),或过度层次化导致难以维护。

  • :has() 在大 DOM 上复杂选择导致性能问题(在循环或大量节点检测时需谨慎)。


12. 可视化案例源码:

提供了以下功能:

  1. CSS3简介:介绍CSS3的基本概念和浏览器支持情况

  2. 主要CSS3特性:通过交互式卡片展示六大CSS3特性

    • 动画(Animation):可调整时长的关键帧动画

    • 过渡(Transition):可调整时长的悬停过渡效果

    • 变形(Transform):可调整强度的缩放和旋转效果

    • 渐变(Gradient):可自定义颜色的线性渐变

    • 阴影(Shadow):可调整参数的元素阴影

    • 弹性盒子(Flexbox):可调整布局方向的弹性盒子

  3. 代码示例:展示实现这些效果的CSS代码

  4. 实用技巧:提供CSS3使用的最佳实践和性能建议

页面采用响应式设计,可以在各种设备上正常显示,并通过交互式控件实时调整CSS参数查看效果

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS3 新特性可视化详解</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        :root {
            --primary: #4361ee;
            --secondary: #3a0ca3;
            --accent: #7209b7;
            --light: #f8f9fa;
            --dark: #212529;
            --success: #4cc9f0;
            --warning: #f72585;
            --info: #4895ef;
            --gradient-start: #4361ee;
            --gradient-end: #4cc9f0;
            --animation-duration: 1s;
            --transition-duration: 0.5s;
            --transform-value: 1.2;
        }
        
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }
        
        body {
            background-color: #f5f7ff;
            color: var(--dark);
            line-height: 1.6;
            padding-bottom: 2rem;
        }
        
        header {
            background: linear-gradient(135deg, var(--primary), var(--secondary));
            color: white;
            text-align: center;
            padding: 2rem 1rem;
            margin-bottom: 2rem;
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
        }
        
        h1 {
            font-size: 2.5rem;
            margin-bottom: 0.5rem;
        }
        
        .subtitle {
            font-size: 1.2rem;
            opacity: 0.9;
            max-width: 800px;
            margin: 0 auto;
        }
        
        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 0 1rem;
        }
        
        .section {
            background: white;
            border-radius: 10px;
            padding: 1.5rem;
            margin-bottom: 2rem;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.05);
        }
        
        h2 {
            color: var(--primary);
            margin-bottom: 1.2rem;
            padding-bottom: 0.5rem;
            border-bottom: 2px solid var(--light);
            display: flex;
            align-items: center;
        }
        
        h2 i {
            margin-right: 10px;
        }
        
        h3 {
            color: var(--secondary);
            margin: 1.5rem 0 0.8rem;
        }
        
        p {
            margin-bottom: 1rem;
        }
        
        .cards-container {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
            gap: 1.5rem;
            margin: 1.5rem 0;
        }
        
        .card {
            background: white;
            border-radius: 8px;
            overflow: hidden;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.08);
            transition: transform 0.3s ease;
        }
        
        .card:hover {
            transform: translateY(-5px);
        }
        
        .card-header {
            color: white;
            padding: 1rem;
            font-weight: bold;
            display: flex;
            align-items: center;
        }
        
        .card-header i {
            margin-right: 8px;
            font-size: 1.2rem;
        }
        
        .animation-header {
            background: var(--primary);
        }
        
        .transition-header {
            background: var(--accent);
        }
        
        .transform-header {
            background: var(--warning);
        }
        
        .gradient-header {
            background: var(--info);
        }
        
        .shadow-header {
            background: var(--success);
        }
        
        .flexbox-header {
            background: var(--secondary);
        }
        
        .card-body {
            padding: 1.2rem;
        }
        
        .demo-box {
            width: 100px;
            height: 100px;
            background: var(--primary);
            margin: 1rem auto;
            border-radius: 8px;
            display: flex;
            justify-content: center;
            align-items: center;
            color: white;
            font-weight: bold;
        }
        
        .controls {
            background: #f8f9fa;
            padding: 1rem;
            border-radius: 8px;
            margin: 1rem 0;
        }
        
        .control-group {
            margin-bottom: 0.8rem;
        }
        
        label {
            display: block;
            margin-bottom: 0.3rem;
            font-weight: 500;
        }
        
        input[type="range"] {
            width: 100%;
        }
        
        .btn {
            display: inline-block;
            background: var(--primary);
            color: white;
            padding: 0.6rem 1.2rem;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-weight: bold;
            transition: background 0.3s;
            margin-right: 0.5rem;
            margin-bottom: 0.5rem;
        }
        
        .btn:hover {
            background: var(--secondary);
        }
        
        .code-container {
            background: #2d2d2d;
            color: #f8f8f2;
            border-radius: 6px;
            padding: 1rem;
            margin: 1rem 0;
            overflow-x: auto;
            font-family: 'Fira Code', monospace;
        }
        
        .code-comment {
            color: #8292a2;
        }
        
        .code-keyword {
            color: #f92672;
        }
        
        .code-function {
            color: #e6db74;
        }
        
        .code-parameter {
            color: #fd971f;
        }
        
        .code-string {
            color: #a6e22e;
        }
        
        .code-number {
            color: #ae81ff;
        }
        
        .demo-container {
            display: grid;
            grid-template-columns: 1fr 1fr;
            gap: 1.5rem;
            margin-top: 1rem;
        }
        
        /* 动画演示样式 */
        .animated-box {
            animation: demoAnimation var(--animation-duration) infinite alternate;
        }
        
        @keyframes demoAnimation {
            0% {
                transform: translateY(0) scale(1);
                background: var(--primary);
            }
            100% {
                transform: translateY(-20px) scale(1.1);
                background: var(--accent);
            }
        }
        
        /* 过渡演示样式 */
        .transition-box {
            transition: all var(--transition-duration) ease;
        }
        
        .transition-box:hover {
            transform: rotate(45deg) scale(1.2);
            background: var(--warning);
            border-radius: 50%;
        }
        
        /* 变形演示样式 */
        .transform-demo {
            transform: scale(var(--transform-value)) rotate(calc(var(--transform-value) * 45deg));
        }
        
        /* 渐变演示样式 */
        .gradient-demo {
            background: linear-gradient(135deg, var(--gradient-start), var(--gradient-end));
        }
        
        /* 阴影演示样式 */
        .shadow-demo {
            box-shadow: calc(var(--shadow-h) * 1px) calc(var(--shadow-v) * 1px) calc(var(--shadow-blur) * 1px) calc(var(--shadow-spread) * 1px) var(--shadow-color);
        }
        
        /* 弹性盒子演示样式 */
        .flex-container {
            display: flex;
            height: 150px;
            background: #f0f0f0;
            padding: 10px;
            border-radius: 8px;
            margin-bottom: 1rem;
        }
        
        .flex-item {
            background: var(--primary);
            color: white;
            margin: 5px;
            padding: 10px;
            border-radius: 4px;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        
        @media (max-width: 768px) {
            .demo-container {
                grid-template-columns: 1fr;
            }
        }
        
        footer {
            text-align: center;
            margin-top: 3rem;
            color: #6c757d;
        }
        
        .tip {
            background: #e9f7fe;
            border-left: 4px solid var(--info);
            padding: 1rem;
            margin: 1rem 0;
            border-radius: 0 4px 4px 0;
        }
        
        .browser-support {
            display: flex;
            align-items: center;
            margin: 1rem 0;
            flex-wrap: wrap;
        }
        
        .browser {
            display: flex;
            align-items: center;
            margin-right: 1.5rem;
            margin-bottom: 0.5rem;
        }
        
        .browser i {
            font-size: 1.5rem;
            margin-right: 0.5rem;
        }
        
        .browser-chrome {
            color: #4285F4;
        }
        
        .browser-firefox {
            color: #FF7139;
        }
        
        .browser-safari {
            color: #000000;
        }
        
        .browser-edge {
            color: #0078D7;
        }
    </style>
</head>
<body>
    <header>
        <h1>CSS3 新特性可视化详解</h1>
        <p class="subtitle">探索CSS3的强大功能:动画、过渡、变形、渐变等</p>
    </header>
    
    <div class="container">
        <section class="section">
            <h2><i class="fas fa-star"></i> CSS3 简介</h2>
            <p>CSS3是CSS规范的最新版本,带来了众多令人兴奋的新特性,使Web开发人员能够创建更精美、交互性更强的网页,而无需使用JavaScript或图像。</p>
            
            <div class="tip">
                <p><strong>提示:</strong> 以下演示都是纯CSS实现,没有使用JavaScript(除了交互控制部分)</p>
            </div>
            
            <div class="browser-support">
                <div class="browser">
                    <i class="fab fa-chrome browser-chrome"></i>
                    <span>Chrome 4+</span>
                </div>
                <div class="browser">
                    <i class="fab fa-firefox browser-firefox"></i>
                    <span>Firefox 3.6+</span>
                </div>
                <div class="browser">
                    <i class="fab fa-safari browser-safari"></i>
                    <span>Safari 4+</span>
                </div>
                <div class="browser">
                    <i class="fab fa-edge browser-edge"></i>
                    <span>Edge 12+</span>
                </div>
            </div>
        </section>
        
        <section class="section">
            <h2><i class="fas fa-paint-brush"></i> 主要CSS3特性</h2>
            
            <div class="cards-container">
                <div class="card">
                    <div class="card-header animation-header">
                        <i class="fas fa-film"></i> 动画
                    </div>
                    <div class="card-body">
                        <p>使用@keyframes创建复杂动画,控制中间步骤</p>
                        <div class="demo-box animated-box">动画</div>
                        <div class="controls">
                            <div class="control-group">
                                <label for="animation-duration">动画时长: <output id="animation-duration-output">1</output>s</label>
                                <input type="range" id="animation-duration" min="0.1" max="3" step="0.1" value="1">
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-header transition-header">
                        <i class="fas fa-exchange-alt"></i> 过渡
                    </div>
                    <div class="card-body">
                        <p>在不同状态之间平滑过渡,增强用户体验</p>
                        <div class="demo-box transition-box">悬停我</div>
                        <div class="controls">
                            <div class="control-group">
                                <label for="transition-duration">过渡时长: <output id="transition-duration-output">0.5</output>s</label>
                                <input type="range" id="transition-duration" min="0.1" max="3" step="0.1" value="0.5">
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-header transform-header">
                        <i class="fas fa-expand-arrows-alt"></i> 变形
                    </div>
                    <div class="card-body">
                        <p>对元素进行旋转、缩放、倾斜和平移</p>
                        <div class="demo-box transform-demo">变形</div>
                        <div class="controls">
                            <div class="control-group">
                                <label for="transform-value">变形强度: <output id="transform-value-output">1.2</output></label>
                                <input type="range" id="transform-value" min="0.5" max="2" step="0.1" value="1.2">
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-header gradient-header">
                        <i class="fas fa-fill-drip"></i> 渐变
                    </div>
                    <div class="card-body">
                        <p>创建平滑的颜色过渡,替代图像渐变</p>
                        <div class="demo-box gradient-demo">渐变</div>
                        <div class="controls">
                            <div class="control-group">
                                <label for="gradient-start">起始颜色</label>
                                <input type="color" id="gradient-start" value="#4361ee">
                            </div>
                            <div class="control-group">
                                <label for="gradient-end">结束颜色</label>
                                <input type="color" id="gradient-end" value="#4cc9f0">
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-header shadow-header">
                        <i class="fas fa-cloud"></i> 阴影
                    </div>
                    <div class="card-body">
                        <p>为元素和文本添加阴影效果,增加深度感</p>
                        <div class="demo-box shadow-demo">阴影</div>
                        <div class="controls">
                            <div class="control-group">
                                <label for="shadow-h">水平阴影: <output id="shadow-h-output">5</output>px</label>
                                <input type="range" id="shadow-h" min="-20" max="20" value="5">
                            </div>
                            <div class="control-group">
                                <label for="shadow-v">垂直阴影: <output id="shadow-v-output">5</output>px</label>
                                <input type="range" id="shadow-v" min="-20" max="20" value="5">
                            </div>
                            <div class="control-group">
                                <label for="shadow-blur">模糊度: <output id="shadow-blur-output">10</output>px</label>
                                <input type="range" id="shadow-blur" min="0" max="30" value="10">
                            </div>
                            <div class="control-group">
                                <label for="shadow-color">阴影颜色</label>
                                <input type="color" id="shadow-color" value="#000000">
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-header flexbox-header">
                        <i class="fas fa-th"></i> 弹性盒子
                    </div>
                    <div class="card-body">
                        <p>提供更有效的布局方式,对齐和分配空间 among items</p>
                        <div class="flex-container">
                            <div class="flex-item">1</div>
                            <div class="flex-item">2</div>
                            <div class="flex-item">3</div>
                        </div>
                        <div class="controls">
                            <div class="control-group">
                                <label for="flex-direction">方向</label>
                                <select id="flex-direction">
                                    <option value="row">行 (row)</option>
                                    <option value="row-reverse">行反转 (row-reverse)</option>
                                    <option value="column">列 (column)</option>
                                    <option value="column-reverse">列反转 (column-reverse)</option>
                                </select>
                            </div>
                            <div class="control-group">
                                <label for="flex-justify">主轴对齐</label>
                                <select id="flex-justify">
                                    <option value="flex-start">起始 (flex-start)</option>
                                    <option value="flex-end">结束 (flex-end)</option>
                                    <option value="center">居中 (center)</option>
                                    <option value="space-between">之间 (space-between)</option>
                                    <option value="space-around">周围 (space-around)</option>
                                </select>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </section>
        
        <section class="section">
            <h2><i class="fas fa-code"></i> 代码示例</h2>
            
            <h3>CSS动画</h3>
            <div class="demo-container">
                <div class="code-container">
                    <span class="code-comment">/* 定义关键帧动画 */</span><br>
                    <span class="code-keyword">@keyframes</span> example {<br>
                    &nbsp;&nbsp;<span class="code-keyword">0%</span> {<br>
                    &nbsp;&nbsp;&nbsp;&nbsp;transform: <span class="code-function">translateY</span>(<span class="code-number">0</span>);<br>
                    &nbsp;&nbsp;&nbsp;&nbsp;background: <span class="code-function">var</span>(--primary);<br>
                    &nbsp;&nbsp;}<br>
                    &nbsp;&nbsp;<span class="code-keyword">100%</span> {<br>
                    &nbsp;&nbsp;&nbsp;&nbsp;transform: <span class="code-function">translateY</span>(-20px);<br>
                    &nbsp;&nbsp;&nbsp;&nbsp;background: <span class="code-function">var</span>(--accent);<br>
                    &nbsp;&nbsp;}<br>
                    }<br><br>
                    
                    <span class="code-comment">/* 应用动画 */</span><br>
                    .animated-element {<br>
                    &nbsp;&nbsp;animation: example <span class="code-number">1</span>s infinite alternate;<br>
                    }
                </div>
                
                <div class="code-container">
                    <span class="code-comment">/* 过渡效果 */</span><br>
                    .transition-element {<br>
                    &nbsp;&nbsp;transition: all <span class="code-number">0.5</span>s ease;<br>
                    &nbsp;&nbsp;background: <span class="code-function">var</span>(--primary);<br>
                    }<br><br>
                    
                    .transition-element:hover {<br>
                    &nbsp;&nbsp;transform: <span class="code-function">rotate</span>(45deg) <span class="code-function">scale</span>(1.2);<br>
                    &nbsp;&nbsp;background: <span class="code-function">var</span>(--warning);<br>
                    &nbsp;&nbsp;border-radius: <span class="code-number">50</span>%;<br>
                    }
                </div>
            </div>
            
            <h3>渐变与变形</h3>
            <div class="demo-container">
                <div class="code-container">
                    <span class="code-comment">/* 渐变背景 */</span><br>
                    .gradient-box {<br>
                    &nbsp;&nbsp;background: <span class="code-function">linear-gradient</span>(<br>
                    &nbsp;&nbsp;&nbsp;&nbsp;135deg,<br>
                    &nbsp;&nbsp;&nbsp;&nbsp;<span class="code-function">var</span>(--gradient-start),<br>
                    &nbsp;&nbsp;&nbsp;&nbsp;<span class="code-function">var</span>(--gradient-end)<br>
                    &nbsp;&nbsp;);<br>
                    &nbsp;&nbsp;border-radius: <span class="code-number">8</span>px;<br>
                    }
                </div>
                
                <div class="code-container">
                    <span class="code-comment">/* 变形效果 */</span><br>
                    .transformed-element {<br>
                    &nbsp;&nbsp;transform: <span class="code-function">scale</span>(1.2) <span class="code-function">rotate</span>(45deg);<br>
                    &nbsp;&nbsp;transition: transform <span class="code-number">0.3</span>s ease;<br>
                    }<br><br>
                    
                    <span class="code-comment">/* 阴影效果 */</span><br>
                    .shadow-element {<br>
                    &nbsp;&nbsp;box-shadow: <span class="code-number">5</span>px <span class="code-number">5</span>px <span class="code-number">10</span>px <span class="code-number">0</span> <span class="code-function">rgba</span>(0, 0, 0, 0.5);<br>
                    }
                </div>
            </div>
        </section>
        
        <section class="section">
            <h2><i class="fas fa-lightbulb"></i> 实用技巧</h2>
            
            <div class="cards-container">
                <div class="card">
                    <div class="card-body">
                        <h3>性能优化</h3>
                        <p>使用<code>transform</code>和<code>opacity</code>进行动画,这些属性不会触发重排,因此性能更好。</p>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-body">
                        <h3>回退方案</h3>
                        <p>为不支持CSS3的浏览器提供回退样式,确保基本功能可用。</p>
                    </div>
                </div>
                
                <div class="card">
                    <div class="card-body">
                        <h3>前缀处理</h3>
                        <p>使用Autoprefixer等工具自动添加浏览器前缀,确保跨浏览器兼容性。</p>
                    </div>
                </div>
            </div>
            
            <div class="tip">
                <p><strong>提示:</strong> 使用CSS变量(自定义属性)可以轻松管理颜色、尺寸和动画参数,并使主题切换变得简单。</p>
            </div>
        </section>
    </div>
    
    <footer>
        <p>CSS3 新特性可视化详解 &copy; 2023 - 使用现代CSS技术创建更精美的网页</p>
    </footer>

    <script>
        // 更新动画时长
        const animationDurationInput = document.getElementById('animation-duration');
        const animationDurationOutput = document.getElementById('animation-duration-output');
        
        animationDurationInput.addEventListener('input', function() {
            const value = this.value;
            animationDurationOutput.textContent = value;
            document.documentElement.style.setProperty('--animation-duration', value + 's');
        });
        
        // 更新过渡时长
        const transitionDurationInput = document.getElementById('transition-duration');
        const transitionDurationOutput = document.getElementById('transition-duration-output');
        
        transitionDurationInput.addEventListener('input', function() {
            const value = this.value;
            transitionDurationOutput.textContent = value;
            document.documentElement.style.setProperty('--transition-duration', value + 's');
        });
        
        // 更新变形值
        const transformValueInput = document.getElementById('transform-value');
        const transformValueOutput = document.getElementById('transform-value-output');
        
        transformValueInput.addEventListener('input', function() {
            const value = this.value;
            transformValueOutput.textContent = value;
            document.documentElement.style.setProperty('--transform-value', value);
        });
        
        // 更新渐变颜色
        const gradientStartInput = document.getElementById('gradient-start');
        const gradientEndInput = document.getElementById('gradient-end');
        
        gradientStartInput.addEventListener('input', function() {
            document.documentElement.style.setProperty('--gradient-start', this.value);
        });
        
        gradientEndInput.addEventListener('input', function() {
            document.documentElement.style.setProperty('--gradient-end', this.value);
        });
        
        // 更新阴影效果
        const shadowHInput = document.getElementById('shadow-h');
        const shadowHOutput = document.getElementById('shadow-h-output');
        const shadowVInput = document.getElementById('shadow-v');
        const shadowVOutput = document.getElementById('shadow-v-output');
        const shadowBlurInput = document.getElementById('shadow-blur');
        const shadowBlurOutput = document.getElementById('shadow-blur-output');
        const shadowColorInput = document.getElementById('shadow-color');
        
        function updateShadow() {
            const h = shadowHInput.value;
            const v = shadowVInput.value;
            const blur = shadowBlurInput.value;
            const color = shadowColorInput.value;
            
            shadowHOutput.textContent = h;
            shadowVOutput.textContent = v;
            shadowBlurOutput.textContent = blur;
            
            document.documentElement.style.setProperty('--shadow-h', h);
            document.documentElement.style.setProperty('--shadow-v', v);
            document.documentElement.style.setProperty('--shadow-blur', blur);
            document.documentElement.style.setProperty('--shadow-color', color);
        }
        
        shadowHInput.addEventListener('input', updateShadow);
        shadowVInput.addEventListener('input', updateShadow);
        shadowBlurInput.addEventListener('input', updateShadow);
        shadowColorInput.addEventListener('input', updateShadow);
        
        // 更新Flexbox布局
        const flexDirectionInput = document.getElementById('flex-direction');
        const flexJustifyInput = document.getElementById('flex-justify');
        const flexContainer = document.querySelector('.flex-container');
        
        flexDirectionInput.addEventListener('change', function() {
            flexContainer.style.flexDirection = this.value;
        });
        
        flexJustifyInput.addEventListener('change', function() {
            flexContainer.style.justifyContent = this.value;
        });
        
        // 初始化
        updateShadow();
    </script>
</body>
</html>
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐