目录

动画 ✅ 现代CSS标准

Transform 变换 (完全推荐使用)

transform: rotate(20deg); /* 旋转 */
transform: skew(45deg); /* 扭曲 skewX(x) skewY(y) */
transform: scale(1.5, 0.5); /* 放大与缩小 */
transform: translate(50px, 100px); /* 元素移动 */

/* 组合变换 */
transform: rotate(45deg) scale(1.2) translate(100px, 50px);

/* 3D变换 */
transform: rotateX(30deg) rotateY(45deg) translateZ(100px);
transform-style: preserve-3d; /* 保持3D空间 */

Transition 过渡动画

/* 基础过渡 */
.button {
  transition: all 0.3s ease;
}

/* 多属性过渡 */
.card {
  transition: transform 0.3s ease,
              box-shadow 0.3s ease,
              opacity 0.3s ease;
}

.card:hover {
  transform: translateY(-5px);
  box-shadow: 0 10px 25px rgba(0,0,0,0.2);
  opacity: 0.9;
}

Animation 关键帧动画

@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(30px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.animate-in {
  animation: fadeInUp 0.6s ease-out;
}

/* 无限循环动画 */
@keyframes pulse {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.05); }
}

.pulse {
  animation: pulse 2s infinite;
}

隐藏元素

在 CSS 中,让元素隐藏的方法很多:

  • 有的占据空间,有的不占据空间

  • 有的可以响应点击,有的不能响应点击

 {
  display: none; /* 不占据空间,无法点击 */
}
 {
  visibility: hidden; /* 占据空间,无法点击 */
}
 {
  position: absolute;
  top: -999em; /* 不占据空间,无法点击 */
}
 {
  position: relative;
  top: -999em; /* 占据空间,无法点击 */
}
 {
  position: absolute;
  visibility: hidden; /* 不占据空间,无法点击 */
}
 {
  height: 0;
  overflow: hidden; /* 不占据空间,无法点击 */
}
 {
  opacity: 0;
  filter: Alpha(opacity=0); /* 占据空间,可以点击 */
}
 {
  position: absolute;
  opacity: 0;
  filter: Alpha(opacity=0); /* 不占据空间,可以点击 */
}

/* IE6/IE7/IE9不占据空间,IE8/FireFox/Chrome/Opera占据空间。都无法点击 */
 {
  zoom: 0.001;
  -moz-transform: scale(0);
  -webkit-transform: scale(0);
  -o-transform: scale(0);
  transform: scale(0);
}
/* 不占据空间,无法点击 */
 {
  position: absolute;
  zoom: 0.001;
  -moz-transform: scale(0);
  -webkit-transform: scale(0);
  -o-transform: scale(0);
  transform: scale(0);
}

现代CSS特性 🚀 2018年后新增

CSS自定义属性 (CSS变量)

/* 根级别定义变量 */
:root {
  --primary-color: #42b883;
  --secondary-color: #369870;
  --spacing-unit: 8px;
  --border-radius: 8px;
}

/* 使用变量 */
.button {
  background-color: var(--primary-color);
  padding: calc(var(--spacing-unit) * 2);
  border-radius: var(--border-radius);
}

/* 动态切换主题 */
[data-theme="dark"] {
  --primary-color: #64ffda;
  --bg-color: #1a1a1a;
}

/* JavaScript动态修改 */
/* document.documentElement.style.setProperty('--primary-color', '#ff6b6b'); */

现代CSS函数

clamp() 响应式数值

/* 响应式字体 - 无需媒体查询 */
h1 {
  font-size: clamp(1.5rem, 4vw, 3rem);
  /* 最小1.5rem,理想4vw,最大3rem */
}

/* 响应式间距 */
.container {
  padding: clamp(16px, 5vw, 64px);
  max-width: clamp(320px, 90vw, 1200px);
}

min() 和 max() 函数

/* 动态宽度控制 */
.card {
  width: min(100%, 400px);        /* 不超过容器宽度,最大400px */
  height: max(300px, 50vh);       /* 至少300px,理想50vh */
}

