# Day 58-59:CSS 重構實作:DOM 佈局空間管理、BEM 命名方法、圖片容器問題 **Published by:** [雞蛋糕的前端修煉屋](https://paragraph.com/@gcake/) **Published on:** 2026-02-12 **URL:** https://paragraph.com/@gcake/day-58-59 ## Content 學習背景重構時間:2026 年 2 月 重構範圍:ZERO TYPE Landing Page (index.html + style.css) 技術限制:尚未使用 Flexbox/Grid,僅使用傳統 Box Model + Position 定位 學習目標:建立可維護、可預測的版面結構與命名系統Part 1: DOM 佈局與元素空間管理為什麼需要空間管理原則?當使用傳統 Box Model 建立版面時,常見問題:圖片載入前後版面高度跳動圖片破圖或尺寸過大導致版面崩潰修改內容後其他元素位置連帶跑掉不同瀏覽器或載入速度下版面不一致核心問題:沒有明確定義「誰負責版面空間」、「誰負責填充內容」。原則 1:父層元素「切出空間」,不靠子元素推擠問題場景:依賴子元素推擠
.hero { position: relative; /* height 沒設定,由子元素決定 */ } .hero img { width: 600px; } 執行流程問題:瀏覽器遇到 .hero,不知道高度,先畫 0px遇到 ,等待圖片下載圖片下載完成 400px.hero 被撐高到 400px,整個版面重排(reflow)結果:版面跳動,使用者體驗差解決方式:父層明確定義空間
/* 父層明確定義版面高度 */ .hero { position: relative; height: 450px; /* 明確告訴瀏覽器:這區塊佔 450px */ margin-bottom: 250px; } /* 圖片容器:定義它在父層中的位置和寬度 */ .hero__img-box { position: absolute; width: 45%; top: 50%; right: 0; transform: translateY(-50%); } /* 圖片:填滿容器即可 */ .hero__img { width: 100%; height: 100%; } 改善後的執行流程:瀏覽器遇到 .hero,立刻畫出 450px 高的區塊遇到 .hero__img-box,用 absolute 定位在內部圖片下載完成,填入容器不需要 reflow,版面穩定實際案例:Header Logo 區域

ZERO TYPE

/* 父層:定義整個 logo 區域的大小和位置 */ .header__logo-zone { display: inline-block; margin: 15px 80px 30px 150px; text-align: center; } /* 圖片容器:切出 60px 寬的空間給 logo */ .header__logo { width: 60px; margin: 0 auto; } /* 圖片:填滿固定空間 */ .header__logo-img { width: 100%; height: auto; } 空間結構圖:┌─ .header__logo-zone ──────────────────┐ │ [上 padding 15px] │ │ │ │ ┌─ .header__logo (60px) ───────┐ │ │ │ 填滿這個 60px 的空間 │ │ │ └────────────────────────────────┘ │ │ │ │ ZERO TYPE (文字) │ └────────────────────────────────────────┘ 關鍵思考:logo-zone:控制整個區域的 margin 和對齊logo:切出圖片固定的 60px 空間img:只負責填滿那 60px原則 2:子元素視覺與尺寸都不超過父元素問題場景:子元素超出父層
.container { width: 300px; } .container img { /* 沒有設定 width,圖片以原始尺寸顯示 */ /* 假設原始尺寸是 800px,會超出 container */ } 問題視覺化:┌─ .container (300px) ──┐ │ │ │ ┌─ 800px ────────────────────────┐ │ │ │ │ │ └──────────────────────┘────────────────┘ └────────────────────────┘ ↑ 超出 500px 解決方式:子元素尺寸相對於父層.container { width: 300px; } .container img { width: 100%; /* 永遠不會超過 300px */ height: auto; /* 保持圖片比例 */ } 執行結果:┌─ .container (300px) ──┐ │ ┌─ (300px) ───┐ │ │ │ 圖片被縮小到 │ │ │ │ 符合容器寬度 │ │ │ └────────────────────┘ │ └────────────────────────┘ 實際案例:Hero 主視覺圖片版面需求:Hero 區塊總高度 450px左側文字佔 50% 寬度右側圖片佔 45% 寬度圖片垂直置中/* 第一層:父層定義整體空間 */ .hero { position: relative; height: 450px; margin-bottom: 250px; } /* 第二層:圖片容器定義圖片應佔的空間 */ .hero__img-box { position: absolute; width: 45%; top: 50%; right: 0; transform: translateY(-50%); } /* 第三層:圖片填滿容器 */ .hero__img { width: 100%; height: 100%; } 空間結構圖:┌─ .hero (height: 450px) ────────────────────────┐ │ │ │ ┌─ .hero__intro ──┐ ┌─ .hero__img-box ────┐│ │ │ (width: 50%) │ │ (width: 45%) ││ │ │ IDEAS? │ │ ┌─ ────────┐ ││ │ │ This is just... │ │ │ 填滿容器 │ ││ │ │ [TRY IT NOW!] │ │ │ 100% × 100% │ ││ │ └─────────────────┘ │ └─────────────────┘ ││ │ └──────────────────────┘│ └─────────────────────────────────────────────────┘ 原則 3:圖片等空元素用
包裹,避免破圖跑版核心概念:Replaced Element 的特殊性 是 replaced element(置換元素),它的特性: developer.mozilla內容由外部資源決定(圖片檔案)尺寸預設由圖片原始大小決定載入狀態會影響版面(載入前/後/失敗)其他 replaced elements: