body.concert-page { background-color: var(--deep-black, #0a0a0a); margin: 0; padding: 0; } /* 頂部 banner 主標/副標:style.css .site-header-inner(HTML 加在 .header-inner 上) */ .concert-page .concert-container { padding: 50px 0; font-family: "PingFang TC", "Microsoft JhengHei", sans-serif; } /* CSS 效果 */ /* 1. 搜尋區塊容器:負責置中 */ .search-section { width: 100%; /* 撐滿寬度 */ display: flex; /* 使用 Flexbox 佈局 */ justify-content: center; /* 水平置中 */ margin: 40px 0; /* 上下留白,讓視覺不擁擠 */ } /* 2. 搜尋輸入框本體 */ .search-input { width: 80%; /* 行動裝置下佔 80% */ max-width: 400px; /* 電腦版最大寬度 */ padding: 12px 25px; /* 內縮,讓文字不貼邊 */ border: 2px solid #ddd; /* 預設淺灰邊框 */ border-radius: 30px; /* 膠囊造型圓角 */ font-size: 1rem; outline: none; /* 重要!移除瀏覽器預設的藍色外框 */ transition: all 0.3s ease; /* 讓接下來的 focus 變化變平滑 */ background-color: #fff; color: #333; } /* 3. 練習重點::focus (當滑鼠點擊準備打字時) */ .search-input:focus { border-color: #ffcc00; /* 變成代表色:水晶黃 */ box-shadow: 0 4px 15px rgba(255, 204, 0, 0.25); /* 增加黃色柔和發光 */ width: 85%; /* 點擊時微幅變長,增加回饋感 */ transform: translateY(-2px); /* 輕微往上浮動 */ } /* 4. 練習重點::hover (滑鼠只是滑過去,還沒點擊) */ .search-input:hover { border-color: #bbb; /* 邊框顏色稍微加深 */ } .search-input { width: 200px; margin: 0 auto; padding: 8px 15px; border: 2px solid #eee; border-radius: 20px; transition: all 0.4s ease; /* 平滑過渡 */ outline: none; } /* 當滑鼠點擊輸入框時 */ .search-input:focus { width: 300px; /* 輸入框變長 */ border-color: #ffcc00; /* 變成水晶黃 */ box-shadow: 0 0 10px rgba(255, 204, 0, 0.2); /* 淡淡的發光感 */ background-color: #fff; } .concert-container { max-width: 1200px; margin: 0 auto; padding: 0 20px; } /* 第一層:演唱會卡片外殼 */ .con-1, .con-2, .con-3, .con-4, #yellownote-stage { display: flex; flex-direction: column; background-color: #fff; border-radius: 16px; padding: 50px 100px; margin-bottom: 50px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05); border: 1px solid rgba(0, 0, 0, 0.02); position: relative; /* 關鍵:拿掉 overflow: hidden,改用子元素控制裁切 */ overflow: hidden; } img { width: 50%; margin: 0 auto; align-items: center; } /* 重逢區:大卡垂直堆疊,錨點落在區塊頂端 */ #stage-now { display: flex; flex-direction: column; gap: 0; } #yellownote-stage .yellownote-tagline { margin: -1.5rem auto 1.75rem; padding: 0 1rem; text-align: center; font-size: clamp(0.9rem, 1.8vw, 1rem); font-weight: 650; color: #555; letter-spacing: 0.04em; } /* 右上角緞帶:改用獨立 div 或確保不被裁切 */ [data-tour]::after { content: attr(data-tour); position: absolute; width: 200px; text-align: center; top: 30px; right: -40px; background: #eee; color: #999; font-size: 0.8rem; padding: 10px 0; transform: rotate(45deg); z-index: 1; /* 如果擔心緞帶超出卡片太醜,可將此設為透明或微調位置 */ } .title { display: block; font-size: 1.5rem; font-weight: 900; margin: 50px; text-align: center; color: #333; } /* 暫隱:九十年代「燦爛的最初」整區;要對外顯示時刪除此規則即可 */ #stage-past { display: none !important; } /* 燦爛的最初:小節標(對齊隔壁「一張大卡+多個場次列」) */ #stage-past .stage-past-era { margin-top: 2.25rem; } #stage-past .stage-past-era:first-of-type { margin-top: 0; } #stage-past .tour-era-heading { display: block; margin: 0 0 0.5rem; padding: 0 1rem; font-size: clamp(1rem, 2vw, 1.12rem); font-weight: 800; text-align: center; color: #333; } #stage-past .tour-era-meta { opacity: 0.9; font-size: 0.92rem; margin: 0 0 0.85rem; padding: 0 1rem; text-align: center; color: #555; } /* 第二層:地點區塊 (通用選擇器) — con-X-X,不加左側直線(版面乾淨) */ [class*="con-"][class*="-"] { padding: 10px 0 30px 20px; margin: 15px 0 15px 10px; position: relative; background: linear-gradient(to right, #fffdf5, #fff); border-radius: 4px; counter-reset: track-counter; } /* 第三層:曲目 */ [class*="con-"]>div div { padding-left: 35px; font-size: 0.9rem; color: #777; margin: 5px 0; /* 關鍵:拿掉因為 class 包含 "con-" 而被誤加的左邊線 */ border-left: none !important; position: relative; } /* 針對曲目前方的圖示進行替換 */ [class*="con-"]>div div::before { /* 1. 使用 Font Awesome 的音樂符號 Unicode (f001 是音樂符號) */ content: "\f001"; /* 2. 指定字體系列與粗細 (這是顯示圖示的關鍵) */ font-family: "Font Awesome 6 Free"; font-weight: 900; /* 3. 顏色與大小微調 */ color: #ffcc00; /* 使用你的水晶黃 */ font-size: 0.8rem; /* 4. 位置修正:取代原本的 margin-left */ display: inline-block; width: 25px; /* 固定寬度讓文字對齊 */ margin-right: 5px; /* 圖示與歌名間距 */ text-align: center; /* 如果你堅持要保留原本的 30px 偏移,可以加在這裡 */ margin-left: 30px; } /* 修改:確保計數器能抓到這些 div */ [class*="con-"]>div div::after { counter-increment: track-counter; content: " #" counter(track-counter); font-size: 0.7rem; color: #ccc; margin-left: 5px; vertical-align: super; } /* 1. 針對 track-list 容器本身:關閉符號與計數 */ .track-list::before, .track-list::after { display: none !important; content: none !important; counter-increment: none !important; } /* 2. 針對 track-list 容器本身:拿掉縮排與邊框 */ .track-list { padding: 0 !important; margin: 0 !important; border: none !important; } /* 3. 確保真正的曲目 (track-item) 正常顯示 */ .track-item { display: block; white-space: nowrap; /* 強制不換行 */ overflow: hidden; /* 隱藏超出部分 */ text-overflow: ellipsis; /* 超出部分顯示 ... */ max-width: 85%; /* 留空間給右邊的序號 */ position: relative; padding-left: 35px; /* 這裡留給 🎵 圖標 */ } /* 進階:滑鼠移上去顯示完整文字 */ .track-item:hover { overflow: visible; white-space: normal; background: #fff; z-index: 10; position: relative; } /* 地點圖示 */ .location::before { /* 1. 使用 Unicode 編碼代替貼圖 */ content: "\f3c5"; /* 2. 指定字體系列 (重要!沒寫會變亂碼) */ font-family: "Font Awesome 6 Free"; /* 3. 指定字體粗細 (Solid 圖標通常需要 900) */ font-weight: 900; /* 4. 原有的樣式調整 */ margin-right: 8px; /* 這裡改用 margin-right 讓圖示在文字左邊 */ margin-left: 0; /* 清除原本可能有的 margin-left */ color: #ffcc00; /* 讓圖示顏色跟你的水晶黃對齊 */ font-size: 1.1rem; display: inline-block; margin-left: 30px; } /* --- 日期蓋章:全自動定位 --- */ /* 使用屬性選擇器,確保 con-1-1, 1-3, 2-1 都能顯示 */ .attended::before, .attended::after { position: absolute; left: -20px; /* 壓在黃線上 */ width: 45px; text-align: center; background-color: #ffcc00; color: #333; font-size: 9px; font-weight: bold; padding: 2px 4px; border-radius: 4px; box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1); z-index: 100; border: 2px solid #fff; /* 增加白邊避免被背景吃掉 */ } /* 第一個日期 */ .attended::before { content: attr(data-date1); top: 5px; transform: rotate(-12deg); } /* 第二個日期 (如果有) */ .attended::after { content: attr(data-date2); top: 28px; transform: rotate(8deg); background-color: #fceea7; } /* 如果沒有第二個日期,就隱藏框框 */ .attended:not([data-date2])::after { display: none; } /* 針對單日參加 (只有 data-date 沒有序號) 的特殊處理 */ .attended[data-date]::before { content: attr(data-date); } /* 1. 隱藏 checkbox 本身 */ .expand-trigger { display: none; } /* 2. 預設隱藏第 2 個之後的 track-item */ .track-list .track-item:nth-child(n+3) { display: none; opacity: 0; transition: opacity 0.5s ease; } /* 3. 當 Checkbox 被選中時,顯示所有曲目 */ .expand-trigger:checked+.track-list .track-item:nth-child(n+6) { display: block; opacity: 1; } /* 4. 設計「展開/收合」按鈕樣式 */ .expand-btn { display: inline-block; margin-top: 10px; margin-left: 35px; padding: 5px 15px; background-color: #f5f5f5; color: #999; font-size: 0.8rem; border-radius: 20px; cursor: pointer; transition: all 0.3s ease; } /* 5. 利用偽元素設定按鈕文字內容 */ .expand-btn::before { content: "↓ 展開完整曲目"; } .expand-trigger:checked~.expand-btn::before { content: "↑ 收合曲目"; } /* 懸停效果 */ .expand-btn:hover { background-color: #ffcc00; color: #333; } /* --- 2020 ACCESS:與其餘大卡同層級(title → img → con-X-1);::after=緞帶,CANCELED 水印用 ::before --- */ .con-4.con-access-denied[data-tour="ACCESS"] { overflow: hidden; } .con-4[data-tour="ACCESS"]::after { background: #4a4a4a; color: #fff; z-index: 5; } .con-4.con-access-denied { position: relative; --access-canceled-color: rgba(180, 0, 0, 0.32); --access-canceled-border: rgba(180, 0, 0, 0.26); /* 訊息列:同色票但不透明,勿用父層 opacity(會連子元素一起淡化) */ --access-denied-message-color: #7a1618; } /* 灰階/淡化:標題、圖、場次區地點行;con-4-1 本體不再整塊 opacity */ .con-4.con-access-denied > .title, .con-4.con-access-denied > img { filter: grayscale(95%) brightness(0.82); opacity: 0.5; } .con-4.con-access-denied > [class*="con-4-"] > .location { filter: grayscale(95%) brightness(0.82); opacity: 0.72; } .con-4.con-access-denied .track-list.access-denied-message, .con-4.con-access-denied .track-list.access-denied-message .track-item { opacity: 1 !important; filter: none !important; } .con-access-denied .location::before { color: #999 !important; } .con-access-denied .canceled::before, .con-access-denied .canceled::after { position: absolute; left: -20px; width: 45px; text-align: center; font-size: 9px; font-weight: bold; padding: 2px 4px; border-radius: 4px; box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.8); z-index: 100; border: 2px solid #fff; background-color: #999 !important; color: #fff !important; text-decoration: line-through; transform: rotate(0deg); } .con-access-denied .canceled::before { content: attr(data-date1); top: 5px; } .con-access-denied .canceled::after { content: attr(data-date2); top: 28px; } .con-access-denied .canceled:not([data-date2])::after { display: none; } .con-4.con-access-denied .denied-text, .con-4.con-access-denied .denied-text span { font-family: "Courier New", Courier, monospace; color: var(--access-denied-message-color) !important; font-size: 0.9rem; font-weight: 600; font-style: italic; padding-left: 35px; } .con-access-denied .track-item.denied-text { white-space: normal; max-width: 100%; overflow: visible; } .con-4.con-access-denied .track-item.denied-text::before { content: "\f071" !important; font-family: "Font Awesome 6 Free" !important; font-weight: 900 !important; color: var(--access-denied-message-color) !important; font-size: 0.8rem !important; font-style: normal !important; display: inline-block; width: 25px; margin-right: 5px; text-align: center; margin-left: 30px; } .con-access-denied .track-item.denied-text::after { content: none !important; display: none !important; } .con-access-denied .track-list .track-item { display: block !important; opacity: 1 !important; } .con-4.con-access-denied[data-tour="ACCESS"]::before { content: "CANCELED"; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-15deg); font-size: clamp(3rem, 15vw, 6.75rem); font-weight: 900; color: var(--access-canceled-color); background: transparent; border: 9px solid var(--access-canceled-border); padding: 15px 45px; letter-spacing: 15px; pointer-events: none; z-index: 10; white-space: nowrap; opacity: 1; } @keyframes access-canceled-breathe { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } } @keyframes concert-stamp-before { 0% { opacity: 0; transform: rotate(-12deg) scale(1.18); } 100% { opacity: 1; transform: rotate(-12deg) scale(1); } } @keyframes concert-stamp-after { 0% { opacity: 0; transform: rotate(8deg) scale(1.18); } 100% { opacity: 1; transform: rotate(8deg) scale(1); } } @media (prefers-reduced-motion: no-preference) { .con-4.con-access-denied[data-tour="ACCESS"]::before { animation: access-canceled-breathe 2.6s ease-in-out infinite; } .attended::before { animation: concert-stamp-before 0.5s ease-out backwards; } .attended::after { animation: concert-stamp-after 0.5s ease-out 0.14s backwards; } } @media (prefers-reduced-motion: reduce) { .con-4.con-access-denied[data-tour="ACCESS"]::before, .attended::before, .attended::after { animation: none; } }