This commit is contained in:
2026-09-29 15:47:36 +08:00
18 changed files with 1024 additions and 702 deletions
+3 -3
View File
@@ -19,7 +19,7 @@ func TestNavigationPageUsesDedicatedVerificationAndAnalytics(t *testing.T) {
t.Fatalf("navigation SEO output does not contain %q", want)
}
}
for _, unwanted := range []string{"112387687", "G-TZQS2NZ3TN", "6bb06ed5659790d0"} {
for _, unwanted := range []string{"112967594", "G-B5KGM8S5J1", "6bb06ed5659790d0"} {
if strings.Contains(navHTML, unwanted) {
t.Fatalf("navigation SEO output unexpectedly contains main-site id %q", unwanted)
}
@@ -31,8 +31,8 @@ func TestMainSiteKeepsMainVerificationAndAnalytics(t *testing.T) {
for _, want := range []string{
"r7geXn5kBugzOSLZzyw4v3NBDMQwAmzFCVkqp92odh0",
"6bb06ed5659790d0",
"112387687",
"G-TZQS2NZ3TN",
"112967594",
"G-B5KGM8S5J1",
} {
if !strings.Contains(mainHTML, want) {
t.Fatalf("main-site SEO output does not contain %q", want)
+5 -577
View File
@@ -8,11 +8,6 @@
.detail-h5-bg,
.detail-h5-top,
.detail-h5-bar,
.detail-meta-h5,
.detail-intro-title,
.detail-episodes-status,
.detail-episode-ranges,
.detail-episode--preview,
.detail-related-title-h5,
.detail-related-refresh {
display: none;
@@ -50,169 +45,6 @@
line-height: 20px;
}
.detail-hero {
align-self: stretch;
width: 100%;
padding: 24px 48px 24px 24px;
background: rgba(255, 255, 255, 0.05);
overflow: hidden;
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.10);
justify-content: flex-start;
align-items: center;
gap: 24px;
display: flex;
box-sizing: border-box;
}
.detail-cover {
width: 300px;
height: 400px;
border-radius: 18px;
object-fit: cover;
flex-shrink: 0;
}
.detail-hero-main {
flex: 1 1 0;
min-width: 0;
min-height: 400px;
overflow: hidden;
flex-direction: column;
justify-content: center;
align-items: flex-start;
gap: 30px;
display: flex;
}
.detail-hero-info {
width: 100%;
overflow: hidden;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 30px;
display: flex;
}
.detail-tags {
align-self: stretch;
height: auto;
min-height: 26px;
overflow: visible;
justify-content: flex-start;
align-items: flex-start;
gap: 9px;
display: flex;
flex-wrap: wrap;
}
.detail-tag {
height: 26px;
max-width: 100%;
padding: 0 11px;
background: rgba(255, 255, 255, 0.10);
overflow: hidden;
border-radius: 13px;
justify-content: center;
align-items: center;
display: inline-flex;
color: #8A8A8A;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
box-sizing: border-box;
flex-shrink: 0;
white-space: nowrap;
text-overflow: ellipsis;
text-decoration: none;
}
.detail-tag--primary {
background: #ec237f;
color: #fff;
}
.detail-title {
margin: 0;
color: white;
font-size: 34px;
font-family: PingFang SC;
font-weight: 400;
line-height: 40px;
word-wrap: break-word;
}
.detail-meta {
color: #8A8A8A;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
word-wrap: break-word;
}
.detail-meta-pc {
display: flex;
align-items: center;
gap: 18px;
}
.detail-intro-block {
width: 100%;
}
.detail-intro {
margin: 0;
width: 100%;
color: #8A8A8A;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
word-wrap: break-word;
display: -webkit-box;
-webkit-line-clamp: 6;
-webkit-box-orient: vertical;
overflow: hidden;
}
.detail-intro-prefix-pc {
display: inline;
}
.detail-actions {
width: 100%;
height: 45px;
overflow: hidden;
justify-content: space-between;
align-items: center;
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.detail-play-btn {
height: 45px;
padding: 0 12px;
background: #ec237f;
overflow: hidden;
border-radius: 23px;
justify-content: center;
align-items: center;
display: flex;
border: none;
cursor: pointer;
color: #181818;
font-size: 16px;
font-family: PingFang SC;
font-weight: 400;
line-height: 22px;
text-decoration: none;
box-sizing: border-box;
}
.detail-action-group {
justify-content: flex-start;
align-items: center;
@@ -274,78 +106,6 @@
background: rgba(255, 255, 255, 0.05);
}
.detail-episodes {
align-self: stretch;
width: 100%;
overflow: hidden;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 16px;
display: flex;
}
.detail-episodes-head {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
.detail-section-label {
color: #F5F5F5;
font-size: 18px;
font-family: PingFang SC;
font-weight: 600;
line-height: 27px;
}
.detail-episode-list {
width: 100%;
justify-content: flex-start;
align-items: flex-start;
gap: 14px;
display: flex;
flex-wrap: wrap;
}
.detail-episode-lock {
position: absolute;
top: 0;
right: 0;
padding: 0 4px;
border-radius: 0 7px 0 7px;
background: #ec237f;
color: #fff;
font-size: 9px;
font-family: PingFang SC;
font-weight: 500;
line-height: 14px;
pointer-events: none;
}
.detail-episode {
flex: 0 0 calc((100% - 98px) / 8);
width: calc((100% - 98px) / 8);
height: 54px;
position: relative;
background: rgba(255, 255, 255, 0.10);
overflow: hidden;
border-radius: 7px;
justify-content: center;
align-items: center;
display: flex;
border: none;
cursor: pointer;
color: #808080;
font-size: 12px;
font-family: PingFang SC;
font-weight: 400;
line-height: 18px;
text-decoration: none;
box-sizing: border-box;
}
.detail-comments {
align-self: stretch;
width: 100%;
@@ -750,220 +510,19 @@
box-sizing: border-box;
}
.detail-meta-pc,
.detail-actions,
.detail-comments,
.detail-related-desc,
.detail-related-title-pc,
.detail-episode-pc,
.detail-episodes-status-icon,
.detail-breadcrumb {
.detail-related-desc,
.detail-related-title-pc,
.detail-breadcrumb {
display: none !important;
}
.detail-meta-h5,
.detail-intro-title,
.detail-episodes-status,
.detail-episode-ranges,
.detail-episode--preview,
.detail-related-title-h5,
.detail-related-refresh,
.detail-h5-bar {
.detail-related-refresh,
.detail-h5-bar {
display: flex;
}
.detail-hero {
width: 100%;
padding: 0;
background: transparent;
border-radius: 0;
border: none;
display: grid;
grid-template-columns: 76px 1fr;
gap: 18px 12px;
align-items: start;
}
.detail-hero-main {
display: contents;
}
.detail-cover {
width: 76px;
height: 106px;
border-radius: 6px;
grid-column: 1;
grid-row: 1;
background: #D4D4D4;
}
.detail-hero-info {
grid-column: 2;
grid-row: 1;
width: auto;
gap: 12px;
min-width: 0;
}
.detail-title {
order: 1;
width: 100%;
max-width: 220px;
font-size: 16px;
font-weight: 500;
line-height: 22px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.detail-meta {
order: 2;
}
.detail-meta-h5 {
align-items: flex-start;
gap: 6px;
color: white;
font-size: 12px;
line-height: 18px;
}
.detail-meta-dot {
flex-shrink: 0;
}
.detail-tags {
order: 3;
height: auto;
gap: 6px;
flex-wrap: wrap;
}
.detail-tag {
height: auto;
padding: 2px 6px;
background: rgba(255, 255, 255, 0.10);
border-radius: 3px;
color: white;
}
.detail-tag--primary {
background: rgba(255, 255, 255, 0.10);
color: white;
}
.detail-intro-block {
grid-column: 1 / -1;
max-width: none;
display: flex;
flex-direction: column;
gap: 12px;
}
.detail-intro-title {
color: white;
font-size: 16px;
font-weight: 500;
line-height: 22px;
}
.detail-intro {
color: white;
-webkit-line-clamp: 3;
}
.detail-intro-prefix-pc {
display: none;
}
.detail-episodes {
width: 100%;
gap: 12px;
}
.detail-episodes-head {
width: 100%;
}
.detail-section-label {
color: white;
font-size: 14px;
font-weight: 400;
line-height: 20px;
}
.detail-episodes-status {
align-items: center;
gap: 2px;
color: rgba(255, 255, 255, 0.35);
font-size: 12px;
line-height: 18px;
}
.detail-episode-ranges {
width: 100%;
align-items: center;
gap: 24px;
}
.detail-episode-range {
background: none;
border: none;
padding: 0;
cursor: pointer;
color: rgba(255, 255, 255, 0.55);
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
line-height: 20px;
}
.detail-episode-range--active {
color: white;
}
.detail-episode-list {
width: 100%;
display: flex;
flex-wrap: nowrap;
justify-content: flex-start;
align-items: center;
gap: 6px;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
}
.detail-episode-list::-webkit-scrollbar {
display: none;
}
.detail-episode.is-range-hidden {
display: none !important;
}
.detail-episode {
flex: 0 0 58px;
width: 58px;
min-width: 58px;
height: 58px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.10);
color: white;
font-size: 18px;
font-weight: 400;
line-height: 24px;
}
.detail-episode::before {
content: attr(data-ep);
width: 24px;
text-align: center;
}
.detail-related {
width: 100%;
gap: 12px;
@@ -1265,90 +824,6 @@
flex-shrink: 0;
}
.detail-hero {
min-height: 0;
padding: calc(24px * var(--detail-s)) calc(48px * var(--detail-s)) calc(24px * var(--detail-s)) calc(24px * var(--detail-s));
background: rgba(255, 255, 255, 0.05);
border: 0;
outline: 1px solid rgba(255, 255, 255, 0.10);
outline-offset: -1px;
border-radius: calc(16px * var(--detail-s));
gap: calc(24px * var(--detail-s));
}
.detail-cover {
width: calc(300px * var(--detail-s));
height: calc(400px * var(--detail-s));
border-radius: calc(18px * var(--detail-s));
}
.detail-hero-main {
min-height: calc(400px * var(--detail-s));
gap: calc(30px * var(--detail-s));
}
.detail-hero-info { gap: calc(30px * var(--detail-s)); }
.detail-tags {
gap: calc(9px * var(--detail-s));
height: calc(26px * var(--detail-s));
overflow: hidden;
}
.detail-tag {
height: calc(26px * var(--detail-s));
padding: 0 calc(11px * var(--detail-s));
border-radius: calc(6px * var(--detail-s));
background: rgba(255, 255, 255, 0.10);
color: rgba(255, 255, 255, 0.55);
font-size: calc(12px * var(--detail-s));
line-height: calc(18px * var(--detail-s));
}
.detail-tag--primary { background: #ec237f; color: #fff; }
.detail-title {
font-size: calc(24px * var(--detail-s));
font-weight: 600;
line-height: calc(32px * var(--detail-s));
}
.detail-meta {
color: rgba(255, 255, 255, 0.55);
font-size: calc(16px * var(--detail-s));
line-height: calc(22px * var(--detail-s));
}
.detail-meta-pc { gap: calc(18px * var(--detail-s)); }
.detail-intro {
color: rgba(255, 255, 255, 0.55);
font-size: calc(14px * var(--detail-s));
line-height: calc(20px * var(--detail-s));
}
.detail-actions {
height: calc(45px * var(--detail-s));
justify-content: space-between;
}
.detail-play-btn {
height: calc(45px * var(--detail-s));
padding: 0 calc(12px * var(--detail-s));
gap: calc(4px * var(--detail-s));
border-radius: calc(23px * var(--detail-s));
background: #ec237f;
color: #fff;
font-size: calc(16px * var(--detail-s));
line-height: calc(22px * var(--detail-s));
}
.detail-play-btn img {
width: calc(16px * var(--detail-s));
height: calc(17px * var(--detail-s));
filter: brightness(0) invert(1);
}
.detail-action-group { gap: calc(16px * var(--detail-s)); }
.detail-action {
@@ -1379,52 +854,6 @@
background: rgba(255, 255, 255, 0.05);
}
.detail-episodes { gap: calc(14px * var(--detail-s)); }
.detail-section-label {
font-size: calc(24px * var(--detail-s));
font-weight: 500;
line-height: calc(32px * var(--detail-s));
}
.detail-episode-pc {
display: none !important;
}
.detail-episode-list {
display: grid;
grid-template-columns: repeat(auto-fill, calc(58px * var(--detail-s)));
justify-content: space-between;
align-items: center;
gap: calc(12px * var(--detail-s)) calc(7px * var(--detail-s));
overflow: hidden;
}
.detail-episode {
flex: none;
width: calc(58px * var(--detail-s));
min-width: calc(58px * var(--detail-s));
height: calc(58px * var(--detail-s));
border-radius: calc(10px * var(--detail-s));
background: rgba(255, 255, 255, 0.10);
color: #fff;
font-size: calc(18px * var(--detail-s));
font-weight: 400;
line-height: calc(24px * var(--detail-s));
}
.detail-episode.is-active,
.detail-episode.detail-episode--active {
background: rgba(255, 74, 74, 0.08);
color: #ec237f;
}
.detail-episode::before {
content: attr(data-ep);
width: calc(24px * var(--detail-s));
text-align: center;
}
.content-official-info {
padding: calc(24px * var(--detail-s)) calc(30px * var(--detail-s));
border-radius: calc(18px * var(--detail-s));
@@ -1579,7 +1008,6 @@
.detail-main,
.detail-sidebar { display: contents; }
.detail-episodes,
.detail-related {
padding-top: 18px;
border-top: 1px solid rgba(255, 255, 255, .1);
+557
View File
@@ -0,0 +1,557 @@
/* 详情页:信息卡(海报 + 剧集信息)与选集卡,结构参考 huangguoai.com 详情页,配色沿用品牌粉。 */
.dh-card {
width: 100%;
padding: 32px;
background: #1A1A1A;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 20px;
box-sizing: border-box;
font-family: PingFang SC, sans-serif;
}
/* ---------- 信息卡 ---------- */
.dh-hero {
display: flex;
align-items: flex-start;
gap: 28px;
}
.dh-poster {
position: relative;
flex: 0 0 210px;
aspect-ratio: 3 / 4;
display: block;
overflow: hidden;
border-radius: 12px;
background: #111;
}
.dh-poster-img {
width: 100%;
height: 100%;
display: block;
object-fit: cover;
transition: transform 0.3s ease;
}
.dh-poster:hover .dh-poster-img {
transform: scale(1.04);
}
.dh-poster-badge {
position: absolute;
top: 8px;
left: 8px;
padding: 2px 8px;
background: #EC237F;
border-radius: 6px;
color: #FFFFFF;
font-size: 12px;
font-weight: 600;
line-height: 18px;
}
.dh-poster-eps {
position: absolute;
right: 8px;
bottom: 8px;
padding: 2px 8px;
background: rgba(0, 0, 0, 0.65);
border-radius: 6px;
color: #FFFFFF;
font-size: 12px;
font-weight: 600;
line-height: 18px;
}
.dh-poster-play {
position: absolute;
top: 50%;
left: 50%;
width: 56px;
height: 56px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(236, 35, 127, 0.88);
border-radius: 50%;
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);
transform: translate(-50%, -50%);
transition: transform 0.2s ease, background 0.2s ease;
}
.dh-poster-play img {
width: 22px;
height: 22px;
margin-left: 3px;
}
/* player.svg 本身是黑色填充,粉底上统一显示为白色 */
.dh-poster-play img,
.dh-btn--primary img {
filter: brightness(0) invert(1);
}
.dh-poster:hover .dh-poster-play {
background: #EC237F;
transform: translate(-50%, -50%) scale(1.08);
}
.dh-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.dh-brand {
display: flex;
align-items: center;
gap: 8px;
color: #FFFFFF;
font-size: 14px;
line-height: 20px;
}
.dh-brand-avatar {
width: 28px;
height: 28px;
border-radius: 50%;
}
.dh-title {
margin: 0;
color: #FFFFFF;
font-size: 32px;
font-weight: 600;
line-height: 42px;
}
.dh-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
line-height: 20px;
}
.dh-meta span + span::before {
content: "·";
margin: 0 8px;
color: rgba(255, 255, 255, 0.35);
}
.dh-intro-title {
margin: 6px 0 0;
color: #FFFFFF;
font-size: 16px;
font-weight: 600;
line-height: 24px;
}
.dh-intro {
margin: 0;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
color: rgba(255, 255, 255, 0.72);
font-size: 14px;
line-height: 22px;
}
.dh-intro.is-expanded {
display: block;
-webkit-line-clamp: unset;
}
.dh-intro-toggle {
margin-top: -6px;
padding: 0;
background: none;
border: 0;
color: #EC237F;
font-size: 13px;
line-height: 20px;
cursor: pointer;
}
.dh-tags,
.dh-themes {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.dh-tag {
padding: 4px 12px;
background: rgba(255, 255, 255, 0.08);
border-radius: 999px;
color: rgba(255, 255, 255, 0.85);
font-size: 12px;
line-height: 18px;
text-decoration: none;
transition: background 0.18s ease, color 0.18s ease;
}
a.dh-tag:hover {
background: rgba(236, 35, 127, 0.16);
color: #EC237F;
}
.dh-themes-label {
color: rgba(255, 255, 255, 0.5);
font-size: 13px;
line-height: 20px;
}
.dh-theme {
padding: 3px 12px;
border: 1px solid rgba(236, 35, 127, 0.6);
border-radius: 999px;
color: #EC237F;
font-size: 13px;
line-height: 18px;
text-decoration: none;
}
a.dh-theme:hover {
background: rgba(236, 35, 127, 0.12);
}
.dh-actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 6px;
}
.dh-btn {
height: 48px;
padding: 0 24px;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 999px;
box-sizing: border-box;
color: #FFFFFF;
font-family: inherit;
font-size: 16px;
font-weight: 600;
line-height: 22px;
text-decoration: none;
white-space: nowrap;
cursor: pointer;
transition: border-color 0.18s ease, background 0.18s ease, filter 0.18s ease;
}
.dh-btn img {
width: 18px;
height: 18px;
}
.dh-btn:hover {
border-color: rgba(255, 255, 255, 0.45);
background: rgba(255, 255, 255, 0.04);
}
.dh-btn--primary {
padding: 0 32px;
background: #EC237F;
border-color: #EC237F;
}
.dh-btn--primary:hover {
background: #EC237F;
border-color: #EC237F;
filter: brightness(1.08);
}
/* ---------- 选集卡 ---------- */
.dh-episodes-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
}
.dh-episodes-title {
margin: 0;
color: #FFFFFF;
font-size: 20px;
font-weight: 600;
line-height: 28px;
}
.dh-episodes-sub {
margin-top: 4px;
color: rgba(255, 255, 255, 0.5);
font-size: 13px;
line-height: 20px;
}
.dh-episodes-hint {
flex-shrink: 0;
color: #EC237F;
font-size: 13px;
line-height: 28px;
}
.dh-ranges {
display: flex;
gap: 8px;
margin-top: 16px;
overflow-x: auto;
scrollbar-width: none;
}
.dh-ranges::-webkit-scrollbar {
display: none;
}
.dh-range {
flex: 0 0 auto;
height: 32px;
padding: 0 14px;
background: rgba(255, 255, 255, 0.06);
border: 0;
border-radius: 8px;
color: rgba(255, 255, 255, 0.7);
font-family: inherit;
font-size: 13px;
cursor: pointer;
}
.dh-range.is-active {
background: rgba(236, 35, 127, 0.16);
color: #EC237F;
}
.dh-ep-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(88px, 1fr));
gap: 12px 10px;
margin-top: 16px;
}
.dh-ep {
position: relative;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, 0.06);
border-radius: 10px;
color: #FFFFFF;
font-size: 15px;
font-weight: 500;
text-decoration: none;
transition: background 0.18s ease, color 0.18s ease;
}
.dh-ep:hover {
background: rgba(236, 35, 127, 0.18);
color: #EC237F;
}
.dh-ep.is-range-hidden {
display: none;
}
.dh-ep-lock {
position: absolute;
top: -6px;
right: -4px;
padding: 0 5px;
background: #EC237F;
border-radius: 6px 6px 6px 0;
color: #FFFFFF;
font-size: 10px;
font-weight: 600;
line-height: 15px;
}
/* ---------- 官方地址卡(详情页内,含手机端) ---------- */
body.is-detail-page .content-official-info {
display: grid !important;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 14px 24px;
padding: 24px 32px;
background: #1A1A1A;
outline: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 20px;
color: rgba(255, 255, 255, 0.55);
font-size: 13px;
line-height: 20px;
}
body.is-detail-page .content-official-info::before {
content: "官方地址 · 请收藏,防止迷路";
grid-column: 1 / -1;
color: #FFFFFF;
font-size: 16px;
font-weight: 600;
line-height: 24px;
}
body.is-detail-page .content-official-info a {
color: #EC237F;
font-size: 14px;
word-break: break-all;
}
/* ---------- 平板:信息卡缩小海报 ---------- */
@media (min-width: 768px) and (max-width: 1023px) {
.dh-card {
padding: 24px;
}
.dh-poster {
flex-basis: 170px;
}
.dh-title {
font-size: 26px;
line-height: 36px;
}
}
/* ---------- 手机 ---------- */
@media (max-width: 767px) {
.dh-card {
padding: 16px;
background: rgba(26, 26, 26, 0.82);
border-radius: 16px;
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
}
.dh-hero {
flex-direction: column;
gap: 16px;
}
.dh-poster {
flex: none;
width: 48%;
max-width: 190px;
}
.dh-poster-play {
width: 46px;
height: 46px;
}
.dh-poster-play img {
width: 18px;
height: 18px;
}
.dh-info {
width: 100%;
gap: 10px;
}
.dh-brand {
font-size: 13px;
}
.dh-brand-avatar {
width: 24px;
height: 24px;
}
.dh-title {
font-size: 22px;
line-height: 30px;
}
.dh-meta {
font-size: 12px;
line-height: 18px;
}
.dh-meta span + span::before {
margin: 0 6px;
}
.dh-intro-title {
font-size: 15px;
line-height: 22px;
}
.dh-intro {
font-size: 13px;
line-height: 20px;
}
.dh-actions {
width: 100%;
gap: 10px;
}
.dh-actions {
flex-wrap: nowrap;
}
.dh-btn {
height: 42px;
padding: 0 14px;
gap: 6px;
font-size: 15px;
}
.dh-btn img {
width: 16px;
height: 16px;
}
.dh-btn--primary {
flex: 1;
padding: 0 16px;
}
.dh-episodes-title {
font-size: 17px;
line-height: 24px;
}
.dh-episodes-sub,
.dh-episodes-hint {
font-size: 12px;
}
.dh-episodes-hint {
line-height: 24px;
}
.dh-ep-grid {
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 10px 8px;
}
.dh-ep {
height: 42px;
font-size: 14px;
}
body.is-detail-page .content-official-info {
grid-template-columns: 1fr;
gap: 12px;
padding: 16px;
border-radius: 16px;
}
body.is-detail-page .content-official-info::before {
font-size: 15px;
line-height: 22px;
}
}
-1
View File
@@ -100,7 +100,6 @@
line-height: 20px;
}
body[class].is-detail-page .download-fab,
body[class].is-play-page .download-fab {
display: none !important;
}
+212 -25
View File
@@ -29,18 +29,10 @@ a.footer-social-home-item {
gap: min(12px, 0.625vw);
}
body.home-page .footer-main {
gap: min(32px, 1.666667vw);
}
body.home-page .footer-product {
gap: min(18px, 0.9375vw);
}
body.home-page .footer-brand {
gap: min(18px, 0.9375vw);
}
body.home-page .footer-logo {
width: min(178px, 9.270833vw);
height: min(49px, 2.552083vw);
@@ -52,28 +44,12 @@ a.footer-social-home-item {
line-height: clamp(20px, 1.25vw, 24px);
}
body.home-page .footer-contact {
gap: min(4px, 0.208333vw);
}
body.home-page .footer-contact-line,
body.home-page .footer-links {
font-size: clamp(12px, 0.833333vw, 16px);
font-size: clamp(13px, 0.833333vw, 16px);
line-height: clamp(18px, 1.145833vw, 22px);
}
body.home-page .footer-links {
gap: min(15px, 0.78125vw);
}
body.home-page .footer-links a + a {
padding-left: min(16px, 0.833333vw);
}
body.home-page .footer-links a + a::before {
height: min(18px, 0.9375vw);
}
body.home-page .footer-bottom {
min-height: min(38px, 1.979167vw);
gap: min(24px, 1.25vw);
@@ -968,3 +944,214 @@ body.site-shell.list-page-body {
display: none;
}
}
/* ===== 页脚改版:品牌 / 访问地址 / 帮助与支持 三栏 ===== */
.footer-col-title {
color: #FFFFFF;
font-size: 15px;
font-weight: 500;
line-height: 22px;
}
.footer-contact-label {
flex: 0 0 auto;
min-width: 6.5em;
color: rgba(255, 255, 255, 0.45);
}
.footer-contact-url {
min-width: 0;
color: #EC237F;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
a.footer-contact-line:hover .footer-contact-url,
a.footer-contact-line:focus-visible .footer-contact-url {
text-decoration: underline;
}
@media (min-width: 768px) {
.footer-main {
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
align-items: start;
column-gap: 48px;
row-gap: 28px;
}
.footer-brand {
grid-column: 1 / -1;
grid-row: 1;
flex-direction: column;
align-items: flex-start;
gap: 14px;
max-width: 640px;
}
.footer-logo {
height: 44px;
}
.footer-brand .footer-muted-text {
color: rgba(255, 255, 255, 0.55);
font-size: 14px;
line-height: 22px;
}
.footer-contact {
grid-column: 1;
grid-row: 2;
display: flex;
flex-direction: column;
gap: 10px;
min-width: 0;
max-width: 100%;
}
.footer-contact-line {
flex-direction: row;
align-items: baseline;
gap: 12px;
max-width: 100%;
font-size: 14px;
line-height: 20px;
}
.footer-nav-col {
grid-column: 2;
grid-row: 2;
display: flex;
flex-direction: column;
gap: 10px;
}
.footer-links {
display: grid;
grid-template-columns: repeat(2, max-content);
column-gap: 40px;
row-gap: 10px;
justify-self: start;
color: rgba(255, 255, 255, 0.75);
font-size: 14px;
line-height: 20px;
}
.footer-links a + a {
padding-left: 0;
}
.footer-links a + a::before {
display: none;
}
.footer-divider {
margin-top: 10px;
}
}
@media (min-width: 1024px) {
.footer-main {
grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) auto;
column-gap: 64px;
}
.footer-brand {
grid-column: 1;
grid-row: 1;
max-width: 560px;
}
.footer-contact {
grid-column: 2;
grid-row: 1;
}
.footer-nav-col {
grid-column: 3;
grid-row: 1;
}
}
@media (max-width: 767px) {
.footer-col-title {
display: none;
}
.footer-nav-col {
width: 100%;
}
/* 链接换行时行首不再挂分隔线:改成 3 列网格 */
.footer-links {
display: grid;
grid-template-columns: repeat(3, 1fr);
row-gap: 10px;
text-align: center;
}
.footer-links a + a {
padding-left: 0;
}
.footer-links a + a::before {
display: none;
}
.site-shell .home-mobile-footer-links {
display: grid;
grid-template-columns: repeat(3, 1fr);
row-gap: 10px;
column-gap: 8px;
text-align: center;
}
.site-shell .home-mobile-footer-links a {
padding-left: 0;
}
.site-shell .home-mobile-footer-links a::before {
display: none;
}
}
/* 页脚进入视口时,悬浮按钮随之上移,不压住页脚(--footer-lift 由 footer.js 维护) */
.download-fab,
.floating-action {
translate: 0 calc(var(--footer-lift, 0px) * -1);
}
/* 手机页脚卡片底部:访问地址 */
@media (max-width: 767px) {
.site-shell .home-mobile-footer-addrs {
width: 100%;
padding-top: 14px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
flex-direction: column;
gap: 8px;
box-sizing: border-box;
}
.site-shell .home-mobile-footer-addr {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
color: rgba(255, 255, 255, 0.55);
font: 400 12px/18px "PingFang SC", sans-serif;
text-decoration: none;
}
.site-shell .home-mobile-footer-addr span:first-child {
flex: 0 0 auto;
}
.site-shell .home-mobile-footer-addr-url {
min-width: 0;
color: #EC237F;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
+30
View File
@@ -1569,3 +1569,33 @@ nav[aria-label="面包屑"] a:hover,
nav[aria-label="面包屑"] a:focus-visible {
color: #EC237F !important;
}
/* 手机页头:下载 App / 商务 TG 图标,样式同搜索按钮 */
.header-mobile-icon-link {
display: none;
}
@media (max-width: 767px) {
.header-mobile-icon-link {
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
flex: 0 0 24px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.05);
}
.header-mobile-icon-link img {
width: 16px;
height: 16px;
display: block;
filter: brightness(0) invert(1);
}
.header-mobile-icon-link .header-mobile-icon-img--lg {
width: 18px;
height: 18px;
}
}
+43
View File
@@ -422,6 +422,15 @@
line-height: 23px;
}
body.home-page .card-grid .poster-card-tags {
height: 29px;
}
body.home-page .poster-card-episode {
font-size: 16px;
line-height: 23px;
}
body.home-page .poster-card-tag,
body.home-page .ranking-card-tag {
padding: 2px 9px;
@@ -911,6 +920,21 @@
line-height: 20px;
}
/* 集数占了标签行右侧:放不下的标签整颗换行并被隐藏,而不是每颗都截成省略号 */
.home-page .card-grid .poster-card-tags {
flex-wrap: wrap;
height: 26px;
}
.home-page .poster-card-episode {
flex-shrink: 0;
margin-left: 8px;
color: rgba(255, 255, 255, 0.55);
font-size: 14px;
line-height: 20px;
white-space: nowrap;
}
.home-page .poster-card-tag,
.home-page .ranking-card-tag {
width: max-content;
@@ -1287,6 +1311,15 @@
line-height: 18px;
}
.home-page .card-grid .poster-card-tags {
height: 24px;
}
.home-page .poster-card-episode {
font-size: 12px;
line-height: 18px;
}
.home-page .episode-badge,
.home-page .ranking-episode-badge {
right: 8px;
@@ -3451,3 +3484,13 @@ body.site-shell .theme-index-card:focus-visible > img {
animation: none;
}
}
/* 跑马灯里的官方地址链接 */
.home-page .home-announcement-link {
color: #EC237F;
text-decoration: none;
}
.home-page .home-announcement-link:hover {
text-decoration: underline;
}
+3
View File
@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 3H16C18.7614 3 21 5.23858 21 8V16C21 18.7614 18.7614 21 16 21H8C5.23858 21 3 18.7614 3 16V8C3 5.23858 5.23858 3 8 3ZM11 6.5H13V11.5H15.75L12 15.25L8.25 11.5H11V6.5ZM8 16.75C8 16.3358 8.33579 16 8.75 16H15.25C15.6642 16 16 16.3358 16 16.75C16 17.1642 15.6642 17.5 15.25 17.5H8.75C8.33579 17.5 8 17.1642 8 16.75Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 482 B

+24 -5
View File
@@ -1,9 +1,9 @@
(function () {
var section = document.querySelector(".detail-episodes");
var section = document.querySelector("[data-dh-episodes]");
if (!section) return;
var ranges = section.querySelectorAll(".detail-episode-range");
var episodes = section.querySelectorAll(".detail-episode-list .detail-episode");
var ranges = section.querySelectorAll(".dh-range");
var episodes = section.querySelectorAll(".dh-ep");
if (!episodes.length) return;
if (!ranges.length) return;
@@ -17,7 +17,7 @@
function activate(btn) {
ranges.forEach(function (item) {
item.classList.toggle("detail-episode-range--active", item === btn);
item.classList.toggle("is-active", item === btn);
});
applyRange(Number(btn.dataset.rangeStart), Number(btn.dataset.rangeEnd));
}
@@ -28,10 +28,29 @@
});
});
var active = section.querySelector(".detail-episode-range--active") || ranges[0];
var active = section.querySelector(".dh-range.is-active") || ranges[0];
activate(active);
})();
// 简介超出行数时显示「展开 / 收起」
(function () {
var intro = document.querySelector("[data-dh-intro]");
var toggle = document.querySelector("[data-dh-intro-toggle]");
if (!intro || !toggle) return;
function sync() {
if (intro.classList.contains("is-expanded")) return;
toggle.hidden = intro.scrollHeight <= intro.clientHeight + 1;
}
toggle.addEventListener("click", function () {
var expanded = intro.classList.toggle("is-expanded");
toggle.textContent = expanded ? "收起" : "展开";
});
window.addEventListener("resize", sync);
sync();
})();
(function () {
var shareBtns = document.querySelectorAll("[data-detail-share]");
if (!shareBtns.length) return;
+37
View File
@@ -5,4 +5,41 @@
window.scrollTo({ top: 0, behavior: "smooth" });
});
});
// 页脚进入视口后,把悬浮按钮(下载 App / 回到顶部)顶到页脚上方,避免遮住页脚内容。
var footers = document.querySelectorAll(".footer-box, .home-mobile-footer");
if (!footers.length) return;
var root = document.documentElement;
var ticking = false;
var lastLift = -1;
function visibleFooter() {
for (var i = 0; i < footers.length; i++) {
if (footers[i].offsetHeight > 0) return footers[i];
}
return null;
}
function update() {
ticking = false;
var footer = visibleFooter();
var lift = 0;
if (footer) {
var top = footer.getBoundingClientRect().top;
lift = Math.max(0, Math.round((window.innerHeight || 0) - top));
}
if (lift === lastLift) return;
lastLift = lift;
root.style.setProperty("--footer-lift", lift + "px");
}
function schedule() {
if (ticking) return;
ticking = true;
window.requestAnimationFrame(update);
}
window.addEventListener("scroll", schedule, { passive: true });
window.addEventListener("resize", schedule);
schedule();
})();
+1 -1
View File
@@ -108,7 +108,7 @@
el = el.parentElement;
}
if (!el || !el.closest) return;
var tag = el.closest(".poster-card-tag[data-tag-href], .ranking-card-tag[data-tag-href], .detail-tag[data-tag-href]");
var tag = el.closest(".poster-card-tag[data-tag-href], .ranking-card-tag[data-tag-href]");
if (!tag) return;
var href = tag.getAttribute("data-tag-href");
if (!href) return;
+4 -4
View File
@@ -6,18 +6,18 @@
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)
})(window, document,'script','https://mc.yandex.ru/metrika/tag.js?id={{if .isNavPage}}112390883{{else}}112387687{{end}}', 'ym');
})(window, document,'script','https://mc.yandex.ru/metrika/tag.js?id={{if .isNavPage}}112390883{{else}}112967594{{end}}', 'ym');
ym({{if .isNavPage}}112390883{{else}}112387687{{end}}, 'init', {ssr:true, webvisor:true, clickmap:true, ecommerce:"dataLayer", referrer: document.referrer, url: location.href, accurateTrackBounce:true, trackLinks:true});
ym({{if .isNavPage}}112390883{{else}}112967594{{end}}, 'init', {ssr:true, webvisor:true, clickmap:true, ecommerce:"dataLayer", referrer: document.referrer, url: location.href, accurateTrackBounce:true, trackLinks:true});
</script>
<!-- /Yandex.Metrika counter -->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{if .isNavPage}}G-SY26Y2MSHS{{else}}G-TZQS2NZ3TN{{end}}"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id={{if .isNavPage}}G-SY26Y2MSHS{{else}}G-B5KGM8S5J1{{end}}"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '{{if .isNavPage}}G-SY26Y2MSHS{{else}}G-TZQS2NZ3TN{{end}}');
gtag('config', '{{if .isNavPage}}G-SY26Y2MSHS{{else}}G-B5KGM8S5J1{{end}}');
</script>
{{end}}
+1 -1
View File
@@ -1,5 +1,5 @@
{{define "downloadAppFloat"}} {{if .appConfig.AppAddr}}
<link rel="stylesheet" href="/static/css/downloadAppFloat.css?v=5" />
<link rel="stylesheet" href="/static/css/downloadAppFloat.css?v=6" />
<a
class="download-fab"
href="{{.appConfig.AppAddr}}"
+25 -8
View File
@@ -1,5 +1,5 @@
{{define "footer"}}
<link rel="stylesheet" href="/static/css/footer.css?v=12" />
<link rel="stylesheet" href="/static/css/footer.css?v=15" />
<footer class="home-mobile-footer">
<img class="home-mobile-footer-logo" src="/static/images/logo.png?v=3" width="127" height="40" alt="黄果短剧" title="黄果短剧" />
<div class="home-mobile-footer-legal">
@@ -35,6 +35,19 @@
<img src="/static/images/figma-home/mobile/footer-top.svg" width="36" height="36" alt="" />
</button>
</div>
{{if or .appConfig.NewURLAddr .appConfig.NewURLAddr1 .appConfig.ForeverURLAddr}}
<div class="home-mobile-footer-addrs" aria-label="访问地址">
{{if .appConfig.NewURLAddr}}
<a class="home-mobile-footer-addr" href="{{.appConfig.NewURLAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer"><span>最新地址</span><span class="home-mobile-footer-addr-url">{{.appConfig.NewURLAddr}}</span></a>
{{end}}
{{if .appConfig.NewURLAddr1}}
<a class="home-mobile-footer-addr" href="{{.appConfig.NewURLAddr1}}" target="_blank" rel="sponsored nofollow noopener noreferrer"><span>备用地址</span><span class="home-mobile-footer-addr-url">{{.appConfig.NewURLAddr1}}</span></a>
{{end}}
{{if .appConfig.ForeverURLAddr}}
<a class="home-mobile-footer-addr" href="{{.appConfig.ForeverURLAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer"><span>海外永久地址</span><span class="home-mobile-footer-addr-url">{{.appConfig.ForeverURLAddr}}</span></a>
{{end}}
</div>
{{end}}
</footer>
<footer class="footer-box">
<div class="footer-outer">
@@ -54,14 +67,15 @@
{{end}}
{{if or .appConfig.NewURLAddr .appConfig.NewURLAddr1 .appConfig.ForeverURLAddr}}
<div class="footer-contact" aria-label="访问地址">
<div class="footer-col-title">访问地址</div>
{{if .appConfig.NewURLAddr}}
<a class="footer-contact-line" href="{{.appConfig.NewURLAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer">最新地址:{{.appConfig.NewURLAddr}}</a>
<a class="footer-contact-line" href="{{.appConfig.NewURLAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer"><span class="footer-contact-label">最新地址</span><span class="footer-contact-url">{{.appConfig.NewURLAddr}}</span></a>
{{end}}
{{if .appConfig.NewURLAddr1}}
<a class="footer-contact-line" href="{{.appConfig.NewURLAddr1}}" target="_blank" rel="sponsored nofollow noopener noreferrer">备用地址:{{.appConfig.NewURLAddr1}}</a>
<a class="footer-contact-line" href="{{.appConfig.NewURLAddr1}}" target="_blank" rel="sponsored nofollow noopener noreferrer"><span class="footer-contact-label">备用地址</span><span class="footer-contact-url">{{.appConfig.NewURLAddr1}}</span></a>
{{end}}
{{if .appConfig.ForeverURLAddr}}
<a class="footer-contact-line" href="{{.appConfig.ForeverURLAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer">海外永久地址:{{.appConfig.ForeverURLAddr}}</a>
<a class="footer-contact-line" href="{{.appConfig.ForeverURLAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer"><span class="footer-contact-label">海外永久地址</span><span class="footer-contact-url">{{.appConfig.ForeverURLAddr}}</span></a>
{{end}}
</div>
{{end}}
@@ -69,8 +83,11 @@
{{if .footer.NavList}}
{{with index .footer.NavList 0}}
{{if .TranslationList}}
<div class="footer-links footer-muted-text">
{{template "footerNavItems" .TranslationList}}
<div class="footer-nav-col">
<div class="footer-col-title">帮助与支持</div>
<nav class="footer-links footer-muted-text" aria-label="页脚导航">
{{template "footerNavItems" .TranslationList}}
</nav>
</div>
{{end}}
{{end}}
@@ -144,11 +161,11 @@
</a>
</nav>
<noscript>
<div><img src="https://mc.yandex.ru/watch/112387687" style="position:absolute; left:-9999px;" alt="" /></div>
<div><img src="https://mc.yandex.ru/watch/112967594" style="position:absolute; left:-9999px;" alt="" /></div>
</noscript>
{{template "scrollToTop" .}}
{{template "downloadAppFloat" .}}
<script defer src="/static/js/pages/footer.js?v=1"></script>
<script defer src="/static/js/pages/footer.js?v=2"></script>
{{template "pageConsole" .}}
{{end}}
+13 -2
View File
@@ -1,5 +1,5 @@
{{define "header"}}
<link rel="stylesheet" href="/static/css/header.css?v=14" />
<link rel="stylesheet" href="/static/css/header.css?v=17" />
<header class="site-header">
<div class="header-inner">
<button
@@ -67,6 +67,17 @@
/>
</form>
{{if .appConfig.AppAddr}}
<a class="header-mobile-icon-link" href="{{.appConfig.AppAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer" data-download-app-open aria-label="下载 App">
<img class="header-mobile-icon-img--lg" src="/static/images/header-download.svg?v=2" width="18" height="18" alt="" />
</a>
{{end}}
{{$headerBizHref := footerContactURL "商务合作" "" .appConfig.GmailAddr .appConfig.TGGroup .appConfig.CustomerServiceHost}}
{{if $headerBizHref}}
<a class="header-mobile-icon-link" href="{{$headerBizHref}}"{{if hasPrefix $headerBizHref "http"}} target="_blank" rel="sponsored nofollow noopener noreferrer"{{end}} aria-label="商务合作 Telegram">
<img src="/static/images/figma-home/mobile/drawer-telegram.svg" width="16" height="16" alt="" />
</a>
{{end}}
<a class="header-mobile-search-link" href="/search/" aria-label="前往搜索页">
<img src="/static/images/figma-home/mobile/search.svg" width="16" height="16" alt="" />
</a>
@@ -157,6 +168,6 @@
<script defer src="/static/js/common/request.js?v=3"></script>
<script defer src="/static/common/imgDecypt.js?v=2"></script>
<script defer src="/static/js/pages/header.js?v=9"></script>
<script defer src="/static/js/pages/header.js?v=10"></script>
<script defer src="/static/js/pages/dialogLoader.js?v=7"></script>
{{template "toast" .}} {{template "eightPop" .}} {{template "dialogAd" .}} {{end}}
+56 -67
View File
@@ -20,7 +20,8 @@
<script type="application/ld+json">{{.jsonLD}}</script>
{{end}}
<link rel="stylesheet" href="/static/css/index.css?v=27">
<link rel="stylesheet" href="/static/css/detail.css?v=30">
<link rel="stylesheet" href="/static/css/detail.css?v=31">
<link rel="stylesheet" href="/static/css/detailHero.css?v=3">
</head>
@@ -55,90 +56,78 @@
</nav>
<div class="detail-layout">
<div class="detail-main">
<section class="detail-hero">
<img class="detail-cover lazy" src="/static/images/placeholder.png?v=2" data-src="{{coverURL .Cover .Banner}}" alt="{{.Title}}" title="{{.Title}}" />
<div class="detail-hero-main">
<div class="detail-hero-info">
{{$detailTags := namedTags .TagIDs .TagNames .TagSlugs}}
{{if $detailTags}}
<div class="detail-tags">
{{range $detailTags}}
{{if .URL}}
<a class="detail-tag" href="{{.URL}}" data-tag-href="{{.URL}}">{{.Name}}</a>
{{else}}
<span class="detail-tag">{{.Name}}</span>
{{end}}
{{end}}
</div>
<section class="dh-card dh-hero">
<a class="dh-poster" href="{{playURL .Slug .ID}}" aria-label="播放《{{.Title}}》">
<img class="dh-poster-img lazy" src="/static/images/placeholder.png?v=2" data-src="{{coverURL .Cover .Banner}}" alt="{{.Title}}" title="{{.Title}}" />
{{if .IsFeatured}}<span class="dh-poster-badge">爆剧</span>{{else if .IsRecommend}}<span class="dh-poster-badge">黄果原创</span>{{else if .IsNew}}<span class="dh-poster-badge">上新</span>{{end}}
{{if .TotalEpisode}}<span class="dh-poster-eps">{{if eq .UpdateStatus 2}}全{{.TotalEpisode}}集{{else}}更新至{{.TotalEpisode}}集{{end}}</span>{{end}}
<span class="dh-poster-play" aria-hidden="true"><img src="/static/images/player.svg" alt="" /></span>
</a>
<div class="dh-info">
<div class="dh-brand">
<img class="dh-brand-avatar" src="/favicon.png?v=3" width="36" height="36" alt="" />
<span>黄果短剧官方</span>
</div>
<h1 class="dh-title">{{.Title}}</h1>
<div class="dh-meta">
<span>{{updateStatusText .UpdateStatus}}</span>
{{if .TotalEpisode}}<span>共 {{.TotalEpisode}} 集</span>{{end}}
<span>{{browseText .CountBrowse}}</span>
{{with playletDateText .OnlineAt .MediaCreatedAt .CreatedAt}}<span>{{.}} 上线</span>{{end}}
</div>
<h2 class="dh-intro-title">{{.Title}}剧情简介</h2>
<p class="dh-intro" data-dh-intro>{{if .Desc}}{{.Desc}}{{else}}暂无简介{{end}}</p>
<button class="dh-intro-toggle" type="button" data-dh-intro-toggle hidden>展开</button>
{{$detailTags := namedTags .TagIDs .TagNames .TagSlugs}}
{{if $detailTags}}
<div class="dh-tags">
{{range $detailTags}}
{{if .URL}}<a class="dh-tag" href="{{.URL}}">{{.Name}}</a>{{else}}<span class="dh-tag">{{.Name}}</span>{{end}}
{{end}}
<h1 class="detail-title">{{.Title}}</h1>
<div class="detail-meta">
<span class="detail-meta-pc">
<span>集数:{{if .TotalEpisode}}{{.TotalEpisode}}集{{else}}更新中{{end}}</span>
<span>上线时间 : {{playletDateText .OnlineAt .MediaCreatedAt .CreatedAt}}</span>
</span>
<span class="detail-meta-h5">
<span>{{if .TotalEpisode}}全{{.TotalEpisode}}集{{else}}短剧{{end}}</span>
<span class="detail-meta-dot">·</span>
<span>{{browseText .CountBrowse}}</span>
</span>
</div>
</div>
<div class="detail-intro-block">
<h2 class="detail-intro-title">简介</h2>
<p class="detail-intro"><span class="detail-intro-prefix-pc">简介:</span>{{if .Desc}}{{.Desc}}{{else}}暂无简介{{end}}</p>
{{end}}
{{$themes := namedThemeTags .ThemeIDs .ThemeNames .ThemeSlugs}}
{{if $themes}}
<div class="dh-themes">
<span class="dh-themes-label">所属专题</span>
{{range $themes}}
{{if .URL}}<a class="dh-theme" href="{{.URL}}">{{.Name}}</a>{{else}}<span class="dh-theme">{{.Name}}</span>{{end}}
{{end}}
</div>
<div class="detail-actions">
<a class="detail-play-btn" href="{{playURL .Slug .ID}}"><img src="/static/images/player.svg" alt="" />立即播放</a>
<div class="detail-action-group">
<button class="detail-action" type="button" data-detail-share data-playlet-id="{{.ID}}">
<span class="detail-action-icon">
<img src="/static/images/share.svg" alt="分享" />
</span>
<span>分享</span>
</button>
<span class="detail-action-sep"></span>
<a class="detail-action" href="/feedback/">
<span class="detail-action-icon">
<img src="/static/images/feedback.svg" alt="反馈" />
</span>
<span>反馈</span>
</a>
</div>
{{end}}
<div class="dh-actions">
<a class="dh-btn dh-btn--primary" href="{{playURL .Slug .ID}}"><img src="/static/images/player.svg" alt="" />立即播放</a>
<button class="dh-btn" type="button" data-detail-share data-playlet-id="{{.ID}}"><img src="/static/images/share.svg" alt="" />分享</button>
<a class="dh-btn" href="/feedback/"><img src="/static/images/feedback.svg" alt="" />反馈</a>
</div>
</div>
</section>
{{template "contentPromo" $}}
<section class="detail-episodes">
<div class="detail-episodes-head">
<h2 class="detail-section-label">剧集</h2>
<div class="detail-episodes-status">
<span>{{updateStatusText .UpdateStatus}}{{if .TotalEpisode}} 共{{.TotalEpisode}}集{{end}}</span>
<img class="detail-episodes-status-icon" src="/static/images/arrow_right.svg" alt="查看选集" />
<section class="dh-card dh-episodes" data-dh-episodes>
<div class="dh-episodes-head">
<div>
<h2 class="dh-episodes-title">{{.Title}}选集</h2>
<div class="dh-episodes-sub">{{if .TotalEpisode}}共 {{.TotalEpisode}} 集 · {{end}}{{updateStatusText .UpdateStatus}}</div>
</div>
<span class="dh-episodes-hint">点击集数直接播放</span>
</div>
{{with $.episodeRanges}}
<div class="detail-episode-ranges">
{{range $i, $r := .}}
<button class="detail-episode-range{{if eq $i 0}} detail-episode-range--active{{end}}" type="button" data-range-start="{{$r.Start}}" data-range-end="{{$r.End}}">{{$r.Label}}</button>
{{if gt (len $.episodeRanges) 1}}
<div class="dh-ranges">
{{range $i, $r := $.episodeRanges}}
<button class="dh-range{{if eq $i 0}} is-active{{end}}" type="button" data-range-start="{{$r.Start}}" data-range-end="{{$r.End}}">{{$r.Label}}</button>
{{end}}
</div>
{{end}}
<div class="detail-episode-list">
<div class="dh-ep-grid">
{{$playletID := .ID}}
{{$playletSlug := .Slug}}
{{range .PlayletChapterInfo}}
{{if .AllowWatch}}
<a class="detail-episode" href="{{chapterPlayURL $playletSlug $playletID .ID}}" data-ep="{{.CurrentEpisode}}">
<span class="detail-episode-pc">第{{.CurrentEpisode}}集</span>
</a>
<a class="dh-ep" href="{{chapterPlayURL $playletSlug $playletID .ID}}" data-ep="{{.CurrentEpisode}}" aria-label="第{{.CurrentEpisode}}集">{{printf "%02d" .CurrentEpisode}}</a>
{{else}}
<a class="detail-episode detail-episode--locked" href="javascript:;" data-episode-locked data-ep="{{.CurrentEpisode}}" aria-label="第{{.CurrentEpisode}}集,下载APP观看">
<span class="detail-episode-pc">第{{.CurrentEpisode}}集</span>
<span class="detail-episode-lock" aria-hidden="true">APP</span>
</a>
<a class="dh-ep dh-ep--locked" href="javascript:;" data-episode-locked data-ep="{{.CurrentEpisode}}" aria-label="第{{.CurrentEpisode}}集,下载APP观看">{{printf "%02d" .CurrentEpisode}}<span class="dh-ep-lock" aria-hidden="true">APP</span></a>
{{end}}
{{else}}
<div class="section-empty">暂无剧集</div>
@@ -183,6 +172,6 @@
</main>
{{end}}
{{template "footer" .}}
<script src="/static/js/pages/detail.js?v=15"></script>
<script src="/static/js/pages/detail.js?v=16"></script>
</body>
</html>
+9 -7
View File
@@ -17,7 +17,7 @@
{{if .jsonLD}}
<script type="application/ld+json">{{.jsonLD}}</script>
{{end}}
<link rel="stylesheet" href="/static/css/index.css?v=36">
<link rel="stylesheet" href="/static/css/index.css?v=39">
{{/* PC 需要 Swiper 样式;H5 延后按需注入,避免首屏下载与强制重排 */}}
<link rel="stylesheet" href="/static/common/swiper-bundle.min.css" media="(min-width: 768px)">
<link rel="preload" href="/static/common/swiper-bundle.min.js" as="script" media="(min-width: 768px)">
@@ -73,7 +73,8 @@
</div>
{{end}}
{{if .announcements}}
{{$cfg := .appConfig}}
{{if or .announcements $cfg.ForeverURLAddr $cfg.NewURLAddr $cfg.NewURLAddr1}}
<div class="home-announcement" role="note" aria-label="站内公告">
<div class="home-announcement-label">
<picture>
@@ -83,8 +84,8 @@
</div>
<div class="home-announcement-content">
<div class="home-announcement-marquee">
<span class="home-announcement-copy">{{range $i, $announcement := .announcements}}{{if $i}}<span class="home-announcement-separator" aria-hidden="true"> · </span>{{end}}{{if $announcement.Title}}<span class="home-announcement-title">{{$announcement.Title}}</span>{{if $announcement.Content}}:{{end}}{{end}}{{$announcement.Content}}{{end}}</span>
<span class="home-announcement-copy" aria-hidden="true">{{range $i, $announcement := .announcements}}{{if $i}}<span class="home-announcement-separator"> · </span>{{end}}{{if $announcement.Title}}<span class="home-announcement-title">{{$announcement.Title}}</span>{{if $announcement.Content}}:{{end}}{{end}}{{$announcement.Content}}{{end}}</span>
<span class="home-announcement-copy">{{template "homeAnnouncementItems" .}}</span>
<span class="home-announcement-copy" aria-hidden="true">{{template "homeAnnouncementItems" .}}</span>
</div>
</div>
</div>
@@ -156,9 +157,6 @@
<img src="/static/images/placeholder.png?v=2" class="poster-cover-img lazy" data-src="{{coverURL .Cover .Banner}}" width="160" height="214" decoding="async" alt="{{.Title}}" title="{{.Title}}" />
{{template "posterCornerBadges" .}}
{{template "posterLikeBadge" .}}
{{with episodeLabel .TotalEpisode}}
<div class="episode-badge"><div class="text-white-xs">{{.}}</div></div>
{{end}}
</div>
<div class="poster-card-body">
<div class="poster-card-title">{{.Title}}</div>
@@ -166,6 +164,7 @@
<div class="poster-card-meta">
{{template "posterCardTag" .}}
<div class="flex-spacer"></div>
{{with episodeLabel .TotalEpisode}}<div class="poster-card-episode">{{.}}</div>{{end}}
<div class="poster-card-heat">{{formatHeat .HeatValue}}</div>
</div>
</div>
@@ -212,3 +211,6 @@
</body>
</html>
{{/* 跑马灯内容:后台公告在前,随后是官方访问地址 */}}
{{define "homeAnnouncementItems"}}{{$cfg := .appConfig}}{{$n := 0}}{{range .announcements}}{{if $n}}<span class="home-announcement-separator" aria-hidden="true"> · </span>{{end}}{{$n = 1}}{{if .Title}}<span class="home-announcement-title">{{.Title}}</span>{{if .Content}}:{{end}}{{end}}{{.Content}}{{end}}{{if $cfg.ForeverURLAddr}}{{if $n}}<span class="home-announcement-separator" aria-hidden="true"> · </span>{{end}}{{$n = 1}}<span class="home-announcement-title">海外永久地址</span>:<a class="home-announcement-link" href="{{$cfg.ForeverURLAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer">{{$cfg.ForeverURLAddr}}</a>{{end}}{{if $cfg.NewURLAddr}}{{if $n}}<span class="home-announcement-separator" aria-hidden="true"> · </span>{{end}}{{$n = 1}}<span class="home-announcement-title">最新地址</span>:<a class="home-announcement-link" href="{{$cfg.NewURLAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer">{{$cfg.NewURLAddr}}</a>{{end}}{{if $cfg.NewURLAddr1}}{{if $n}}<span class="home-announcement-separator" aria-hidden="true"> · </span>{{end}}{{$n = 1}}<span class="home-announcement-title">备用地址</span>:<a class="home-announcement-link" href="{{$cfg.NewURLAddr1}}" target="_blank" rel="sponsored nofollow noopener noreferrer">{{$cfg.NewURLAddr1}}</a>{{end}}<span class="home-announcement-separator" aria-hidden="true"> · </span>请收藏以上地址,防止迷路{{end}}
+1 -1
View File
@@ -26,7 +26,7 @@
<script type="application/ld+json">{{.jsonLD}}</script>
{{end}}
<link rel="stylesheet" href="/static/css/index.css?v=27">
<link rel="stylesheet" href="/static/css/detail.css?v=30">
<link rel="stylesheet" href="/static/css/detail.css?v=31">
<link rel="stylesheet" href="/static/css/play.css?v=27">
<link rel="stylesheet" href="/static/common/DPlayer.min.css">
<script defer src="/static/common/hls.min.js"></script>