<!-- /* 小強化:索引「目前分類」狀態與數量徽章 */ .sec-index .is-active{ filter:brightness(1.05); transform:translateY(-1px); box-shadow:0 8px 22px rgba(0,0,0,.08) } .sec-index a{ position:relative } .sec-index a .badge{ position:absolute; top:-8px; right:-8px; min-width:18px; height:18px; padding:0 5px; display:inline-grid; place-items:center; border-radius:999px; background:#ff6b6b; color:#fff; font-size:11px; line-height:1; border:2px solid #fff; } /* 篩選時的隱藏動畫 */ .g-row[data-space]{ transition:opacity .18s ease, transform .18s ease } .g-row.is-hide{ opacity:.0; transform:translateY(4px); pointer-events:none; height:0; margin:0; padding:0; overflow:hidden; border:0 } /* 如果你主題沒載入原本的 .sec-index 樣式,這裡補最低限度的外觀 */ #space-index{position:sticky; top:8px; z-index:5; display:flex; flex-wrap:wrap; gap:8px; padding:10px 12px; margin:0 0 20px; background:#f7f8fc; border:1px solid #eef1f6; border-radius:14px; box-shadow:0 8px 22px rgba(0,0,0,.05);} #space-index a{display:inline-grid; place-items:center; min-width:44px; height:38px; padding:0 10px; font-weight:800; letter-spacing:.2px; color:#fff; background:#0d224d; border:2px solid #d4b77d; border-radius:999px; text-decoration:none;} #space-index a:hover{filter:brightness(1.05); transform:translateY(-1px); transition:.2s ease;} --> // <![CDATA[ (function(){ // 允許在整頁任何位置執行;找到第一個 .gallery-960 容器 const gallery = document.querySelector('.gallery-960'); const indexBar = document.getElementById('space-index'); if(!gallery || !indexBar) return; const rows = Array.from(gallery.querySelectorAll('.g-row')); if(!rows.length) return; // 1) 從每段 .g-chip 讀出空間分類:取「|」後半(去空白) const getSpace = (row) => { const chip = row.querySelector('.g-chip'); if(!chip) return '未分類'; const raw = chip.textContent || ''; const parts = raw.split('|'); let space = (parts.length>1 ? parts.pop() : raw).trim().replace(/\s+/g,''); return space || '未分類'; }; // 蒐集分類與計數 const spaces = new Map(); // name -> {count, rows[]} rows.forEach(row=>{ const sp = getSpace(row); row.dataset.space = sp; if(!spaces.has(sp)) spaces.set(sp, {count:0, rows:[]}); spaces.get(sp).count++; spaces.get(sp).rows.push(row); }); // 2) 排序:先照我們偏好的住宅空間順序,其餘再按中文字母排序 const prefer = ['玄關','客廳','餐廳','廚房','客餐廳','書房','主臥','小孩房','孝親房','公共衛浴','主臥衛浴','現場實景','未分類']; const exist = [...spaces.keys()]; const ordered = [ ...prefer.filter(n=>exist.includes(n)), ...exist.filter(n=>!prefer.includes(n)).sort((a,b)=>a.localeCompare(b,'zh-Hant')) ]; // 3) 建索引按鈕 indexBar.innerHTML = ''; // 先清空 const makeBtn = (label, count, isAll=false)=>{ const a = document.createElement('a'); a.href = '#'; a.dataset.filter = isAll ? '__ALL__' : label; a.textContent = label; if(!isAll && typeof count==='number'){ const b = document.createElement('span'); b.className = 'badge'; b.textContent = count; a.appendChild(b); } return a; }; indexBar.appendChild(makeBtn('全部', null, true)); ordered.forEach(name=>{ const {count} = spaces.get(name); indexBar.appendChild(makeBtn(name, count)); }); // 4) 篩選邏輯 const setActive = (el)=>{ indexBar.querySelectorAll('a').forEach(x=>x.classList.remove('is-active')); el.classList.add('is-active'); }; const filterRows = (space)=>{ const all = space==='__ALL__'; rows.forEach(row=>{ const show = all || row.dataset.space===space; row.classList.toggle('is-hide', !show); }); }; // 初始狀態:先設為「全部」 const btnAll = indexBar.querySelector('a[data-filter="__ALL__"]'); if(btnAll){ setActive(btnAll); filterRows('__ALL__'); } // 5) 點擊事件(含 URL 與記憶) indexBar.addEventListener('click', (e)=>{ const a = e.target.closest('a[data-filter]'); if(!a) return; e.preventDefault(); const sp = a.dataset.filter; setActive(a); filterRows(sp); // 更新 URL hash(不重整) const isAll = sp==='__ALL__'; const nextHash = isAll ? '' : '#space='+encodeURIComponent(sp); try{ history.replaceState(null,'', nextHash || ' '); }catch(_){} // 記住選擇 if(isAll) localStorage.removeItem('spaceFilter'); else localStorage.setItem('spaceFilter', sp); // 平滑捲動至第一個可見段落 const firstVisible = gallery.querySelector('.g-row:not(.is-hide)'); if(firstVisible){ firstVisible.scrollIntoView({behavior:'smooth', block:'start'}); } }, {capture:true}); // 6) 啟動讀取:URL hash > localStorage > 全部 const hashMatch = (location.hash.match(/space=([^&]+)/)||[])[1]; const startup = hashMatch ? decodeURIComponent(hashMatch) : localStorage.getItem('spaceFilter'); if(startup && indexBar.querySelector(`a[data-filter="${startup}"]`)){ const a = indexBar.querySelector(`a[data-filter="${startup}"]`); setActive(a); filterRows(startup); } })(); // ]]> <!-- :root{ --indigo:#0d224d; --pine:#0f5b4f; --champ:#d4b77d; --ink:#222; --muted:#6b7280; --card:#fff; --line:#eef1f6; } .gallery-960{max-width:960px;margin:32px auto;padding:0 16px; font-family:'華康細圓體','Microsoft JhengHei',sans-serif; counter-reset:sec;} /* 交錯行(純 Flex,避免主題禁用 grid) */ .g-row{position:relative; display:flex !important; align-items:center; gap:32px; margin:54px 0; counter-increment:sec;} .g-row.even{flex-direction:row-reverse !important;} /* 章節圓編號 */ .g-row::before{ content:counter(sec, decimal-leading-zero); position:absolute; left:-24px; top:-24px; width:52px; height:52px; display:grid; place-items:center; background:var(--indigo); color:#fff; font-weight:700; letter-spacing:.5px; border:2px solid var(--champ); border-radius:999px; box-shadow:0 10px 28px rgba(13,34,77,.18); } .g-row.even::before{left:auto; right:-24px;} /* 媒體與文字 */ .g-media, .g-text{flex:1 1 0;} .g-media a{display:block; text-decoration:none;} .g-media img{width:100%; height:auto; display:block; border-radius:20px; box-shadow:0 18px 48px rgba(0,0,0,.12); transition:transform .35s ease, box-shadow .35s ease; aspect-ratio:4/3; object-fit:cover;} .g-media img:hover{transform:translateY(-4px); box-shadow:0 24px 64px rgba(0,0,0,.16);} .g-text{position:relative; background:var(--card); border:1px solid var(--line); border-radius:18px; padding:28px 24px 22px; box-shadow:0 10px 28px rgba(0,0,0,.06);} .g-chip{position:absolute; top:-14px; left:24px; display:inline-grid; place-items:center; padding:6px 12px; font-size:13px; font-weight:700; letter-spacing:.6px; color:#fff; background:var(--pine); border:2px solid var(--champ); border-radius:999px; box-shadow:0 8px 20px rgba(15,91,79,.18);} .g-row.even .g-chip{left:auto; right:24px;} .g-text h3{margin:6px 0 8px; font-size:22px; color:var(--indigo); letter-spacing:.4px;} .g-text p{margin:0; font-size:16px; line-height:1.9; color:var(--ink);} .g-sub{display:block; margin-top:8px; font-size:13px; color:var(--muted);} /* RWD:手機直排 */ @media (max-width:920px){ .g-row, .g-row.even{flex-direction:column !important;} .g-row::before{left:8px; right:auto; top:-20px;} .g-chip{left:18px; right:auto;} } /* 索引列(可選) */ .sec-index{position:sticky; top:8px; z-index:5; display:flex; flex-wrap:wrap; gap:8px; padding:10px 12px; margin:0 0 20px; background:#f7f8fc; border:1px solid var(--line); border-radius:14px; box-shadow:0 8px 22px rgba(0,0,0,.05);} .sec-index a{display:inline-grid; place-items:center; min-width:44px; height:38px; padding:0 10px; font-weight:800; letter-spacing:.2px; color:#fff; background:var(--indigo); border:2px solid var(--champ); border-radius:999px; text-decoration:none;} .sec-index a:hover{filter:brightness(1.05); transform:translateY(-1px); transition:.2s ease;} --> 竹北大學漾|玄關 迎賓玄關・光影落塵 半透屏風柔化直視,進門就被柔光包覆,鞋包與雨具各就定位。 落塵地坪:80*80拋光 櫃體:V313 系統板+緩衝五金/照明:3000K 線性 竹北大學漾|客廳 客廳大景・一家人的視線中心 沙發面向落地窗,白天納景、夜裡談心,留白牆讓畫作與笑聲成主角。 地坪:80*80拋光/窗飾:布簾 70% 遮光/燈具:可調角崁燈 竹北大學漾|書房 書房工作帶・安靜專注角 書桌沿窗細長配置,手邊即光,閱讀與辦公都能沉浸。 檯面:HPL 耐刮/插座:桌上彈起式/座椅:腰靠可調 竹北大學漾|書房 懸浮書桌・無腳更自由 隱藏懸吊結構讓地面潔淨通透,視覺輕盈、掃地機也通行無阻。 支撐:鋼構埋件/檯面厚度:28–36mm/理線:下掀理線槽 竹北大學漾|書房 書牆軸線・從門口就看見秩序 書櫃與地板紋理同向,視線自然被引導到閱讀核心。 書櫃:開放×門片=1:1/層板:耐重 25kg/燈帶:400lm/m 竹北大學漾|書房 書房立面・規律窗景的安定感 均衡開窗搭配柔色牆面,白天不刺眼、夜裡不壓迫。 牆面:抗污乳膠漆 5~10GU/窗簾:木百葉 50mm/把手:黑鈦 竹北大學漾|書房 家的階梯・一家人停留的小平台 半層高差做出坐談階,孩子玩耍、父母歇腳,笑聲更靠近。 止滑:R10 踢踏面/間接光:樓梯下緣 3000K/收納:梯下抽屜 竹北大學漾|書房 轉角陽光・綠意作為緩衝 轉折處植栽退讓,視線不被硬角切斷,回家路徑更柔和。 綠化:耐陰觀葉/腳燈:感應式 10–15lx/扶手:木圓角 R6 竹北大學漾|書房 長窗步道・水平拉長的日常 窗景與走道並行,走路就像翻閱一張長幅家庭相簿。 窗簾:雙層紗+遮光/踢腳:留縫陰影線 6mm/壁燈:對稱配置 竹北大學漾|書房 轉角收邊・不起眼的安心細節 轉角以弧與黑鈦收邊淡化銳利感,家裡更安全更耐看。 收邊:abs 10mm/轉角:R8–R10/牆漆:耐擦試驗≧2000 次 竹北大學漾|孝親房 孝親房・一夜好眠的中性光 柔色床頭與規律開窗,讓長輩起居更直覺、翻身不刺眼。 床頭:半高軟包 900mm/窗飾:蜂巢簾遮光/插座:床邊雙 USB 竹北大學漾|孝親房 孝親房採光・材質要耐看也好顧 仿石紋牆面抗污不矯飾,擦拭一次就亮潔。 牆材:抗污塗料/地材:SPC 防水/門檻:無高差 竹北大學漾|孝親房 孝親房景框・窗外一抹綠 床位避開直吹風切,躺著就能看到綠意舒心。 氣流:出風口避床位/窗紗:細目防蚊/窗台:耐磨貼皮 竹北大學漾|孝親房 孝親房日照・柔光不刺眼 百葉微斜 15°,拉上也透氣,午睡更安穩。 百葉:木作 50mm/色溫:2700–3000K/夜燈:1W 足矣 竹北大學漾|玄關 玄關量體・錯落層次像小展檯 進門置物、坐凳穿鞋、掛傘各分區,回家流程一步到位。 置頂櫃:減震器/坐凳:耐磨布/鏡:防爆膜 竹北大學漾|玄關 雨天也優雅・連續遮蔽回家路 外部遮雨連到門廊,濕鞋也有落腳處,不把水帶進家。 落塵網:椰纖/地坪:止滑係數≧R10/排水:線性地溝 竹北大學漾|玄關 玄關框景・一眼看到家的表情 牆面留白掛上全家照,一進門就被回憶擁抱。 相牆:照片 20×30cm 規格化/軌道燈:15° 洗牆 竹北大學漾|玄關 玄關步距・行走不打架 走道淨寬至少 100cm,兩人會車不側身,生活更從容。 淨寬:≥1000mm/壁角:防撞條/感應燈:延遲 30s 竹北大學漾|客廳 客廳留白・活動區要留給家人 沙發前 2000×1600mm 活動空間,孩子能滾、瑜伽能展。 地毯:短絨易清潔/插座:地盒預留/投影:100–120" 竹北大學漾|客餐廳 餐廚銜接・一條線就能上菜 中島到餐桌無斷點,熱湯上桌不繞路。 檯面:人造石一體成形/插座:升降式/燈:3000K 均照 竹北大學漾|主臥 主臥窗景・綠意是最好的遮噪 床位對準最安靜的景框,每天醒來都是舒壓畫面。 床頭:雙向開關/遮光:85%/床邊桌:抽屜×2 竹北大學漾|廚房 廚房轉角・動線與安全的折返 轉角不上高柜,讓視角與進出更輕鬆。 把手:內嵌斜切/轉角:圓弧護角/止滑:R10 地磚 竹北大學漾|廚房 餐邊平台・每天用的放最近 開放層板放咖啡器具,忙碌早晨也能優雅出門。 插座:餐邊 2 組/層板:耐重 15kg/防濺:耐熱美耐板 竹北大學漾|玄關 玄關轉折・收放之間見氣質 封閉與開放 2:1,視覺清爽不凌亂。 比例:封閉2/開放1/把手:黑鈦細扁/門片:霧面耐刮 竹北大學漾|玄關 玄關採光・早晨的第一束光 鏤空屏風導入側光,鞋櫃也不暗藏味道。 霧玻:透光 70%/通風孔:後背板打孔/除溼:隱藏插座 竹北大學漾|玄關 玄關尺度・家人並行不擁擠 端景+坐凳+衣帽三位一體,出門流程順暢。 坐凳:450H/衣鉤:圓鈍安全型/鏡:全身鏡 600mm 竹北大學漾|現場實景 家的實景・綠意陪伴的午後 光線在木地板上游移,貓睡、孩子畫畫,時間慢下來。 地坪:耐磨 AC4/清潔:掃地機通行高 100mm 竹北大學漾|客餐廳 餐廳步行・端盤不碰撞 餐椅退縮仍保有走道,端菜更安心。 餐桌:760H/椅距:≥900mm/燈具:桌面照度 300lx 竹北大學漾|客餐廳 餐廚導引・線條把秩序拉直 檯面與踢腳同向,視覺更俐落、清潔一布帶過。 踢腳:暗藏走線/門板:霧面 PET/把手:隱形 竹北大學漾|現場實景 家的章法・水平線條統一語言 吊櫃與牆面線型對齊,安定又耐看。 對位:門縫 2mm/燈帶:凹槽埋入/色卡:NCS 中性色 竹北大學漾|現場實景 中庭平台・把戶外納入餐後散步 飯後到平台走一圈,家不只在室內。 室外地坪:防滑/門檻:氣密條/紗門:自動回彈 竹北大學漾|客餐廳 餐邊轉折・細節延續到最後一公分 窗帶與櫃體轉角同步收邊,視覺不停頓。 轉角:45° 斜切/封邊:同材質/把手:避手背 竹北大學漾|現場實景 抬頭就是家・天花線條的純淨 暗藏設備,留下乾淨的天花節奏。 天花:防火板/維修孔:隱藏型/燈:UGR<19 竹北大學漾|餐廳 餐廳綠意・讓用餐更慢一點 視線終點有植物,餐桌對談更放鬆。 綠植:易養龜背芋/光:3000K/牆:耐擦 5GU 竹北大學漾|餐廳 餐廳層疊・牆面與櫃體的和聲 牆面色塊+木質溫度,日常宛如輕餐酒館。 牆漆:低彩度 L*65–75/櫃體:木紋貼皮/五金:緩衝鉸鍊 竹北大學漾|餐廳 轉角餐邊・邊走邊聊的社交點 轉角剛好放下小吧台,備餐、倒酒、一氣呵成。 吧檯:900H/高腳椅:650H/插座:吧台下 1 組 竹北大學漾|餐廳 低角度客餐・家的比例剛剛好 低視角看桌椅線條更溫柔,家也更有份量。 餐桌:原木封蠟/椅布:防潑水/腳墊:靜音 竹北大學漾|客廳 客廳留白・電視牆不做滿 文化石主牆+矮櫃藏線,畫面清爽、維修好拆。 文化石:白灰/理線:踢腳入線/端口:影音同層 竹北大學漾| 公共衛浴 公共衛浴・來客也好用 乾濕分離、地面止滑,朋友小孩也能安心使用。 地磚:R10/玻璃:8mm 掛門/五金:不鏽鋼 304 竹北大學漾|公共衛浴 公衛照度・不過亮的舒服 均勻泛光不刺眼,鏡前補光讓五官更自然。 照度:一般 200lx/鏡前 500lx/色溫:3000–3500K 竹北大學漾|主臥衛浴 主衛綠帶・濕氣與視線都被柔化 淋浴在綠意邊上,空氣更暢快。 抽風:靜音型/玻璃:除霧膜/置物:轉角層板 竹北大學漾|主臥衛浴 主衛比例・門片與開口的黃金線 鏡櫃與洗手台齊平,收納不外露、視覺不凌亂。 鏡櫃:上翻緩衝/台盆:下嵌/矽利康:同色 竹北大學漾|小孩房 小孩房・對景長大的一扇窗 書桌面對光與綠,寫功課也有好心情。 書桌:600D/護眼:Ra>90/收納:抽屜緩衝 竹北大學漾|小孩房 小孩房衣櫃・自理力從好拿好放開始 矮層開門+高層行李,衣物分區一看就懂。 吊衣桿:可調 2 段/把手:圓角/門片:緩衝 竹北大學漾|主臥 主臥書桌・流線導角更安全 夜間小檯燈與圓角桌緣,起身不怕碰撞。 檯燈:3000K/導角:R10/理線:穿線孔+夾具 竹北大學漾|主臥 主臥梳妝・清晨好氣色 側打光避免正面眩光,保留收納與儀式感。 光:CRI>90/鏡寬:600–800mm/抽屜:分隔盤 竹北大學漾|主臥 主臥收納牆・比例與線條的美 柜體不頂天留呼吸線,房內更顯輕盈。 上緣:留 80–120mm/踢腳:80H/門縫:等距 2mm 竹北大學漾|餐廳 餐桌木溫・一家人最常相聚的地方 原木桌面包覆每日三餐與聊天時光,越用越好看。 桌面:橡木實木/塗裝:耐熱耐污 PU/餐墊:易清潔 竹北大學漾|書房 書房遠景・以一張長畫收束一天 黃昏時光影落在書頁上,心也慢慢安靜。 窗簾:雙層紗+遮光/地燈:腳邊引導/音樂:小功率藍牙 相簿 <!-- :root{ --indigo:#0d224d; --indigo-dark:#001a3d; --champ:#d4b77d; } .album-fab{ position:fixed; right:16px; bottom:calc(16px + env(safe-area-inset-bottom)); z-index:9999; display:inline-flex; align-items:center; gap:8px; min-width:66px; height:56px; padding:0 16px; border-radius:999px; color:#fff; font-weight:900; letter-spacing:.3px; text-decoration:none; background: linear-gradient(180deg, rgba(255,255,255,.18), rgba(255,255,255,0) 42%), linear-gradient(180deg, var(--indigo), var(--indigo-dark)); box-shadow: 0 14px 38px rgba(13,34,77,.35); backdrop-filter: saturate(110%); transition: transform .18s ease, box-shadow .18s ease, opacity .18s ease; border:2px solid rgba(212,183,125,.45); opacity:.98; -webkit-tap-highlight-color:transparent; animation: fab-pop .28s ease-out both; } .album-fab:hover{ transform:translateY(-2px); box-shadow:0 18px 48px rgba(13,34,77,.42) } .album-fab:active{ transform:translateY(0) scale(.98) } .album-fab svg{ flex:0 0 auto } @keyframes fab-pop{ from{ transform: translateY(8px) scale(.96); opacity:0 } to { transform: translateY(0) scale(1); opacity:1 } } @media (min-width:1024px){ .album-fab{ display:none } } @media (prefers-reduced-motion:reduce){ .album-fab{ transition:none; animation:none } } --> 相簿 <!-- :root{ --indigo:#0d224d; --indigo-dark:#001a3d; --champ:#d4b77d; } .album-fab{ position:fixed; right:16px; bottom:calc(16px + env(safe-area-inset-bottom)); /* iOS 安全區 */ z-index:9999; display:inline-flex; align-items:center; gap:8px; min-width:66px; height:56px; padding:0 16px; border-radius:999px; color:#fff; font-weight:900; letter-spacing:.3px; text-decoration:none; background: linear-gradient(180deg, rgba(255,255,255,.18), rgba(255,255,255,0) 42%), linear-gradient(180deg, var(--indigo), var(--indigo-dark)); box-shadow: 0 14px 38px rgba(13,34,77,.35); backdrop-filter: saturate(110%); transition: transform .18s ease, box-shadow .18s ease, opacity .18s ease; border:2px solid rgba(212,183,125,.45); /* 香檳金薄描邊 */ opacity:.98; -webkit-tap-highlight-color: transparent; animation: fab-pop .28s ease-out both; } .album-fab:hover{ transform:translateY(-2px); box-shadow:0 18px 48px rgba(13,34,77,.42) } .album-fab:active{ transform:translateY(0) scale(.98) } .album-fab svg{ flex:0 0 auto } @keyframes fab-pop{ from{ transform: translateY(8px) scale(.96); opacity:0 } to { transform: translateY(0) scale(1); opacity:1 } } /* 僅手機顯示 */ @media (min-width:1024px){ .album-fab{ display:none } } /* 偏好減少動效的使用者 */ @media (prefers-reduced-motion:reduce){ .album-fab{ transition:none; animation:none } } -->