Files
sechskies/variety/vedio-list.html
T

552 lines
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>水晶男孩|追劇清單</title>
<link rel="stylesheet" href="../assets/css/style.css">
<link rel="stylesheet" href="../assets/css/index.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
<link rel="stylesheet" href="../assets/css/tablet.css">
<style>
/* ── 追劇清單頁面專用樣式 ── */
.vedio-list-page .vedio-intro {
text-align: left;
}
.vedio-list-page .vedio-intro p {
color: var(--color-text-muted);
font-size: 1rem;
line-height: 1.8;
margin: 0 0 0.85rem;
text-align: left;
}
.vedio-list-page .vedio-intro p:last-child {
margin-bottom: 0;
}
.vedio-list-page .list-lead {
color: var(--color-text-muted);
font-size: 1rem;
margin: 0 0 1.25rem;
text-align: left;
}
/* 類型篩選 */
.vedio-list-page .type-tabs {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 10px;
margin: 0 0 1.75rem;
}
.vedio-list-page .type-tab {
appearance: none;
border: 2px solid rgba(255, 204, 0, 0.22);
background: var(--color-surface-soft);
color: var(--color-text-dark);
font-weight: 700;
font-size: 0.92rem;
padding: 0.45rem 1.1rem;
border-radius: 999px;
cursor: pointer;
transition: border-color 0.18s ease, background 0.18s ease, color 0.18s ease;
white-space: nowrap;
}
.vedio-list-page .type-tab:hover {
border-color: var(--color-brand);
}
.vedio-list-page .type-tab.is-active {
border-color: var(--color-brand);
background: #fffce8;
color: var(--color-brand-dark);
}
/* 卡片格線 */
.vedio-list-page .drama-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 16px;
margin: 0 0 2rem;
}
.vedio-list-page .drama-card {
display: flex;
flex-direction: column;
align-items: stretch;
text-align: left;
padding: 1.15rem 1.2rem 1.25rem;
background: var(--color-surface-soft);
border: 2px solid rgba(255, 204, 0, 0.18);
border-radius: 12px;
cursor: pointer;
transition: border-color 0.18s ease, background 0.18s ease, transform 0.18s ease;
box-sizing: border-box;
min-height: 100%;
}
.vedio-list-page .drama-card:hover,
.vedio-list-page .drama-card.is-active {
border-color: var(--color-brand);
background: #fffce8;
}
.vedio-list-page .drama-card__poster {
display: flex;
align-items: center;
justify-content: center;
aspect-ratio: 16 / 9;
margin: 0 0 0.95rem;
border-radius: 8px;
background:
linear-gradient(145deg, rgba(255, 204, 0, 0.22), rgba(0, 0, 0, 0.08)),
var(--color-surface-soft);
color: var(--color-brand-dark);
font-weight: 800;
font-size: 0.95rem;
letter-spacing: 0.04em;
text-align: center;
padding: 0.75rem;
box-sizing: border-box;
}
.vedio-list-page .drama-card__meta {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin: 0 0 0.55rem;
}
.vedio-list-page .drama-tag {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.18rem 0.55rem;
border-radius: 999px;
font-size: 0.72rem;
font-weight: 700;
letter-spacing: 0.03em;
white-space: nowrap;
background: rgba(255, 204, 0, 0.18);
color: var(--color-brand-dark);
}
.vedio-list-page .drama-tag--platform {
background: rgba(0, 0, 0, 0.06);
color: var(--color-text-muted);
}
.vedio-list-page .drama-card__title {
margin: 0 0 0.45rem;
font-size: 1.15rem;
font-weight: 800;
color: var(--color-text-dark);
line-height: 1.35;
text-align: center;
}
.vedio-list-page .drama-card__progress,
.vedio-list-page .drama-card__note {
margin: 0 0 0.35rem;
color: var(--color-text-muted);
font-size: 0.9rem;
line-height: 1.65;
text-align: left;
}
.vedio-list-page .drama-card__note {
font-size: 0.84rem;
margin-bottom: 0.85rem;
}
.vedio-list-page .drama-card__actions {
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: center;
margin-top: auto;
padding-top: 0.35rem;
}
.vedio-list-page .drama-card__actions a,
.vedio-list-page .drama-card__actions button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: 38px;
padding: 0.35rem 0.9rem;
border-radius: 999px;
font-size: 0.86rem;
font-weight: 700;
text-decoration: none;
white-space: nowrap;
cursor: pointer;
border: 2px solid rgba(255, 204, 0, 0.35);
background: #fff;
color: var(--color-brand-dark);
transition: background 0.18s ease, border-color 0.18s ease;
}
.vedio-list-page .drama-card__actions a:hover,
.vedio-list-page .drama-card__actions button:hover {
border-color: var(--color-brand);
background: #fffce8;
}
.vedio-list-page .drama-card__actions a.is-primary {
background: var(--color-brand);
border-color: var(--color-brand);
color: #1a1a1a;
}
/* 詳情區 */
.vedio-list-page .detail-panel {
display: none;
padding: 1.35rem 1.4rem 1.5rem;
border-radius: 12px;
background: var(--color-surface-soft);
border: 1px solid rgba(255, 204, 0, 0.25);
margin-bottom: 1.5rem;
}
.vedio-list-page .detail-panel.is-open {
display: block;
}
.vedio-list-page .detail-panel__eyebrow {
display: block;
text-align: center;
font-size: 0.78rem;
font-weight: 700;
letter-spacing: 0.08em;
color: var(--color-text-muted);
margin: 0 0 0.45rem;
white-space: nowrap;
}
.vedio-list-page .detail-panel__title {
margin: 0 0 0.75rem;
text-align: center;
font-size: 1.35rem;
font-weight: 800;
color: var(--color-brand-dark);
line-height: 1.35;
}
.vedio-list-page .detail-panel p {
margin: 0 0 0.75rem;
color: var(--color-text-muted);
font-size: 0.98rem;
line-height: 1.8;
text-align: left;
}
.vedio-list-page .detail-panel__progress-box {
margin: 1rem 0;
padding: 0.9rem 1rem;
border-radius: 10px;
background: #fffce8;
border: 1px solid rgba(255, 204, 0, 0.35);
}
.vedio-list-page .detail-panel__progress-box p {
margin: 0 0 0.35rem;
}
.vedio-list-page .detail-panel__progress-box p:last-child {
margin-bottom: 0;
}
.vedio-list-page .detail-panel__actions {
display: flex;
flex-wrap: wrap;
gap: 10px;
justify-content: center;
margin-top: 1.1rem;
}
.vedio-list-page .detail-panel__actions a,
.vedio-list-page .detail-panel__actions button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: 40px;
padding: 0.4rem 1.05rem;
border-radius: 999px;
font-size: 0.9rem;
font-weight: 700;
text-decoration: none;
white-space: nowrap;
cursor: pointer;
border: 2px solid rgba(255, 204, 0, 0.35);
background: #fff;
color: var(--color-brand-dark);
}
.vedio-list-page .detail-panel__actions a.is-primary {
background: var(--color-brand);
border-color: var(--color-brand);
color: #1a1a1a;
}
.vedio-list-page .empty-hint {
display: none;
text-align: center;
color: var(--color-text-muted);
padding: 1.5rem 1rem;
margin: 0 0 1.5rem;
}
.vedio-list-page .empty-hint.is-visible {
display: block;
}
@media (max-width: 640px) {
.vedio-list-page .drama-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body class="vedio-list-page">
<header class="inner-page-header">
<div class="header-inner site-header-inner">
<h1 class="main-title">深夜清單</h1>
<div class="subtitle-wrap">
<span class="sub-title">DRAMA &amp; VARIETY WATCH LIST</span>
</div>
</div>
</header>
<nav class="portal-nav" aria-label="水晶男孩推廣部導覽" data-portal-nav></nav>
<canvas id="particles"></canvas>
<div class="container">
<section class="vedio-intro">
<h2 class="section-title">正在追的那些夜晚</h2>
<p>
有些夜晚適合考古黃色奇蹟,有些夜晚則是——螢幕一亮,人就栽進另一個世界。
綜藝裡的失控笑聲、戲劇裡的心跳停拍,都值得被好好記下來:看到哪一季、哪一集、哪一句台詞剛把你釘在沙發上。
</p>
<p>
這裡先收兩部最近在追的:一部是把人丟進肯亞還能笑到缺氧的<span class="mark_y">韓綜</span>
一部是把 1997 年的青春寫得又甜又疼的<span class="mark_b">韓劇</span>
點進去,進度與入口都在;先別急著一次追完,慢慢養也很好看。
</p>
<p>
此頁為線上靜態預覽。完整資料庫與後台 CRUD(乙級第三題骨架)請本機 XAMPP 匯入
<code>variety/vedio-list/dramas.sql</code> 後,開啟
<a href="vedio-list/"><code>variety/vedio-list/</code></a>
</p>
</section>
<section class="list-section" aria-labelledby="vedio-list-heading">
<h2 class="section-title" id="vedio-list-heading">追劇清單</h2>
<p class="list-lead">先用類型找——綜藝還是戲劇,跟 OTT 首頁那排分類一樣直覺。</p>
<div class="type-tabs" role="tablist" aria-label="作品類型">
<button type="button" class="type-tab is-active" role="tab" aria-selected="true"
data-type="all">全部</button>
<button type="button" class="type-tab" role="tab" aria-selected="false"
data-type="variety">綜藝</button>
<button type="button" class="type-tab" role="tab" aria-selected="false"
data-type="drama">戲劇</button>
</div>
<div class="drama-grid" id="dramaGrid">
<article class="drama-card" data-type="variety" data-id="kenya" tabindex="0"
aria-label="三傻遊肯亞,綜藝">
<div class="drama-card__poster" aria-hidden="true">NETFLIX · 綜藝</div>
<div class="drama-card__meta">
<span class="drama-tag">綜藝</span>
<span class="drama-tag drama-tag--platform">Netflix</span>
</div>
<h3 class="drama-card__title">三傻遊肯亞</h3>
<p class="drama-card__progress">觀看進度:第 1 季・第 2 集・看到 28:40</p>
<p class="drama-card__note">三人剛被扔進野外,表情比獅子還慌。</p>
<div class="drama-card__actions">
<a class="is-primary" href="https://www.netflix.com/title/82031207"
target="_blank" rel="noopener noreferrer"
onclick="event.stopPropagation()">繼續觀看</a>
<button type="button" data-open-detail="kenya">查看詳情</button>
</div>
</article>
<article class="drama-card" data-type="drama" data-id="reply1997" tabindex="0"
aria-label="請回答1997,戲劇">
<div class="drama-card__poster" aria-hidden="true">DISNEY+ · 戲劇</div>
<div class="drama-card__meta">
<span class="drama-tag">戲劇</span>
<span class="drama-tag drama-tag--platform">Disney+</span>
</div>
<h3 class="drama-card__title">請回答1997</h3>
<p class="drama-card__progress">觀看進度:第 1 季・第 5 集・看到 41:12</p>
<p class="drama-card__note">宿舍夜談剛結束,收音機還在響,心卻已經開始亂。</p>
<div class="drama-card__actions">
<a class="is-primary" href="https://www.disneyplus.com/en-tw/browse/entity-3979fb82-8681-44e8-b7be-e313091f0d73"
target="_blank" rel="noopener noreferrer"
onclick="event.stopPropagation()">繼續觀看</a>
<button type="button" data-open-detail="reply1997">查看詳情</button>
</div>
</article>
</div>
<p class="empty-hint" id="emptyHint" role="status">這個類型目前還沒有作品——換「全部」看看?</p>
<div class="detail-panel" id="detailPanel" aria-live="polite">
<span class="detail-panel__eyebrow" id="detailEyebrow">單部作品</span>
<h3 class="detail-panel__title" id="detailTitle"></h3>
<p id="detailIntro"></p>
<div class="detail-panel__progress-box">
<p id="detailProgress"></p>
<p id="detailNote"></p>
</div>
<p id="detailExtra"></p>
<div class="detail-panel__actions">
<a class="is-primary" id="detailWatch" href="#" target="_blank" rel="noopener noreferrer">繼續觀看</a>
<button type="button" id="detailClose">先收起來</button>
</div>
</div>
</section>
</div>
<footer>
<p>SECHSKIES Fanpage &copy; 2026 - 黃色氣球永遠飄揚</p>
<a href="https://jekkinoopy.github.io/Portfolio/" class="studio-link" target="_blank" rel="noopener noreferrer">
Design by <span class="mark_b">Jekkinoopy Studio</span>
</a>
</footer>
<script>
(function () {
const dramas = {
kenya: {
typeLabel: '綜藝|Netflix',
title: '三傻遊肯亞',
intro: '三個人、一座肯亞,以及無數個「這也能出事?」的現場。笑點來得又急又野,像把旅行節目的安全感整袋拆掉,只留下腎上腺素與默契。',
progress: '第 1 季|第 2 集|28:40',
note: '三人剛被扔進野外,表情比獅子還慌。',
extra: '狀態:追劇中 · 開始看的那天:最近才入坑,進度還很乖。',
watchUrl: 'https://www.netflix.com/title/82031207'
},
reply1997: {
typeLabel: '戲劇|Disney+',
title: '請回答1997',
intro: '把 1997 寫進宿舍、收音機與那一聲來不及說出口的喜歡。甜的時候甜到發亮,疼的時候又老實得讓人不敢快轉——那種青春,看完會想立刻打電話給誰。',
progress: '第 1 季|第 5 集|41:12',
note: '宿舍夜談剛結束,收音機還在響,心卻已經開始亂。',
extra: '狀態:追劇中 · 提醒自己:下一集容易哭,衛生紙先備好。',
watchUrl: 'https://www.disneyplus.com/en-tw/browse/entity-3979fb82-8681-44e8-b7be-e313091f0d73'
}
};
const tabs = document.querySelectorAll('.type-tab');
const cards = document.querySelectorAll('.drama-card');
const emptyHint = document.getElementById('emptyHint');
const detailPanel = document.getElementById('detailPanel');
const detailEyebrow = document.getElementById('detailEyebrow');
const detailTitle = document.getElementById('detailTitle');
const detailIntro = document.getElementById('detailIntro');
const detailProgress = document.getElementById('detailProgress');
const detailNote = document.getElementById('detailNote');
const detailExtra = document.getElementById('detailExtra');
const detailWatch = document.getElementById('detailWatch');
const detailClose = document.getElementById('detailClose');
function setFilter(type) {
tabs.forEach(function (tab) {
const active = tab.getAttribute('data-type') === type;
tab.classList.toggle('is-active', active);
tab.setAttribute('aria-selected', active ? 'true' : 'false');
});
let visible = 0;
cards.forEach(function (card) {
const show = type === 'all' || card.getAttribute('data-type') === type;
card.hidden = !show;
if (show) visible += 1;
});
emptyHint.classList.toggle('is-visible', visible === 0);
const activeCard = document.querySelector('.drama-card.is-active');
if (activeCard && activeCard.hidden) {
closeDetail();
}
}
function openDetail(id) {
const data = dramas[id];
if (!data) return;
cards.forEach(function (card) {
card.classList.toggle('is-active', card.getAttribute('data-id') === id);
});
detailEyebrow.textContent = data.typeLabel;
detailTitle.textContent = data.title;
detailIntro.textContent = data.intro;
detailProgress.textContent = '觀看進度:' + data.progress;
detailNote.textContent = data.note;
detailExtra.textContent = data.extra;
detailWatch.href = data.watchUrl;
detailPanel.classList.add('is-open');
detailPanel.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
function closeDetail() {
detailPanel.classList.remove('is-open');
cards.forEach(function (card) {
card.classList.remove('is-active');
});
}
tabs.forEach(function (tab) {
tab.addEventListener('click', function () {
setFilter(tab.getAttribute('data-type'));
});
});
cards.forEach(function (card) {
card.addEventListener('click', function (event) {
if (event.target.closest('a, button')) return;
openDetail(card.getAttribute('data-id'));
});
card.addEventListener('keydown', function (event) {
if (event.key === 'Enter' || event.key === ' ') {
event.preventDefault();
openDetail(card.getAttribute('data-id'));
}
});
});
document.querySelectorAll('[data-open-detail]').forEach(function (btn) {
btn.addEventListener('click', function (event) {
event.stopPropagation();
openDetail(btn.getAttribute('data-open-detail'));
});
});
detailClose.addEventListener('click', closeDetail);
})();
</script>
<script src="../assets/js/particles.js"></script>
<script src="../assets/js/portal-nav.js"></script>
</body>
</html>