/* 响应式间距 */
.section {
  margin-top: max(2rem, 5vh);     /* 至少2rem,大屏幕时更大 */
}

calc() 计算函数

/* 精确计算 */
.sidebar {
  width: calc(100% - 300px);
  height: calc(100vh - 80px);     /* 视口高度减去头部高度 */
}

/* 结合CSS变量 */
.element {
  padding: calc(var(--spacing-unit) * 3);
  margin: calc(var(--spacing-unit) / 2);
}

宽高比控制

aspect-ratio 属性

/* ✅ 现代方案 - 一行搞定 */
.video-container {
  aspect-ratio: 16 / 9;           /* 16:9宽高比 */
}

.square {
  aspect-ratio: 1;                /* 正方形 */
}

.card-image {
  aspect-ratio: 4 / 3;            /* 4:3宽高比 */
  object-fit: cover;              /* 图片填充方式 */
}

/* ❌ 传统方案对比 - 复杂难懂 */
.old-aspect-ratio {
  width: 100%;
  padding-top: 56.25%;           /* 16:9 = 9/16*100% */
  position: relative;
}

现代单位

视口单位增强

/* 基础视口单位 */
.hero {
  height: 100vh;                  /* 视口高度 */
  width: 100vw;                   /* 视口宽度 */
}

/* 新的视口单位 (2022年+) */
.mobile-hero {
  height: 100dvh;                 /* 动态视口高度 - 解决移动端地址栏问题 */
  min-height: 100svh;             /* 小视口高度 */
  max-height: 100lvh;             /* 大视口高度 */
}

容器查询单位

/* 基于容器大小的单位 */
.card {
  container-type: inline-size;
}

.card-title {
  font-size: 4cqw;                /* 容器宽度的4% */
}

@container (min-width: 400px) {
  .card-content {
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
}

现代选择器

:is() 和 :where() 选择器

/* ✅ 简化复杂选择器 */
:is(h1, h2, h3, h4, h5, h6) {
  margin-top: 0;
  color: var(--heading-color);
}

/* 等同于传统写法 */
/* h1, h2, h3, h4, h5, h6 { margin-top: 0; } */

/* :where() 零权重选择器 */
:where(ul, ol) :where(ul, ol) {
  margin-block: 0;
}

:has() 父选择器

/* ✅ 根据子元素选择父元素 */
.card:has(.urgent) {
  border-color: red;
  background: #fff5f5;
}

.form:has(input:invalid) {
  border: 2px solid red;
}

.article:has(> img) {
  display: grid;
  grid-template-columns: 1fr 200px;
}

逻辑属性

/* ✅ 逻辑属性 - 支持RTL布局 */
.element {
  margin-block-start: 16px;       /* 替代 margin-top */
  margin-inline-end: 24px;        /* 替代 margin-right (LTR) 或 margin-left (RTL) */
  padding-inline: 20px;           /* 替代 padding-left + padding-right */
  border-block-end: 1px solid;    /* 替代 border-bottom */
}

/* 自动适应文字方向 */
.text {
  text-align: start;              /* 替代 text-align: left */
  float: inline-start;            /* 替代 float: left */
}

现代滚动特性

/* 平滑滚动 */
html {
  scroll-behavior: smooth;
}

/* 滚动捕捉 */
.gallery {
  scroll-snap-type: x mandatory;
  overflow-x: scroll;
}

.gallery-item {
  scroll-snap-align: start;
}

/* 滚动边距 */
.section {
  scroll-margin-top: 80px;        /* 锚点定位时的偏移 */
}

最佳实践建议

现代CSS开发流程

/* 1. 使用CSS自定义属性建立设计系统 */
:root {
  --color-primary: #42b883;
  --spacing-xs: 4px;
  --spacing-sm: 8px;
  --spacing-md: 16px;
  --border-radius: 8px;
}

/* 2. 使用现代布局 */
.layout {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: var(--spacing-md);
}

/* 3. 响应式设计 */
.title {
  font-size: clamp(1.5rem, 4vw, 3rem);
}

/* 4. 现代动画 */
.card {
  transition: transform 0.3s ease;
}

.card:hover {
  transform: translateY(-2px);
}