Html 防劇透 效果

Posted by Adam on August 24, 2022
這個範例結合了 CSS 的模糊濾鏡(Blur Filter)以及 JavaScript 的點擊互動,完美模擬了類似 Threads 的「防劇透」效果。 你可以將下方的程式碼儲存為 `.html` 檔案後直接開啟: ```html <!DOCTYPE html> <html lang="zh-TW"> <head> <meta charset="UTF-8"> <title>JS 防劇透效果示範</title> <style> body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; display: flex; flex-direction: column; align-items: center; padding-top: 50px; background-color: #f0f2f5; } .post-card { background: white; padding: 20px; border-radius: 12px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); max-width: 400px; width: 90%; } h3 { margin-top: 0; color: #1c1e21; } /* 防劇透容器 */ .spoiler-container { position: relative; cursor: pointer; overflow: hidden; border-radius: 8px; background: #eee; margin: 15px 0; } /* 文字內容:預設模糊 */ .spoiler-content { padding: 15px; line-height: 1.6; filter: blur(12px); /* 核心:模糊濾鏡 */ transition: filter 0.5s ease; /* 平滑淡出效果 */ user-select: none; /* 防止使用者透過反白選取偷看 */ } /* 中央提示遮罩 */ .spoiler-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.05); transition: opacity 0.3s ease; z-index: 10; } .spoiler-btn { background: rgba(0, 0, 0, 0.7); color: white; padding: 8px 16px; border-radius: 20px; font-size: 14px; backdrop-filter: blur(4px); } /* 點擊後的狀態變化 */ .spoiler-container.revealed .spoiler-content { filter: blur(0); user-select: text; } .spoiler-container.revealed .spoiler-overlay { opacity: 0; pointer-events: none; /* 讓點擊穿透,不再阻擋下方文字 */ } </style> </head> <body> <div class="post-card"> <h3>🎬 電影討論區</h3> <p>大家覺得昨晚的結局怎麼樣?我覺得這段超級精彩:</p> <div class="spoiler-container" onclick="revealSpoiler(this)"> <div class="spoiler-overlay"> <div class="spoiler-btn">點擊顯示劇透內容</div> </div> <div class="spoiler-content"> 其實主角在最後一幕並沒有死,他只是進入了另一個平行時空! 而且驚喜彩蛋顯示,他手上的戒指竟然是 2026 年才發行的紀念版... </div> </div> <p style="color: #65676b; font-size: 13px;">點擊上方區塊以解除模糊</p> </div> <script> function revealSpoiler(element) { // 為容器加上 revealed 類別,觸發 CSS transition element.classList.add('revealed'); } </script> <style> /* 隱藏核取方塊 */ .spoiler-check { display: none; } /* 預設模糊內容 */ .spoiler-content { filter: blur(10px); cursor: pointer; transition: 0.3s; } /* 當核取方塊被勾選時,後面的內容取消模糊 */ .spoiler-check:checked + .spoiler-content { filter: blur(0); } </style> <label> <input type="checkbox" class="spoiler-check"> <div class="spoiler-content"> 這是純 CSS 做的防劇透,點一下就看清楚了! </div> </label> <label> <input type="checkbox" class="spoiler-check"> <div class="spoiler-content"> 這是純 CSS 做的防劇透,點一下就看清楚了! </div> </label> </body> </html> ``` ### 💡 程式碼亮點說明: 1. **`filter: blur(12px)`**: 這是視覺效果的靈魂。它能讓文字保持大致的輪廓感,但完全無法辨識具體內容,非常有 Threads 的風格。 2. **`transition`**: 當點擊後,濾鏡從 `12px` 變成 `0`,會有一個 0.5 秒的「視覺恢復」動畫,看起來比直接切換更高級。 3. **`user-select: none`**: 這是一個容易被忽略的關鍵點!如果不加這行,使用者可以用滑鼠反白選取模糊的文字,複製到記事本就能偷看。 4. **`pointer-events: none`**: 揭曉內容後,我們讓黑色的提示按鈕「不再接收點擊事件」,這樣使用者才能正常選取或點擊裡面的內容。 如果您需要「點擊後再模糊回去」的開關功能,只需將 `classList.add` 改成 `classList.toggle` 即可!