调uI
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 165 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 26 KiB |
@@ -1,8 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
|
||||
import { onBeforeUnmount, onMounted, ref } from 'vue'
|
||||
import QrcodeVue from 'qrcode.vue'
|
||||
import { APP_NAME } from '~/config/app'
|
||||
import dramas from '~/data/b-land/dramas.json'
|
||||
import { useAppDownload } from '~/utils/useAppDownload'
|
||||
import IosInstallGuide from '~/components/mobile/IosInstallGuide.vue'
|
||||
import IosSafariOpenGuide from '~/components/mobile/IosSafariOpenGuide.vue'
|
||||
@@ -10,16 +9,32 @@ import AndroidInstallTip from '~/components/mobile/AndroidInstallTip.vue'
|
||||
|
||||
const { init, download, isIos, hasIosStore, isSocialInApp, guide } = useAppDownload()
|
||||
const mobile = /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent)
|
||||
const tabs = ['精选', '短剧', '都市', '悬疑', '古装', '奇幻']
|
||||
const activeTab = ref('精选')
|
||||
const items = computed(() => activeTab.value === '精选'
|
||||
? dramas
|
||||
: dramas.filter(item => item.kind === activeTab.value || item.tags.includes(activeTab.value)))
|
||||
const qrUrl = window.location.href
|
||||
const showQr = ref(false)
|
||||
const busy = ref(false)
|
||||
const message = ref('')
|
||||
const asset = (path: string) => `/b-land/assets/${path}`
|
||||
const img = (name: string) => `/hjsq/${name}`
|
||||
|
||||
// 商务联系:Telegram @jbd125
|
||||
const businessUrl = 'https://t.me/jbd125'
|
||||
|
||||
const tabs = ['精选', '短剧', '乱伦', '禁漫', 'AV']
|
||||
const activeTab = ref('精选')
|
||||
const gridBase = [
|
||||
{ thumb: '01', title: '少妇3p大战大黑屌-初次挑战黑鬼被...' },
|
||||
{ thumb: '05', title: '情趣玩具加持性爱超体验,粉丝独家...' },
|
||||
{ thumb: '03', title: '我在寡妇村当老师', tall: true },
|
||||
{ thumb: '04', title: '青蛇淫传', tall: true },
|
||||
{ thumb: '06', title: '黑絲女助理办公室偷情,強制口交...' },
|
||||
{ thumb: '07', title: '大奶美少妇火辣身材连教练也把持不...' },
|
||||
{ thumb: '08', title: '【白虎御姐】蒙眼骚货白虎御姐被...' },
|
||||
{ thumb: '09', title: '【网黄噗噗】噗噗的周边玩具体验' },
|
||||
{ thumb: '10', title: '【极品女神】极品女神骑乘榨精,视...' },
|
||||
{ thumb: '11', title: '【我就奇了怪了,这么多巨乳妹子都...' },
|
||||
{ thumb: '12', title: '【居然能射这么远?直接喷到嘴里了】' },
|
||||
{ thumb: '01', title: '少妇3p大战大黑屌-初次挑战黑鬼被...' },
|
||||
]
|
||||
const gridItems = [...gridBase, ...gridBase]
|
||||
|
||||
async function startDownload(index = 0) {
|
||||
if (!mobile) {
|
||||
@@ -52,65 +67,58 @@ onBeforeUnmount(() => {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<main class="reference-page">
|
||||
<div class="landing-frame">
|
||||
<header class="masthead">
|
||||
<a class="brand" href="#" aria-label="返回首页" @click.prevent="activeTab = '精选'">
|
||||
<img :src="asset('logo-icon-brick.png')" :alt="APP_NAME" width="44" height="44" />
|
||||
<span><strong>{{ APP_NAME }}</strong><small>精彩短剧 · 每日更新</small></span>
|
||||
</a>
|
||||
<button class="header-action" type="button" @click="startDownload()">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" aria-hidden="true"><path d="M12 3v12m-5-5 5 5 5-5M4 16v5h16v-5" /></svg>
|
||||
<span>下载</span>
|
||||
<main class="hj-page">
|
||||
<div class="hj-frame">
|
||||
<header class="hj-header">
|
||||
<div class="hj-nav">
|
||||
<div class="logo">
|
||||
<img src="/b-land/assets/logo-icon-brick.png" :alt="APP_NAME" />
|
||||
<span><strong>{{ APP_NAME }}</strong><small>真实原创社区平台</small></span>
|
||||
</div>
|
||||
<img class="slogan" :src="img('slogan.png')" alt="百万免费视频" />
|
||||
<nav class="nav-right" aria-label="快捷入口">
|
||||
<a class="nav-item" :href="businessUrl" target="_blank" rel="noopener" aria-label="商务合作">
|
||||
<img :src="img('nav-business.png')" alt="商务" />
|
||||
</a>
|
||||
</nav>
|
||||
</div>
|
||||
<button class="banner" type="button" aria-label="下载即送 VIP" @click="startDownload()">
|
||||
<img :src="img('banner-pc.webp')" alt="下载即送VIP" />
|
||||
<img v-if="mobile && isIos" class="banner-ios-btn" :src="img('banner-ios-btn.png')" alt="百万影片 免费观看 轻量版下载" />
|
||||
<img v-else class="banner-cta" :src="img('banner-cta.png')" alt="立即体验" />
|
||||
</button>
|
||||
</header>
|
||||
|
||||
<section class="hero" aria-label="精彩短剧推荐">
|
||||
<div class="hero-posters" aria-hidden="true">
|
||||
<img :src="asset('hero/04-prism-cover.jpg')" alt="" />
|
||||
<img :src="asset('hero/02-yujing-cover.jpg')" alt="" />
|
||||
<img :src="asset('hero/05-feichai-cover.jpg')" alt="" />
|
||||
</div>
|
||||
<div class="hero-copy">
|
||||
<span class="hero-label">{{ APP_NAME }} · 精彩随时看</span>
|
||||
<h1>好故事<br />一看就入戏</h1>
|
||||
<p>海量高清短剧,发现你的下一部心动</p>
|
||||
<button type="button" class="hero-cta" @click="startDownload()">立即体验 <span aria-hidden="true">↗</span></button>
|
||||
</div>
|
||||
<nav class="tabs" aria-label="分类">
|
||||
<button v-for="tab in tabs" :key="tab" type="button" :class="{ active: activeTab === tab }" @click="activeTab = tab">{{ tab }}</button>
|
||||
</nav>
|
||||
<section class="grid" aria-label="视频列表">
|
||||
<button v-for="(item, i) in gridItems" :key="i" type="button" class="grid-item" :class="{ tall: item.tall }" @click="startDownload()">
|
||||
<img :src="img(`thumbs/thumb${item.thumb}.webp`)" :alt="item.title" :loading="i < 6 ? 'eager' : 'lazy'" />
|
||||
<span>{{ item.title }}</span>
|
||||
</button>
|
||||
</section>
|
||||
|
||||
<section class="library" aria-label="短剧列表">
|
||||
<nav class="category-tabs" aria-label="短剧分类">
|
||||
<button v-for="tab in tabs" :key="tab" type="button" :class="{ active: activeTab === tab }" :aria-pressed="activeTab === tab" @click="activeTab = tab">{{ tab }}</button>
|
||||
</nav>
|
||||
<div class="library-heading"><h2>{{ activeTab === '精选' ? '热门推荐' : activeTab + '推荐' }}</h2><span>{{ items.length }} 部好剧</span></div>
|
||||
<div class="poster-grid">
|
||||
<button v-for="(item, index) in items" :key="item.id" class="drama-card" type="button" :aria-label="'在 App 中观看' + item.title" @click="startDownload()">
|
||||
<div class="cover">
|
||||
<img :src="asset(item.cover)" :alt="item.title" :loading="index < 4 ? 'eager' : 'lazy'" width="300" height="450" />
|
||||
<span class="cover-tag">{{ item.tags[0] }}</span>
|
||||
<span class="episode">{{ item.episodes ? item.episodes + '集' : '持续更新' }} <span aria-hidden="true">▶</span></span>
|
||||
</div>
|
||||
<h3>{{ item.title }}</h3>
|
||||
<p>{{ item.tags.join(' · ') }}</p>
|
||||
</button>
|
||||
<div class="dock">
|
||||
<button v-if="mobile && isIos" class="ios-bar" type="button" :disabled="busy" aria-label="前往苹果商店下载" @click="startDownload()">
|
||||
<img :src="img('ios-appstore.gif')" alt="点我前往 苹果商店下载" />
|
||||
</button>
|
||||
<button v-else class="promo" type="button" :disabled="busy" aria-label="签到免费看片,立即下载" @click="startDownload()">
|
||||
<img class="promo-btn" :src="img('download-btn.png')" alt="立即下载" />
|
||||
</button>
|
||||
<button v-if="mobile && isIos && hasIosStore" class="store-link" type="button" :disabled="busy" @click="startDownload(1)">App Store 版下载</button>
|
||||
<p v-if="busy || message" class="download-error" role="status">{{ busy ? '正在获取下载链接…' : message }}</p>
|
||||
<div v-if="!mobile" class="qr-bar">
|
||||
<div class="qr-box"><QrcodeVue :value="qrUrl" :size="93" level="M" /></div>
|
||||
<div class="qr-right">
|
||||
<strong><img :src="img('scan.png')" alt="" />扫码下载</strong>
|
||||
<p>推荐使用UC/夸克浏览器扫码下载</p>
|
||||
</div>
|
||||
</div>
|
||||
<p v-if="!items.length" class="empty">更多精彩内容即将上线</p>
|
||||
<p class="list-end">更多精彩,尽在 {{ APP_NAME }} App</p>
|
||||
</section>
|
||||
|
||||
<aside class="download-dock" aria-label="下载 App">
|
||||
<div class="dock-copy"><span class="dock-label">随时随地 · 想看就看</span><strong>好剧不等待,精彩随身带</strong></div>
|
||||
<div class="download-actions">
|
||||
<button class="download-primary" type="button" :disabled="busy" @click="startDownload()"><span aria-hidden="true">↓</span> {{ busy ? '正在获取…' : isIos ? 'iOS 轻量版下载' : mobile ? 'Android 下载' : '立即下载 App' }}</button>
|
||||
<button v-if="isIos && hasIosStore" class="download-store" type="button" :disabled="busy" @click="startDownload(1)">App Store</button>
|
||||
</div>
|
||||
<p v-if="message" class="download-error" role="status">{{ message }}</p>
|
||||
<div v-if="!mobile" class="desktop-qr"><div class="qr"><QrcodeVue :value="qrUrl" :size="80" level="M" /></div><div><strong>手机扫码下载</strong><p>iOS / Android 均可使用</p><small>精彩内容,打开 App 即可观看</small></div></div>
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="showQr" class="qr-overlay" @click.self="showQr = false" @keydown.esc="showQr = false">
|
||||
<div v-if="showQr" class="qr-overlay" @click.self="showQr = false">
|
||||
<section class="qr-dialog" role="dialog" aria-modal="true" aria-label="扫码下载">
|
||||
<button class="close-modal" type="button" aria-label="关闭" autofocus @click="showQr = false">×</button>
|
||||
<h2>手机扫码下载 {{ APP_NAME }}</h2>
|
||||
@@ -126,71 +134,65 @@ onBeforeUnmount(() => {
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.reference-page { --blue: #296ff5; min-height: 100dvh; background: #1e1e1e; color: #fff; font: 14px/1.5 -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif; }
|
||||
.reference-page button, .reference-page a { -webkit-tap-highlight-color: transparent; }
|
||||
.reference-page button { font: inherit; cursor: pointer; }
|
||||
.reference-page button:focus-visible, .reference-page a:focus-visible { outline: 2px solid #92caff; outline-offset: 4px; }
|
||||
.landing-frame { width: 100%; max-width: 430px; margin: auto; min-height: 100dvh; padding-bottom: 240px; background: linear-gradient(180deg, #090731 5%, #101d63 100%); }
|
||||
.masthead { position: sticky; top: 0; z-index: 10; height: 72px; padding: 12px 17px; display: flex; align-items: center; justify-content: space-between; background: #090731; border-bottom: 1px solid #ffffff0b; }
|
||||
.brand { display: flex; align-items: center; gap: 9px; color: inherit; text-decoration: none; }
|
||||
.brand img { border-radius: 10px; object-fit: cover; }
|
||||
.brand strong { display: block; font-size: 22px; line-height: 1.2; letter-spacing: 1px; }
|
||||
.brand small { display: block; margin-top: 3px; font-size: 11px; color: #c1c5ed; letter-spacing: 1px; }
|
||||
.header-action { border: 0; background: transparent; color: #dce9ff; display: flex; flex-direction: column; align-items: center; gap: 2px; font-size: 10px !important; padding: 0 6px; }
|
||||
.header-action svg { width: 22px; height: 22px; }
|
||||
.hero { position: relative; height: 200px; overflow: hidden; background: #151454; isolation: isolate; }
|
||||
.hero::after { content: ''; position: absolute; inset: 0; z-index: -1; background: linear-gradient(90deg, #111343 5%, #111343e6 35%, #11134300 85%), linear-gradient(0deg, #090731, transparent 60%); }
|
||||
.hero-posters { position: absolute; z-index: -2; inset: -40px -55px -35px 125px; display: flex; gap: 9px; transform: rotate(13deg); opacity: .85; }
|
||||
.hero-posters img { width: 110px; height: 255px; object-fit: cover; border: 1px solid #8da3f533; border-radius: 10px; }
|
||||
.hero-posters img:nth-child(2) { margin-top: 35px; }
|
||||
.hero-copy { padding: 18px 20px; }
|
||||
.hero-label { color: #9eafff; font-size: 10px; letter-spacing: 2px; }
|
||||
.hero h1 { font-size: 31px; line-height: 1.2; letter-spacing: 2px; margin: 8px 0; font-weight: 900; }
|
||||
.hero p { font-size: 10px; color: #c5cbea; }
|
||||
.hero-cta { margin-top: 12px; border: 1px solid #7aa4ff66; border-radius: 20px; background: #296ff5; color: #fff; padding: 6px 15px; font-size: 11px !important; }
|
||||
.hero-cta span { margin-left: 15px; }
|
||||
.library { margin: 12px 16px 0; padding: 9px; border: 1px solid #2347c6; border-radius: 22px; background: #08052b; }
|
||||
.category-tabs { display: flex; gap: 3px; padding: 4px; border: 1px solid #4384ff; border-radius: 30px; background: var(--blue); }
|
||||
.category-tabs button { flex: 1; min-width: 0; border: 0; border-radius: 20px; height: 30px; padding: 0 2px; color: #fff; background: transparent; font-size: 12px; white-space: nowrap; }
|
||||
.category-tabs button.active { color: var(--blue); background: #fff; font-weight: 700; }
|
||||
.library-heading { display: flex; justify-content: space-between; align-items: center; padding: 15px 3px 10px; }
|
||||
.library-heading h2 { font-size: 14px; }
|
||||
.library-heading > span { color: #8588b2; font-size: 10px; }
|
||||
.poster-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px 10px; }
|
||||
.drama-card { display: block; min-width: 0; border: 0; padding: 0; background: transparent; text-align: left; color: #fff; }
|
||||
.cover { position: relative; aspect-ratio: 159 / 248; overflow: hidden; border-radius: 7px; background: #191a40; }
|
||||
.cover::after { content: ''; position: absolute; inset: 65% 0 0; background: linear-gradient(transparent, #000b); }
|
||||
.cover img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .2s; }
|
||||
.drama-card:hover .cover img { transform: scale(1.035); }
|
||||
.cover-tag { position: absolute; top: 6px; left: 6px; padding: 1px 6px; border-radius: 4px; background: #171437a6; color: #fff; font-size: 9px; backdrop-filter: blur(8px); }
|
||||
.episode { position: absolute; z-index: 1; bottom: 7px; left: 8px; right: 8px; display: flex; justify-content: space-between; align-items: center; font-size: 10px; }
|
||||
.episode > span { border-radius: 50%; width: 21px; height: 21px; text-align: center; line-height: 21px; background: #ffffff26; font-size: 9px; }
|
||||
.drama-card h3 { margin-top: 6px; font-size: 12px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.drama-card p { color: #777b9f; font-size: 10px; margin-top: 2px; }
|
||||
.empty, .list-end { padding: 24px 0 14px; text-align: center; font-size: 10px; color: #777b9f; }
|
||||
.download-dock { position: fixed; z-index: 15; bottom: 0; left: 50%; transform: translateX(-50%); width: min(100%, 430px); padding: 15px 20px max(15px, env(safe-area-inset-bottom)); border: 1px solid #477dff5c; border-bottom: 0; border-radius: 22px 22px 0 0; background: radial-gradient(ellipse at 90% 10%, #414fbe 0%, transparent 55%), linear-gradient(120deg, #172f8c, #101954); box-shadow: 0 -10px 40px #03032066; }
|
||||
.dock-copy { display: flex; flex-direction: column; gap: 2px; }
|
||||
.dock-label { font-size: 9px; color: #a8c4ff; letter-spacing: 2px; }
|
||||
.dock-copy strong { font-size: 18px; font-weight: 800; letter-spacing: .5px; }
|
||||
.download-actions { display: flex; gap: 8px; margin-top: 11px; }
|
||||
.download-primary { flex: 1; min-height: 42px; border: 1px solid #bad5ff; border-radius: 24px; background: linear-gradient(180deg, #fff, #c8dcff); color: #174cb4; font-size: 14px !important; font-weight: 800 !important; box-shadow: 0 4px 0 #112567; }
|
||||
.download-primary > span { margin-right: 8px; font-size: 20px; line-height: 1; }
|
||||
.download-store { border: 1px solid #7399f5; border-radius: 24px; padding: 0 12px; background: #ffffff12; color: #fff; font-size: 11px !important; }
|
||||
.download-actions button:disabled { opacity: .65; cursor: wait; }
|
||||
.download-error { margin-top: 8px; color: #ffdfac; font-size: 11px; }
|
||||
.desktop-qr { display: flex; gap: 15px; align-items: center; padding-top: 16px; margin-top: 15px; border-top: 1px solid #ffffff20; }
|
||||
.qr { background: #fff; padding: 5px; border-radius: 6px; line-height: 0; }
|
||||
.desktop-qr strong { font-size: 15px; }
|
||||
.desktop-qr p { margin-top: 4px; font-size: 11px; color: #c7d5ff; }
|
||||
.desktop-qr small { font-size: 9px; color: #91a5dd; }
|
||||
.qr-overlay { position: fixed; z-index: 100; inset: 0; background: #000a; display: grid; place-items: center; padding: 20px; backdrop-filter: blur(8px); }
|
||||
.qr-dialog { position: relative; width: min(100%, 360px); padding: 35px 20px 25px; border: 1px solid #4c69c5; border-radius: 20px; background: #101641; text-align: center; }
|
||||
.qr-dialog h2 { font-size: 20px; }
|
||||
.qr-dialog p { margin-top: 10px; font-size: 12px; color: #a9b7dc; }
|
||||
.modal-qr { padding: 15px; margin: 24px auto 15px; width: fit-content; border-radius: 12px; background: #fff; line-height: 0; }
|
||||
.qr-dialog > span { font-size: 12px; color: #a9b7dc; }
|
||||
.close-modal { position: absolute; right: 12px; top: 6px; border: 0; background: transparent; color: #a9b7dc; font-size: 26px !important; }
|
||||
@media (max-width: 767px) { .landing-frame { max-width: 100%; padding-bottom: 165px; } .download-dock { width: 100%; } .hero { height: 46vw; min-height: 190px; max-height: 280px; } .hero-posters { left: 36%; right: -35px; } .hero-posters img { width: 33%; height: 125%; } .library { margin-top: 10px; } }
|
||||
@media (min-width: 768px) { .landing-frame, .download-dock { max-width: 375px; } .landing-frame { padding-bottom: 270px; } .library { margin-left: 12px; margin-right: 12px; } }
|
||||
@media (prefers-reduced-motion: reduce) { .cover img { transition: none; } }
|
||||
.hj-page { --bg: #002640; --bar: #01668e; --accent: #2facff; min-height: 100dvh; background: #1e1e1e; color: #fff; font: 14px/1.5 -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif; }
|
||||
.hj-page button { font: inherit; color: inherit; border: 0; background: none; cursor: pointer; }
|
||||
.hj-frame { position: relative; width: 100%; max-width: 430px; min-height: 100dvh; margin: 0 auto; padding-bottom: 120px; background: var(--bg); }
|
||||
.hj-page:has(.qr-bar) .hj-frame { padding-bottom: 230px; }
|
||||
|
||||
/* 顶部:导航 + 横幅(参考站切图) */
|
||||
.hj-header { position: relative; z-index: 20; }
|
||||
.hj-nav { position: relative; z-index: 2; height: 72px; background: url(/hjsq/nav-bg.png) no-repeat center / 100% 100%; }
|
||||
.hj-nav .logo { position: absolute; left: 13px; top: 16px; display: flex; align-items: center; gap: 5px; width: 125px; height: 40px; color: #1088cf; }
|
||||
.hj-nav .logo img { width: 40px; height: 40px; border-radius: 8px; flex-shrink: 0; box-shadow: 0 0 0 1px #d6e6f3; }
|
||||
.hj-nav .logo span { display: flex; flex-direction: column; white-space: nowrap; }
|
||||
.hj-nav .logo strong { font-size: 17px; font-weight: 800; line-height: 22px; }
|
||||
.hj-nav .logo small { font-size: 9px; line-height: 13px; }
|
||||
.hj-nav .slogan { position: absolute; left: 132px; top: 19px; width: 96px; height: 18px; object-fit: contain; }
|
||||
.nav-right { position: absolute; right: 13px; top: 16px; display: flex; gap: 15px; }
|
||||
.nav-item { display: block; width: 28px; height: 44px; }
|
||||
.nav-item img { display: block; width: 100%; height: 100%; object-fit: contain; }
|
||||
.banner { position: relative; display: block; width: 100%; margin-top: -20px; padding: 0 !important; aspect-ratio: 375 / 180; }
|
||||
.banner img:first-child { display: block; width: 100%; height: 100%; object-fit: cover; }
|
||||
.banner-cta { position: absolute; left: 55.5%; bottom: 10px; width: 63px; height: 19px; transform: translateX(-50%); }
|
||||
|
||||
/* 分类 + 列表 */
|
||||
.tabs { position: sticky; top: 0; z-index: 10; display: flex; gap: 0; height: 37px; margin: 10px 11px 6px; padding: 3px 4px; border-radius: 18px; background: var(--bar); box-shadow: 0 6px 0 var(--bg); }
|
||||
.tabs button { flex: 1; min-width: 0; height: 31px; border-radius: 15px; font-size: 15px !important; }
|
||||
.tabs button.active { background: var(--accent) !important; }
|
||||
.grid { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 12px 8px; padding: 0 11px 20px; }
|
||||
.grid-item { width: calc(50% - 4px); padding: 0 !important; text-align: left; }
|
||||
.grid-item img { display: block; width: 100%; aspect-ratio: 172 / 97; border-radius: 5px; object-fit: cover; background: #01385c; }
|
||||
.grid-item.tall img { aspect-ratio: 172 / 223; }
|
||||
.grid-item span { display: block; margin-top: 6px; font-size: 10px; line-height: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
|
||||
/* 底部下载 */
|
||||
.dock { position: fixed; bottom: 0; left: 50%; z-index: 15; width: min(100%, 430px); transform: translateX(-50%); background: var(--bg); padding-top: 8px; }
|
||||
.promo { position: relative; display: block; width: calc(100% - 22px); aspect-ratio: 353 / 84; margin: 0 11px 10px; padding: 0 !important; background: url(/hjsq/bottom-bg.png) no-repeat center / 100% 100% !important; }
|
||||
.promo-btn { position: absolute; left: 52%; top: 49%; width: 31%; transform: translate(-50%, -50%); }
|
||||
.store-link { display: block; width: calc(100% - 22px); margin: -2px 11px 10px; height: 36px; border-radius: 18px; background: var(--bar) !important; font-size: 13px !important; }
|
||||
.download-error { margin: -4px 11px 8px; font-size: 12px; color: #bfe4ff; text-align: center; }
|
||||
.qr-bar { display: flex; align-items: center; height: 109px; padding-left: 44px; background: var(--bar); }
|
||||
.qr-box { display: grid; place-items: center; width: 95px; height: 95px; background: #fff; flex-shrink: 0; }
|
||||
.qr-right { margin-left: 16px; font-size: 12px; font-weight: 700; }
|
||||
.qr-right strong { display: flex; align-items: center; gap: 4px; }
|
||||
.qr-right strong img { width: 14px; height: 14px; }
|
||||
.qr-right p { margin-top: 4px; }
|
||||
|
||||
@media (min-width: 769px) {
|
||||
.hj-frame { max-width: 375px; }
|
||||
.dock { width: 375px; }
|
||||
}
|
||||
|
||||
.banner-ios-btn { position: absolute; left: 0; bottom: -6px; width: 100%; }
|
||||
.ios-bar { display: block; width: calc(100% - 22px); margin: 0 11px 12px; padding: 0 !important; }
|
||||
.ios-bar img { display: block; width: 100%; }
|
||||
|
||||
/* 扫码弹窗 */
|
||||
.qr-overlay { position: fixed; z-index: 100; inset: 0; display: grid; place-items: center; padding: 20px; background: #000a; backdrop-filter: blur(8px); }
|
||||
.qr-dialog { position: relative; width: min(100%, 320px); padding: 28px 24px 22px; border-radius: 16px; background: #fff; color: #002640; text-align: center; }
|
||||
.qr-dialog h2 { font-size: 18px; }
|
||||
.qr-dialog p { margin-top: 6px; font-size: 13px; color: #557; }
|
||||
.qr-dialog span { font-size: 12px; color: #889; }
|
||||
.modal-qr { display: inline-block; margin: 16px 0 8px; padding: 8px; border-radius: 8px; background: #fff; box-shadow: 0 0 0 1px #e3e8f0; }
|
||||
.close-modal { position: absolute; top: 8px; right: 12px; font-size: 24px !important; color: #889 !important; }
|
||||
</style>
|
||||
|
||||