CSS 魔法与布局技巧
<h2 id="css-布局与视觉效果常用实践指南">CSS 布局与视觉效果常用实践指南</h2><p>在我一篇随笔中其实有说到十大布局,里面有提到 flex 布局、grid 布局、响应式布局,不过没有提到容器查询这个,现在说下这三个布局然后穿插下容器查询吧。</p>
<h2 id="1️⃣-核心布局方案">1️⃣ 核心布局方案</h2>
<h3 id="-flexbox-弹性布局">🧩 Flexbox 弹性布局</h3>
<p><img src="https://img2023.cnblogs.com/blog/2243302/202505/2243302-20250507220256925-486584212.png" alt="img" loading="lazy"></p>
<p>适用场景:线性布局、动态内容对齐,例如按钮组、导航栏、商品卡片列表</p>
<pre><code class="language-scss">.navbar {
display: flex;
justify-content: space-between;
align-items: center;
gap: 1.5rem;
flex-wrap: wrap;
@media (max-width: 768px) {
flex-direction: column;
}
}
</code></pre>
<h3 id="-grid-网格布局">🔳 Grid 网格布局</h3>
<p><img src="https://img2023.cnblogs.com/blog/2243302/202505/2243302-20250507220319358-17317134.png" alt="img" loading="lazy"></p>
<p>适用场景:二维布局、复杂排列</p>
<p>📦 应用场景:日历打卡、微信服务页面九宫格布局</p>
<pre><code class="language-scss">.calendar {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 8px;
}
.grid-menu {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
</code></pre>
<h3 id="-容器查询container-queries">📦 容器查询(Container Queries)</h3>
<p><img src="https://img2023.cnblogs.com/blog/2243302/202505/2243302-20250507224434280-163552526.jpg" alt="img" loading="lazy"><br>
<img src="https://img2023.cnblogs.com/blog/2243302/202505/2243302-20250507224448279-106458381.jpg" alt="img" loading="lazy"></p>
<p>组件根据容器大小自适应,而非整个视口</p>
<p>📦 应用场景:嵌套组件(如卡片、图表容器)</p>
<pre><code class="language-scss">.card-container {
container-type: inline-size;
container-name: card;
}
.card {
@container card (width < 800px) {
.desc {
font-size: 12px;
}
}
}
</code></pre>
<h3 id="-媒体查询media-queries">🖥 媒体查询(Media Queries)</h3>
<p>图片如上</p>
<p>适用场景:针对屏幕尺寸、设备类型进行响应式调整</p>
<p>📦 应用场景:整体页面布局、字体、间距适配</p>
<pre><code class="language-scss">$breakpoints: (
desktop: 1200px,
tablet: 768px,
mobile: 480px,
);
.card-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
padding: 2rem;
@media (max-width: map-get($breakpoints, tablet)) {
grid-template-columns: 1fr;
padding: 1.5rem;
}
@media (max-width: map-get($breakpoints, mobile)) {
padding: 1rem;
}
}
</code></pre>
<hr>
<h2 id="2️⃣-高级视觉效果">2️⃣ 高级视觉效果</h2>
<h3 id="-玻璃拟态glassmorphism">🔮 玻璃拟态(Glassmorphism)</h3>
<p><img src="https://img2023.cnblogs.com/blog/2243302/202505/2243302-20250507231640404-1595268486.jpg" alt="img" loading="lazy"></p>
<p>📦 应用场景:用户信息卡片、登录弹窗背景等</p>
<pre><code class="language-scss">.glass-panel {
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.15) 0%,
rgba(255, 255, 255, 0.05) 100%
);
backdrop-filter: blur(12px) saturate(160%);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1), inset 0 4px 12px rgba(255, 255, 255, 0.2);
@supports not (backdrop-filter: blur()) {
background: rgba(255, 255, 255, 0.9);
}
}
</code></pre>
<h3 id="-视差滚动parallax">🌌 视差滚动(Parallax)</h3>
<p><img src="https://img2023.cnblogs.com/blog/2243302/202505/2243302-20250509221603679-406690127.jpg" alt="img" loading="lazy"></p>
<p>📦 应用场景:活动页背景、Banner 页面动效</p>
<pre><code class="language-html"><div class="parallax-layer layer-1" data-speed="0.2"></div>
<div class="parallax-layer layer-2" data-speed="0.5"></div>
<div class="content">
<h1>视差滚动</h1>
<p>向下滚动查看效果...</p>
</div>
</code></pre>
<pre><code class="language-js">const layers = document.querySelectorAll(".parallax-layer");
function updateParallax() {
const scrollY = window.scrollY;
layers.forEach((layer) => {
const speed = parseFloat(layer.dataset.speed);
const offset = scrollY * speed;
layer.style.transform = `translateY(${offset}px)`;
});
}
window.addEventListener("scroll", updateParallax);
window.addEventListener("load", updateParallax);
</code></pre>
<pre><code class="language-css">* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body,
html {
height: 100%;
font-family: sans-serif;
}
.parallax-layer {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background-size: cover;
background-position: center;
will-change: transform;
}
.layer-1 {
background-color: #42a5f5;
z-index: 1;
}
.layer-2 {
background-color: #66bb6a;
z-index: 2;
}
.content {
position: relative;
z-index: 3;
min-height: 200vh;
padding: 100vh 2rem 2rem;
background: rgba(0, 0, 0, 0.8);
color: white;
}
</code></pre>
<hr>
<h2 id="3️⃣-响应式设计策略">3️⃣ 响应式设计策略</h2>
<h3 id="-自适应布局策略">📱 自适应布局策略</h3>
<p>优先使用弹性布局 + SCSS 嵌套媒体查询 + 相对单位</p>
<table>
<thead>
<tr>
<th>单位</th>
<th>适用场景</th>
<th>示例</th>
</tr>
</thead>
<tbody>
<tr>
<td>rem</td>
<td>字体/边距</td>
<td>font-size: 1.2rem</td>
</tr>
<tr>
<td>vw/vh</td>
<td>视口宽高</td>
<td>width: 100vw</td>
</tr>
<tr>
<td>%</td>
<td>相对父元素</td>
<td>width: 50%</td>
</tr>
<tr>
<td>ch</td>
<td>文本宽度限制</td>
<td>max-width: 60ch</td>
</tr>
</tbody>
</table>
<pre><code class="language-scss">.container {
--gutter: clamp(1rem, 3vw, 2rem);
padding-inline: var(--gutter);
max-width: 1440px;
margin: 0 auto;
@media (width < map-get($breakpoints, tablet)) {
grid-template-columns: 1fr;
}
}
</code></pre>
<hr>
<h2 id="4️⃣-实验性特性前瞻">4️⃣ 实验性特性前瞻</h2>
<h3 id="️-css-houdini-自定义绘制">⚗️ CSS Houdini 自定义绘制</h3>
<p><img src="https://img2023.cnblogs.com/blog/2243302/202505/2243302-20250508141725794-353306612.jpg" alt="img" loading="lazy"></p>
<p>📦 应用场景:粒子背景、按钮涟漪效果、可控图案</p>
<pre><code class="language-js">// 加载模块
CSS.paintWorklet.addModule('circle-painter.js');
// 使用样式
.element {
background-image: paint(circlePainter);
--circle-color: #ff4757;
--circle-size: 8;
}
</code></pre>
<pre><code class="language-js">// circle-painter.js
registerPaint(
"circlePainter",
class {
static get inputProperties() {
return ["--circle-color", "--circle-size"];
}
paint(ctx, size, props) {
const count = parseInt(props.get("--circle-size"));
const color = props.get("--circle-color").toString();
ctx.fillStyle = color;
for (let i = 0; i < count; i++) {
ctx.beginPath();
ctx.arc(
Math.random() * size.width,
Math.random() * size.height,
4,
0,
2 * Math.PI
);
ctx.fill();
}
}
}
);
</code></pre>
<hr>
<h2 id="5️⃣-最佳实践总结">5️⃣ 最佳实践总结</h2>
<h3 id="-推荐方案">✅ 推荐方案</h3>
<ul>
<li>布局策略:Flexbox / Grid → 容器查询 → 媒体查询</li>
<li>单位选择:rem / vw → % → 固定 px(仅特殊场景)</li>
<li>视觉效果:渐进增强,提供降级处理</li>
<li>代码维护:SCSS 嵌套 + 设计变量系统 + CSS 变量</li>
</ul>
<h3 id="-避免事项">❌ 避免事项</h3>
<ul>
<li>❗ 过度使用 <code>!important</code></li>
<li>🧱 超过 3 层的选择器嵌套</li>
<li>📏 固定宽高组合使用(不利响应)</li>
<li>🌀 重复定义断点逻辑</li>
</ul><br><br>
来源:https://www.cnblogs.com/zxlh1529/p/18863229
頁:
[1]