Loading...
Loading...
Compare original and translation side by side
undefinedundefined
**Use context7 whenever**:
- You're unsure about exact syntax or property values
- You need to verify browser support for a feature
- You want to find the most current best practices
- You're working with cutting-edge CSS features
- You need to understand spec details or edge cases
**在以下情况务必使用context7**:
- 你不确定确切的语法或属性值时
- 需要验证某个特性的浏览器支持情况时
- 想要找到最新的最佳实践时
- 处理前沿CSS特性时
- 需要理解规范细节或边缘情况时/* Common flex patterns */
.container {
display: flex;
gap: 1rem; /* Prefer gap over margins for spacing */
}
/* Center content */
.centered {
display: flex;
justify-content: center;
align-items: center;
}
/* Responsive flex wrapping */
.flex-wrap {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.flex-wrap > * {
flex: 1 1 300px; /* Grow, shrink, basis */
}
/* Common flex utilities */
.flex-1 { flex: 1; }
.flex-none { flex: none; }
.flex-auto { flex: auto; }/* 常见flex模式 */
.container {
display: flex;
gap: 1rem; /* 优先使用gap而非margin进行间距控制 */
}
/* 居中内容 */
.centered {
display: flex;
justify-content: center;
align-items: center;
}
/* 响应式flex换行 */
.flex-wrap {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.flex-wrap > * {
flex: 1 1 300px; /* 放大比例,缩小比例,基础尺寸 */
}
/* 常用flex工具类 */
.flex-1 { flex: 1; }
.flex-none { flex: none; }
.flex-auto { flex: auto; }/* Responsive grid with auto-fit */
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
}
/* Named grid areas for semantic layouts */
.layout {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
/* Dense packing for masonry-like layouts */
.masonry {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-auto-flow: dense;
gap: 1rem;
}/* 带auto-fit的响应式网格 */
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
}
/* 用于语义化布局的命名网格区域 */
.layout {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
grid-template-columns: 250px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }
/* 用于瀑布流布局的密集排列 */
.masonry {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-auto-flow: dense;
gap: 1rem;
}/* Container query setup */
.card-container {
container-type: inline-size;
container-name: card;
}
/* Query the container, not the viewport */
@container card (min-width: 400px) {
.card {
display: grid;
grid-template-columns: 150px 1fr;
}
}
@container card (min-width: 600px) {
.card {
grid-template-columns: 200px 1fr;
}
}/* 容器查询设置 */
.card-container {
container-type: inline-size;
container-name: card;
}
/* 查询容器而非视口 */
@container card (min-width: 400px) {
.card {
display: grid;
grid-template-columns: 150px 1fr;
}
}
@container card (min-width: 600px) {
.card {
grid-template-columns: 200px 1fr;
}
}:root {
/* Color system */
--color-primary: #0066cc;
--color-primary-dark: #004499;
--color-surface: #ffffff;
--color-text: #1a1a1a;
/* Spacing scale */
--space-xs: 0.25rem;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 2rem;
--space-xl: 4rem;
/* Typography */
--font-sans: system-ui, -apple-system, sans-serif;
--font-mono: 'Fira Code', monospace;
/* Dark mode using data attribute */
--bg: var(--color-surface);
--fg: var(--color-text);
}
[data-theme="dark"] {
--color-surface: #1a1a1a;
--color-text: #e5e5e5;
}
/* Using custom properties */
.button {
background: var(--color-primary);
padding: var(--space-sm) var(--space-md);
font-family: var(--font-sans);
}:root {
/* 颜色系统 */
--color-primary: #0066cc;
--color-primary-dark: #004499;
--color-surface: #ffffff;
--color-text: #1a1a1a;
/* 间距刻度 */
--space-xs: 0.25rem;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 2rem;
--space-xl: 4rem;
/* 排版 */
--font-sans: system-ui, -apple-system, sans-serif;
--font-mono: 'Fira Code', monospace;
/* 使用data属性实现暗黑模式 */
--bg: var(--color-surface);
--fg: var(--color-text);
}
[data-theme="dark"] {
--color-surface: #1a1a1a;
--color-text: #e5e5e5;
}
/* 使用自定义属性 */
.button {
background: var(--color-primary);
padding: var(--space-sm) var(--space-md);
font-family: var(--font-sans);
}/* Define layer order - lowest specificity first */
@layer reset, base, components, utilities;
@layer reset {
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
}
@layer base {
body {
font-family: system-ui, sans-serif;
line-height: 1.5;
}
}
@layer components {
.button {
padding: 0.5rem 1rem;
border-radius: 0.25rem;
}
}
@layer utilities {
.text-center { text-align: center; }
.hidden { display: none; }
}/* 定义层顺序 - 优先级从低到高 */
@layer reset, base, components, utilities;
@layer reset {
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
}
@layer base {
body {
font-family: system-ui, sans-serif;
line-height: 1.5;
}
}
@layer components {
.button {
padding: 0.5rem 1rem;
border-radius: 0.25rem;
}
}
@layer utilities {
.text-center { text-align: center; }
.hidden { display: none; }
}/* :is() for grouping (no specificity increase) */
:is(h1, h2, h3) {
font-weight: 700;
line-height: 1.2;
}
/* :where() for zero specificity */
:where(.card, .panel) > :where(h2, h3) {
margin-top: 0;
}
/* :has() for parent selection */
.card:has(img) {
display: grid;
grid-template-columns: 200px 1fr;
}
.form:has(:invalid) .submit-button {
opacity: 0.5;
pointer-events: none;
}
/* Logical properties for internationalization */
.element {
margin-inline-start: 1rem; /* Instead of margin-left */
padding-block: 2rem; /* Instead of padding-top and padding-bottom */
border-inline-end: 1px solid; /* Instead of border-right */
}/* :is()用于分组(不会提升优先级) */
:is(h1, h2, h3) {
font-weight: 700;
line-height: 1.2;
}
/* :where()优先级为0 */
:where(.card, .panel) > :where(h2, h3) {
margin-top: 0;
}
/* :has()用于父元素选择 */
.card:has(img) {
display: grid;
grid-template-columns: 200px 1fr;
}
.form:has(:invalid) .submit-button {
opacity: 0.5;
pointer-events: none;
}
/* 用于国际化的逻辑属性 */
.element {
margin-inline-start: 1rem; /* 替代margin-left */
padding-block: 2rem; /* 替代padding-top和padding-bottom */
border-inline-end: 1px solid; /* 替代border-right */
}/* Only animate transform and opacity for 60fps */
.smooth-animation {
/* Hint to browser for optimization */
will-change: transform;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.smooth-animation:hover {
transform: translateY(-4px);
}
/* Remove will-change after animation */
.smooth-animation:not(:hover) {
will-change: auto;
}
/* Complex keyframe animations */
@keyframes slideInFade {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-in {
animation: slideInFade 0.4s ease-out;
}/* 仅对transform和opacity进行动画以保证60fps */
.smooth-animation {
/* 提示浏览器进行优化 */
will-change: transform;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.smooth-animation:hover {
transform: translateY(-4px);
}
/* 动画结束后移除will-change */
.smooth-animation:not(:hover) {
will-change: auto;
}
/* 复杂关键帧动画 */
@keyframes slideInFade {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.animate-in {
animation: slideInFade 0.4s ease-out;
}/* Smooth page transitions */
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 0.3s;
}
/* Named transitions for specific elements */
.hero {
view-transition-name: hero-image;
}
::view-transition-old(hero-image),
::view-transition-new(hero-image) {
animation-duration: 0.5s;
}/* 平滑页面过渡 */
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 0.3s;
}
/* 针对特定元素的命名过渡 */
.hero {
view-transition-name: hero-image;
}
::view-transition-old(hero-image),
::view-transition-new(hero-image) {
animation-duration: 0.5s;
}/* Animate on scroll progress */
@keyframes fade-in {
from {
opacity: 0;
transform: translateY(50px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.scroll-reveal {
animation: fade-in linear;
animation-timeline: view();
animation-range: entry 0% cover 30%;
}/* 随滚动进度触发动画 */
@keyframes fade-in {
from {
opacity: 0;
transform: translateY(50px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.scroll-reveal {
animation: fade-in linear;
animation-timeline: view();
animation-range: entry 0% cover 30%;
}/* Mobile-first approach */
.component {
/* Base mobile styles */
padding: 1rem;
}
/* Tablet */
@media (min-width: 768px) {
.component {
padding: 2rem;
}
}
/* Desktop */
@media (min-width: 1024px) {
.component {
padding: 3rem;
}
}
/* Wide desktop */
@media (min-width: 1440px) {
.component {
padding: 4rem;
}
}
/* Prefer reduced motion */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* Dark mode preference */
@media (prefers-color-scheme: dark) {
:root {
--bg: #1a1a1a;
--fg: #e5e5e5;
}
}/* 移动端优先方案 */
.component {
/* 基础移动端样式 */
padding: 1rem;
}
/* 平板端 */
@media (min-width: 768px) {
.component {
padding: 2rem;
}
}
/* 桌面端 */
@media (min-width: 1024px) {
.component {
padding: 3rem;
}
}
/* 宽屏桌面端 */
@media (min-width: 1440px) {
.component {
padding: 4rem;
}
}
/* 尊重用户的减少动效偏好 */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* 暗黑模式偏好 */
@media (prefers-color-scheme: dark) {
:root {
--bg: #1a1a1a;
--fg: #e5e5e5;
}
}/* Clamp for responsive font sizes */
h1 {
font-size: clamp(2rem, 4vw + 1rem, 4rem);
}
body {
font-size: clamp(1rem, 0.5vw + 0.875rem, 1.125rem);
}
/* Or using custom properties */
:root {
--fluid-min-width: 320;
--fluid-max-width: 1140;
--fluid-min-size: 16;
--fluid-max-size: 20;
--fluid-size: calc(
(var(--fluid-min-size) * 1px) +
(var(--fluid-max-size) - var(--fluid-min-size)) *
((100vw - (var(--fluid-min-width) * 1px)) /
(var(--fluid-max-width) - var(--fluid-min-width)))
);
}
body {
font-size: clamp(
var(--fluid-min-size) * 1px,
var(--fluid-size),
var(--fluid-max-size) * 1px
);
}/* 使用clamp实现响应式字号 */
h1 {
font-size: clamp(2rem, 4vw + 1rem, 4rem);
}
body {
font-size: clamp(1rem, 0.5vw + 0.875rem, 1.125rem);
}
/* 或使用自定义属性 */
:root {
--fluid-min-width: 320;
--fluid-max-width: 1140;
--fluid-min-size: 16;
--fluid-max-size: 20;
--fluid-size: calc(
(var(--fluid-min-size) * 1px) +
(var(--fluid-max-size) - var(--fluid-min-size)) *
((100vw - (var(--fluid-min-width) * 1px)) /
(var(--fluid-max-width) - var(--fluid-min-width)))
);
}
body {
font-size: clamp(
var(--fluid-min-size) * 1px,
var(--fluid-size),
var(--fluid-max-size) * 1px
);
}/* 1. Avoid expensive properties */
.avoid {
box-shadow: ...; /* OK, GPU accelerated */
filter: ...; /* Expensive, use sparingly */
}
/* 2. Use containment for isolated components */
.card {
contain: layout style paint;
/* Tells browser this element's styles won't affect others */
}
.isolated-component {
content-visibility: auto; /* Skip rendering offscreen elements */
}
/* 3. Optimize selectors - specificity vs performance */
/* Fast ✅ */
.button { }
.nav-item { }
/* Slower ❌ */
div.container ul li a.link { }
[class*="btn-"] { }/* 1. 避免高开销属性 */
.avoid {
box-shadow: ...; /* 可行,GPU加速 */
filter: ...; /* 高开销,谨慎使用 */
}
/* 2. 对独立组件使用containment */
.card {
contain: layout style paint;
/* 告知浏览器该元素的样式不会影响其他元素 */
}
.isolated-component {
content-visibility: auto; /* 跳过渲染屏幕外元素 */
}
/* 3. 优化选择器 - 优先级与性能的平衡 */
/* 快速 ✅ */
.button { }
.nav-item { }
/* 较慢 ❌ */
div.container ul li a.link { }
[class*="btn-"] { }<!-- Critical CSS inline in <head> -->
<style>
/* Above-the-fold styles */
</style>
<!-- Non-critical CSS with media query trick -->
<link rel="stylesheet" href="styles.css" media="print" onload="this.media='all'">
<!-- Preload for faster loading -->
<link rel="preload" href="fonts.woff2" as="font" type="font/woff2" crossorigin>/* 关键CSS内联在<head>中 */
<style>
/* 首屏样式 */
</style>
/* 非关键CSS使用媒体查询技巧延迟加载 */
<link rel="stylesheet" href="styles.css" media="print" onload="this.media='all'">
/* 预加载以提升加载速度 */
<link rel="preload" href="fonts.woff2" as="font" type="font/woff2" crossorigin>/* Block */
.card { }
/* Element - part of block */
.card__title { }
.card__body { }
.card__footer { }
/* Modifier - variation of block */
.card--featured { }
.card--large { }
.card__title--primary { }/* 块 */
.card { }
/* 元素 - 块的一部分 */
.card__title { }
.card__body { }
.card__footer { }
/* 修饰符 - 块的变体 */
.card--featured { }
.card--large { }
.card__title--primary { }/* Spacing utilities */
.p-4 { padding: 1rem; }
.px-4 { padding-left: 1rem; padding-right: 1rem; }
.mt-2 { margin-top: 0.5rem; }
/* Layout utilities */
.flex { display: flex; }
.grid { display: grid; }
.hidden { display: none; }
/* Typography utilities */
.text-lg { font-size: 1.125rem; }
.font-bold { font-weight: 700; }
.text-center { text-align: center; }/* 间距工具类 */
.p-4 { padding: 1rem; }
.px-4 { padding-left: 1rem; padding-right: 1rem; }
.mt-2 { margin-top: 0.5rem; }
/* 布局工具类 */
.flex { display: flex; }
.grid { display: grid; }
.hidden { display: none; }
/* 排版工具类 */
.text-lg { font-size: 1.125rem; }
.font-bold { font-weight: 700; }
.text-center { text-align: center; }styles/
├── base/
│ ├── reset.css
│ ├── typography.css
│ └── utilities.css
├── components/
│ ├── button.css
│ ├── card.css
│ └── nav.css
├── layout/
│ ├── grid.css
│ ├── header.css
│ └── footer.css
├── themes/
│ ├── light.css
│ └── dark.css
└── main.css (imports all)styles/
├── base/
│ ├── reset.css
│ ├── typography.css
│ └── utilities.css
├── components/
│ ├── button.css
│ ├── card.css
│ └── nav.css
├── layout/
│ ├── grid.css
│ ├── header.css
│ └── footer.css
├── themes/
│ ├── light.css
│ └── dark.css
└── main.css(导入所有文件):root {
/* Modern color functions */
--primary: oklch(60% 0.2 250); /* Perceptually uniform */
--surface: color-mix(in oklch, var(--primary) 10%, white);
/* Relative colors */
--primary-light: oklch(from var(--primary) calc(l + 20%) c h);
--primary-dark: oklch(from var(--primary) calc(l - 20%) c h);
/* Color contrast for accessibility */
--text-color: color-contrast(
var(--surface) vs black, white
);
}:root {
/* 现代颜色函数 */
--primary: oklch(60% 0.2 250); /* 感知均匀的颜色空间 */
--surface: color-mix(in oklch, var(--primary) 10%, white);
/* 相对颜色 */
--primary-light: oklch(from var(--primary) calc(l + 20%) c h);
--primary-dark: oklch(from var(--primary) calc(l - 20%) c h);
/* 用于无障碍的颜色对比度 */
--text-color: color-contrast(
var(--surface) vs black, white
);
}/* Fallback for older browsers */
.grid {
display: flex;
flex-wrap: wrap;
}
/* Enhanced for modern browsers */
@supports (display: grid) {
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
}
/* Progressive enhancement */
.button {
background: blue;
}
@supports (backdrop-filter: blur(10px)) {
.button {
background: rgba(0, 0, 255, 0.8);
backdrop-filter: blur(10px);
}
}/* 为旧浏览器提供降级方案 */
.grid {
display: flex;
flex-wrap: wrap;
}
/* 为现代浏览器提供增强效果 */
@supports (display: grid) {
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
}
/* 渐进式增强 */
.button {
background: blue;
}
@supports (backdrop-filter: blur(10px)) {
.button {
background: rgba(0, 0, 255, 0.8);
backdrop-filter: blur(10px);
}
}/* Modern way */
.video {
aspect-ratio: 16 / 9;
}
/* For images */
img {
aspect-ratio: 16 / 9;
object-fit: cover;
}/* 现代实现方式 */
.video {
aspect-ratio: 16 / 9;
}
/* 图片适配 */
img {
aspect-ratio: 16 / 9;
object-fit: cover;
}/* Single line */
.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Multiple lines */
.line-clamp {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}/* 单行截断 */
.truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 多行截断 */
.line-clamp {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}html {
scroll-behavior: smooth;
}
/* Scroll snapping */
.carousel {
scroll-snap-type: x mandatory;
overflow-x: auto;
}
.carousel > * {
scroll-snap-align: start;
}html {
scroll-behavior: smooth;
}
/* 滚动吸附 */
.carousel {
scroll-snap-type: x mandatory;
overflow-x: auto;
}
.carousel > * {
scroll-snap-align: start;
}/* Focus visible for keyboard users only */
:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
}
/* Hide visually but keep for screen readers */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/* Respect user preferences */
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
@media (prefers-contrast: high) {
.button {
border: 2px solid currentColor;
}
}/* 仅为键盘用户显示焦点样式 */
:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
}
/* 视觉隐藏但保留给屏幕阅读器 */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
/* 尊重用户偏好 */
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
@media (prefers-contrast: high) {
.button {
border: 2px solid currentColor;
}
}/* Modern CSS reset */
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
}
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
min-height: 100vh;
line-height: 1.5;
}
img,
picture,
video,
canvas,
svg {
display: block;
max-width: 100%;
}
input,
button,
textarea,
select {
font: inherit;
}
p,
h1,
h2,
h3,
h4,
h5,
h6 {
overflow-wrap: break-word;
}/* 现代CSS重置 */
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
}
html {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
min-height: 100vh;
line-height: 1.5;
}
img,
picture,
video,
canvas,
svg {
display: block;
max-width: 100%;
}
input,
button,
textarea,
select {
font: inherit;
}
p,
h1,
h2,
h3,
h4,
h5,
h6 {
overflow-wrap: break-word;
}