测试列表热闹:此刻在测+战报滚动+手气测+卡片在测/TOP角标/弹入扫光(v26110291)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-04 02:19:32 +00:00
parent 265ad98d7c
commit 9c6b8138d2
9 changed files with 135 additions and 26 deletions

View File

@@ -320,8 +320,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
</div>
<div class="toast" id="toast"></div>
<script src="meta.js?v=26110290"></script>
<script src="tests.js?v=26110290"></script>
<script src="meta.js?v=26110291"></script>
<script src="tests.js?v=26110291"></script>
<script>
(function () {
'use strict';

View File

@@ -143,6 +143,42 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
.cst button{height:34px;border-radius:10px;background:#fff;border:1px solid #F0E6EE;box-shadow:0 2px 6px rgba(150,110,140,.06);font-size:13px;font-weight:700;color:#5A4C58;white-space:nowrap}
.cst button.on{background:linear-gradient(135deg,#EFEAFF,#E6F0FF);border-color:#D9D0FA;color:#4F45B5;font-weight:900}
.csg{margin-top:22px}
/* 11-04 测试列表「热闹」:实时在测 + 战报 + 手气测 + 卡片在测 / TOP / 弹入 / 扫光 */
.csv{display:grid;grid-template-columns:1fr auto;align-items:center;gap:8px 10px;margin:10px 12px 0;padding:10px 12px;border-radius:16px;background:linear-gradient(135deg,#FFF1EA,#FFF7F0 60%,#F6F0FF);box-shadow:0 4px 14px -8px rgba(240,112,79,.35)}
.csv-n{font-size:13px;font-weight:700;color:#6E5A55;display:flex;align-items:center;gap:6px}
.csv-n b{font-size:17px;font-weight:900;color:#F0453A;display:inline-block}
.csv-n b.bp{animation:csvBp .5s ease}
@keyframes csvBp{40%{transform:translateY(-2px) scale(1.08)}}
.csv-dot{width:8px;height:8px;border-radius:50%;background:#F0453A;box-shadow:0 0 0 0 rgba(240,69,58,.5);animation:csvDot 1.4s ease-out infinite}
@keyframes csvDot{70%{box-shadow:0 0 0 7px rgba(240,69,58,0)}100%{box-shadow:0 0 0 0 rgba(240,69,58,0)}}
.csv-go{display:inline-flex;align-items:center;gap:4px;height:30px;padding:0 12px 0 8px;border-radius:99px;background:linear-gradient(135deg,#8D6BFF,#B08CFF);color:#fff;font-size:12.5px;font-weight:800;box-shadow:0 4px 10px -4px #8D6BFF}
.csv-go svg{width:18px;height:18px;color:#fff;opacity:.95}
.csv-go svg rect{fill:rgba(255,255,255,.28)}
.csv-go.roll svg{animation:csvRoll .65s cubic-bezier(.3,1.4,.6,1)}
@keyframes csvRoll{to{transform:rotate(720deg) scale(1.15)}}
.csv-r{grid-column:1/-1;position:relative;height:24px;overflow:hidden}
.csv-i{position:absolute;inset:0;display:flex;align-items:center;gap:6px;width:100%;font-size:12.5px;color:#7A6863;text-align:left;opacity:0;transform:translateY(100%);transition:transform .45s ease,opacity .45s ease}
.csv-i.on{opacity:1;transform:none}.csv-i.up{opacity:0;transform:translateY(-100%)}
.csv-i img{flex:none;width:20px;height:20px;border-radius:50%;object-fit:cover;border:1.5px solid #fff;background:#FFE3D3}
.csv-i span{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.csv-i em{font-style:normal;font-weight:800;color:#3A2A26;margin-right:4px}
.csv-i b{font-weight:800;color:#8D6BFF}
.csv-i small{flex:none;font-size:11px;color:#B5A39C}
.ck .cv .ck-live{position:absolute;left:7px;top:7px;z-index:1;display:inline-flex;align-items:center;gap:3px;height:19px;padding:0 7px 0 6px;border-radius:99px;background:rgba(255,255,255,.82);color:#6E5A55;font-size:10px;font-style:normal;font-weight:700}
.ck .cv .ck-live>i{width:6px;height:6px;border-radius:50%;background:#2EC47A;box-shadow:0 0 0 0 rgba(46,196,122,.5);animation:csvDot2 1.6s ease-out infinite}
@keyframes csvDot2{70%{box-shadow:0 0 0 5px rgba(46,196,122,0)}100%{box-shadow:0 0 0 0 rgba(46,196,122,0)}}
#more .ck .cv .ck-live b{margin:0;padding:0;font-size:11px;line-height:1;color:#2A1E1E;font-weight:900;font-variant-numeric:tabular-nums;-webkit-line-clamp:unset;display:inline}
#more .ck .cv .ck-live.bp b{animation:csvBp .5s ease;display:inline-block;color:#F0453A}
.ck .cv .ck-top{position:absolute;right:0;top:0;z-index:1;height:20px;padding:0 8px 0 9px;border-radius:0 0 0 12px;color:#fff;font-size:10.5px;font-style:italic;font-weight:900;line-height:20px;letter-spacing:.3px}
.ck-top.t1{background:linear-gradient(135deg,#F0453A,#FF8A3D)}.ck-top.t2{background:linear-gradient(135deg,#FF8A2E,#FFC06E)}.ck-top.t3{background:linear-gradient(135deg,#8D6BFF,#B9A3FF)}
.ck .cv i.dn{top:30px}
.ck .cv em{position:relative;overflow:hidden}
.ck .cv em::after{content:"";position:absolute;top:0;bottom:0;left:-60%;width:40%;background:linear-gradient(100deg,transparent,rgba(255,255,255,.55),transparent);transform:skewX(-18deg);animation:ckShine 3.6s ease-in-out infinite}
@keyframes ckShine{0%,62%{left:-60%}88%,100%{left:130%}}
.pre{opacity:0}
.pre.pop-in{animation:ckPop .5s cubic-bezier(.3,1.35,.5,1) both}
@keyframes ckPop{from{opacity:0;transform:translateY(14px) scale(.96)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.pre{opacity:1}.pre.pop-in,.ck .cv em::after,.csv-dot,.ck .cv .ck-live>i{animation:none}}
.csg-h{display:flex;flex-direction:column;gap:5px;padding:0 2px}
.csg-h b{display:flex;align-items:center;gap:6px;padding-left:10px;border-left:3px solid #B9B3D6;font-size:19px;font-weight:900;line-height:1.1;color:#2B2433}
.csg-h b i{font-style:normal;font-size:18px}
@@ -183,6 +219,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
.c2 .ck .cv b{font-size:15.5px;padding:0 6px}
.ck .cv{height:146px}
.c2 .ck .cv{height:160px}
#more .ck .cv{padding-top:22px;height:166px}#more .c2 .ck .cv{height:178px}
.ck .cnn{margin-top:8px}
.ck .cv small{font-size:10.5px;color:#8D8091;white-space:nowrap}
.ck .cv em{margin-top:2px;height:22px;padding:0 10px;border-radius:6px;background:var(--cb);color:#fff;font-size:11px;font-style:normal;font-weight:800;line-height:22px;box-shadow:0 3px 8px -3px var(--cb)}
@@ -711,10 +748,10 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
<div id="sheet" role="dialog" aria-modal="true"><i class="sg"></i><div class="sbd" id="sbd"></div></div>
<div class="toast" id="toast"></div>
<script src="topics.js?v=26110290"></script>
<script src="data.js?v=26110290"></script>
<script src="feed.js?v=26110290"></script>
<script src="ceshi/meta.js?v=26110290"></script>
<script src="topics.js?v=26110291"></script>
<script src="data.js?v=26110291"></script>
<script src="feed.js?v=26110291"></script>
<script src="ceshi/meta.js?v=26110291"></script>
<script>
(function () {
'use strict';
@@ -780,7 +817,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
var CMD = null, CMERR = false;
/* 头像编码:数字 = av/NNNN.webp(旧代码头像);'av:c012' = av/c012.webp(卡通/可爱卡通);'/…' = 站内绝对路径(内置头像库 /_bridge/avatars/);其余 = assets/img/mom/xxx.jpg */
var avP = function (a) { return typeof a === 'number' ? 'av/' + ('000' + a).slice(-4) + '.webp' : a.indexOf('av:') === 0 ? 'av/' + a.slice(3) + '.webp' : a.charAt(0) === '/' ? a : '../assets/img/mom/' + a + '.jpg'; };
fetch('cm.json?v=26110290').then(function (r) { return r.json(); }).then(function (j) {
fetch('cm.json?v=26110291').then(function (r) { return r.json(); }).then(function (j) {
CMD = j; if (openId && NBY[openId]) { renderComments(NBY[openId]); syncBar(NBY[openId]); }
}).catch(function () { CMERR = true; if (openId && NBY[openId]) renderComments(NBY[openId]); });
function commentsOf(n) {
@@ -1026,10 +1063,75 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
};
function csCardHTML(x, done, i) {
var d = done[x.id], who = (x.sub || '').split('·')[0].trim();
var top = byHot(TM).slice(0, 3).map(function (y) { return y.id; }).indexOf(x.id), nw = csNowOn(x.id);
return '<button type="button" class="ck ' + CS_GPAL[x.group] + '" data-test="' + x.id + '"><span class="cv">' + (CS_BLOBS[x.group] || CS_BLOB) +
'<i class="ck-live"><i></i><b data-v="' + nw + '">' + nw + '</b> 人在测</i>' + (top >= 0 ? '<i class="ck-top t' + (top + 1) + '">TOP' + (top + 1) + '</i>' : '') +
'<b>' + esc(x.title.replace(/^测一测|/, '')) + '</b><small>' + esc(who) + ' · ' + x.n + ' 题</small><em>' + (d ? '再测一次' : '开始测试') + '</em>' + (d ? '<i class="dn">已测</i>' : '') + '</span>' +
'<span class="cnn"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12.6 2.5c.4 3-1.6 4.6-3 6.2C8 10.4 7 12 7 14.3A5 5 0 0012 19.5a5 5 0 005-5.2c0-2-1-3.6-1.9-4.6-.2 1.3-.9 2.2-1.9 2.6.6-3.4-.2-7-.6-9.8z" fill="currentColor"/></svg>' + gcTestedText(x.id) + '</span></button>';
}
/* ---------- 11-04 用户:「测试列表页太安静,要热闹、有创意」 ----------
① banner 下一条「此刻 N 人正在测」(红点呼吸、数字隔 2 秒小跳)+ 战报滚动「谁 刚测出「结果」· 哪个测试」(点了进那个测试);
② 右边「手气测」骰子:随机挑一个还没测过的测试,骰子转一下就进;
③ 卡片封面左上「● N 人在测」,隔几秒随机两张卡数字跳;全站最热 3 个封面右上 TOP1~3 角标;卡片进屏错落弹入、「开始测试」按钮定时扫光。
人数 / 昵称 / 头像都是模拟(同「N 人测过」口径,AGENTS.md 12b,12-31 复核);战报只写「测出了哪个结果」,结果名取 meta.js GC_RES(真实结果名)。 */
var CL_NM = ['小满妈妈', '糯米团子', '橙子不酸', '鹿鹿呀', '安安的妈', '豆包本包', '一只小葵', '阿圆', '栗子酱', '桃桃乌龙', '芝麻汤圆', '晴天娃娃',
'果冻布丁', '岁岁平安', '叮当妈', '饭团子', '奶糖不甜', '小鱼干', '朵朵妈咪', '暖暖', '布丁要长大', '花卷儿', '柚子茶', '星星的妈',
'甜甜圈', '小熊软糖', '一颗青梅', '冬冬妈', '可乐加冰', '麦穗儿', '云朵朵', '橘子汽水', '乐乐的妈', '荔枝', '蜜桃乌龙', '小葡萄'];
var CL_AV = ['p02', 'm05', 'p05', 'm12', 'k04', 'p09', 'm16', 'p11', 'm07', 'k10', 'p03', 'm19', 'p13', 'm02', 'k06', 'p06', 'm10', 'p12', 'm21', 'p07', 'm04', 'k12', 'p14', 'm15',
'p01', 'm01', 'k01', 'm03', 'p04', 'm06', 'k02', 'm08', 'p08', 'm09', 'k03', 'm11'];
var CS_DICE = '<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="5" fill="currentColor"/><g fill="#fff"><circle cx="8" cy="8" r="1.7"/><circle cx="16" cy="8" r="1.7"/><circle cx="12" cy="12" r="1.7"/><circle cx="8" cy="16" r="1.7"/><circle cx="16" cy="16" r="1.7"/></g></svg>';
function csNowBase() { return Math.round(TM.reduce(function (a, x) { return a + gcTested(x.id); }, 0) / 1150); }
function csLiveHTML() {
return '<div class="csv"><div class="csv-n"><i class="csv-dot"></i>此刻 <b id="csvN" class="num">' + csNowBase().toLocaleString() + '</b> 人正在测</div>' +
'<button type="button" class="csv-go" id="csvGo">' + CS_DICE + '手气测</button>' +
'<div class="csv-r" id="csvR"></div></div>';
}
var csvT = 0, csvI = 0, csvRec = [];
function csvOne() {
var R = window.GC_RES || {}, ids = TM.filter(function (x) { return R[x.id] && R[x.id].length; });
if (!ids.length) return '';
var t = ids[Math.floor(Math.random() * ids.length)], rs = R[t.id], r = rs[Math.floor(Math.random() * rs.length)], k, c = [];
for (k = 0; k < CL_NM.length; k++) if (csvRec.indexOf(k) < 0) c.push(k);
k = c[Math.floor(Math.random() * c.length)]; csvRec.push(k); if (csvRec.length > 14) csvRec.shift();
return '<button type="button" class="csv-i" data-test="' + t.id + '"><img src="../assets/img/mom/' + CL_AV[k] + '.jpg" alt="" width="20" height="20">' +
'<span><em>' + esc(CL_NM[k]) + '</em>刚测出<b>「' + esc(r) + '」</b></span><small>' + esc(CS_SHORT[t.id] || '') + '</small></button>';
}
function csLiveRun() {
clearInterval(csvT);
var box = $('#csvR'); if (!box) return;
box.innerHTML = csvOne(); if (box.firstChild) box.firstChild.classList.add('on');
var base = csNowBase(), n = base, tick = 0;
csvT = setInterval(function () {
if (document.hidden || !document.getElementById('csvR')) return;
tick++;
if (tick % 2 === 0) { /* 战报每 2.6 秒换一条 */
var b = document.getElementById('csvR'), old = b.querySelector('.csv-i.on');
b.insertAdjacentHTML('beforeend', csvOne());
var nw = b.lastElementChild; void nw.offsetWidth; nw.classList.add('on');
if (old) { old.classList.remove('on'); old.classList.add('up'); setTimeout(function () { if (old.parentNode) old.parentNode.removeChild(old); }, 450); }
}
n = Math.max(Math.round(base * .93), Math.min(Math.round(base * 1.07), n + Math.round((Math.random() - .45) * 14)));
var e = document.getElementById('csvN'); if (e) { e.textContent = n.toLocaleString(); e.classList.remove('bp'); void e.offsetWidth; e.classList.add('bp'); }
if (tick % 3 === 0) { /* 随机两张卡的「在测」数小跳 */
var cs = document.querySelectorAll('#more .ck-live b');
for (var q = 0; q < 2 && cs.length; q++) {
var x = cs[Math.floor(Math.random() * cs.length)], v = +x.dataset.v || 10;
v = Math.max(3, v + (Math.random() < .6 ? 1 : -1) * (1 + Math.floor(Math.random() * 3))); x.dataset.v = v; x.textContent = v;
x.parentNode.classList.remove('bp'); void x.parentNode.offsetWidth; x.parentNode.classList.add('bp');
}
}
}, 1300);
}
function csNowOn(id) { var h = 0; for (var i = 0; i < id.length; i++) h = (h * 31 + id.charCodeAt(i)) >>> 0; return 6 + h % 9 + Math.round(gcTested(id) / 2600); }
function csFx() { /* 卡片进屏错落弹入 */
var els = document.querySelectorAll('#more .ck, #more .csr');
if (!('IntersectionObserver' in window)) return;
var io = new IntersectionObserver(function (es) {
var k = 0;
es.forEach(function (e) { if (!e.isIntersecting) return; e.target.style.animationDelay = (k++ * 70) + 'ms'; e.target.classList.add('pop-in'); io.unobserve(e.target); });
}, { threshold: .15 });
[].forEach.call(els, function (el) { el.classList.add('pre'); io.observe(el); });
}
function ceshiListHTML() {
var done = csDone(), gs = ['quiz', 'psy', 'game', 'shop'].filter(function (g) { return !tGrp || tGrp === g; }), k = 0;
return '<div class="csl">' + gs.map(function (g, gi) {
@@ -1066,7 +1168,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
}
function renderHead() {
var t = TBY[cur], el = $('#head'), fh = $('#fh');
if (catF === 'ceshi') { el.innerHTML = cbnHTML('ceshi'); ceshiFh(fh); return; } /* 原一行介绍 ceshiHead 并进 banner */
if (catF === 'ceshi') { el.innerHTML = cbnHTML('ceshi') + csLiveHTML(); ceshiFh(fh); csLiveRun(); return; } /* 原一行介绍 ceshiHead 并进 banner */
if (!t) {
var hl = hotList();
el.innerHTML = (catF ? cbnHTML(catF) : qifuHTML()) + /* 祈福树只在「全部」 */
@@ -1116,7 +1218,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
/* 真瀑布流:每张卡放进当前更矮的那一列(逐张量高,标题一行/两行也算进去) */
var hs = [0, 0], tmp = document.createElement('div'), lastTx = [false, true], txN = [0, 1]; /* 11-02 用户:图上带字的卡至少占 40% → 每列「带字 / 不带字」交替(测试卡算不带字),两列错开一格,带字的在压大字 ov / 贴纸字 tg 间轮换;整体约 45% */
if (catF === 'ceshi') {
$('#more').innerHTML = ceshiListHTML(); return;
$('#more').innerHTML = ceshiListHTML(); csFx(); return;
}
/* 「全部」信息流:穿插测试卡 */
if (!cur && !catF && TM.length) {
@@ -1271,7 +1373,14 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
$('#more').addEventListener('click', function (e) { if (e.target.closest('[data-t]')) { haptic(); selectTopic(''); } });
$('#head').addEventListener('click', function (e) {
if (e.target.closest('#qfBanner')) { goQifu(); return; }
var cb = e.target.closest('.cbn[data-test]'); if (cb) { haptic(); location.href = ceshiURL(cb.dataset.test, true); return; }
var cb = e.target.closest('.cbn[data-test], .csv-i[data-test]'); if (cb) { haptic(); location.href = ceshiURL(cb.dataset.test, true); return; }
var dc = e.target.closest('#csvGo');
if (dc) { /* 手气测:优先没测过的 */
haptic(); dc.classList.add('roll');
var dn = csDone(), pool = TM.filter(function (x) { return !dn[x.id]; }); if (!pool.length) pool = TM;
var pk = pool[Math.floor(Math.random() * pool.length)];
setTimeout(function () { location.href = ceshiURL(pk.id, true); }, 650); return;
}
var j = e.target.closest('[data-join]'); if (j) { haptic(); openRule(j.dataset.join); return; }
if (e.target.closest('[data-rule]')) { openRule(''); return; }
if (e.target.closest('[data-all]')) { openTopics(); return; }

View File

@@ -105,7 +105,7 @@ main{padding:6px 16px 0}
</div>
<div class="wb"><button type="button" id="write"><svg class="ic" viewBox="0 0 24 24"><path d="M12 20h9M16.5 3.5a2.1 2.1 0 013 3L7 19l-4 1 1-4z"/></svg>写新的故事</button></div>
<script src="../topics.js?v=26110290"></script>
<script src="../topics.js?v=26110291"></script>
<script>
(function () {
'use strict';

View File

@@ -7,10 +7,10 @@
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>兜爸心选 · 孕育陪伴</title>
<!-- V:26110290 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<!-- V:26110291 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<link rel="stylesheet" href="mama-box.css">
<link rel="stylesheet" href="night.css">
<link rel="stylesheet" href="js/hero-cd.css?v=26110290">
<link rel="stylesheet" href="js/hero-cd.css?v=26110291">
<!-- 夜晚模式:首屏绘制前就按上次的选择加 class,避免先白后黑闪一下(开关在首页右上角 #nightBtn,逻辑见 app.js) -->
<script>try{if(localStorage.getItem('mmbox.night.v1')==='1'){document.documentElement.classList.add('night');document.querySelector('meta[name=theme-color]').content='#2A2340'}}catch(e){}</script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
@@ -2580,17 +2580,17 @@
<script src="/_bridge/avatar-picker.js?v=26101105"></script>
<script src="/_bridge/hand-icons.js?v=26101202"></script>
<script src="js/zodiac-art.js"></script>
<script src="guangchang/topics.js?v=26110290"></script>
<script src="guangchang/topics.js?v=26110291"></script>
<script src="js/app.js"></script>
<script src="js/hero-cd.js?v=26110290"></script>
<script src="js/kit.js?v=26110290"></script>
<script src="js/hero-cd.js?v=26110291"></script>
<script src="js/kit.js?v=26110291"></script>
<script>
/* 11-02 首页「孕妈广场」效果稿:地址带 ?gcv=1~6 时,把 #gcHome 换成 demo/gch/vN.css + vN.js 的版式并滚到这一块。
11-02 用户:「用第一版,放到预览页面上」;后改定彩色卡 → 不带参数也默认用 V6 合并版(广场卡堆 + 其他妈妈也在搜 + 测一测第 4 版彩色卡),不滚动、不显示效果稿角标 */
(function () {
var m = location.search.match(/[?&]gcv=([1-6])(?:&|$)/);
if (!m) window.__gcDefault = 1;
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110290';
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110291';
var dir = n === '4' || n === '6' ? 'js/gch/' : 'demo/gch/'; /* 11-03 上正式:定稿 V6(含它套的 V4)并进 js/gch/,其余效果稿仍在 demo/ */
l.rel = 'stylesheet'; l.href = dir + 'v' + n + '.css?' + q;
s.src = dir + 'v' + n + '.js?' + q;
@@ -2599,7 +2599,7 @@
/* 11-02 品牌露出(用户定 4 处都要):默认加载,?brand=0 可关掉对比;11-03 已并进 js/gch/ */
if (!/[?&]brand=0/.test(location.search)) {
var bl = document.createElement('link'), bs = document.createElement('script');
bl.rel = 'stylesheet'; bl.href = 'js/gch/brand.css?v=26110290'; bs.src = 'js/gch/brand.js?v=26110290';
bl.rel = 'stylesheet'; bl.href = 'js/gch/brand.css?v=26110291'; bs.src = 'js/gch/brand.js?v=26110291';
document.head.appendChild(bl); document.body.appendChild(bs);
}
})();
@@ -2610,7 +2610,7 @@
<script src="js/hero-fx.js"></script>
<!-- 2026-10-05 首页头图:宝宝时不时动一动小手小脚(独立文件,删掉这一行即下线) -->
<script src="js/baby-limbs.js?v=26101201"></script>
<script src="js/coach.js?v=26110290"></script>
<script src="js/coach.js?v=26110291"></script>
<script src="js/birth-flow.js?v=26110201"></script>
<!-- 禁止下拉回弹(2026-10-11 统一规则,与孕期体重同一段):竖向拖动时从手指下往上找还能朝该方向滚的容器,找不到才拦;横滑、双指、可滚列表不受影响 -->

View File

@@ -3,7 +3,7 @@
(function () {
'use strict';
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
var VER = '26110290';
var VER = '26110291';
const $ = (s, c) => (c || document).querySelector(s);
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));

View File

@@ -231,5 +231,5 @@
}
/* feed.js 首页默认不加载(index.html 只引了 topics.js),这里按需拉一次 */
if (window.GC_FEED) init();
else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110290'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110291'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
})();

View File

@@ -6,9 +6,9 @@
(function () {
var sec = document.getElementById('gcHome');
if (!sec) return;
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110290';
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110291';
document.head.appendChild(l);
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110290';
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110291';
s.onload = function () { if (sec.querySelector('.g4-foot')) merge(); else sec.addEventListener('gc4-ready', merge, { once: true }); }; /* v4 要先拉 feed.js 才渲染 */
document.body.appendChild(s);

View File

@@ -9,7 +9,7 @@
if (/[?&]kit=0(?:&|$)/.test(location.search)) return;
var box = document.getElementById('kit'), sec = document.getElementById('kitHome');
if (!box || !sec) return;
var V = '26110290';
var V = '26110291';
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/kit.css?v=' + V; document.head.appendChild(l);
document.documentElement.classList.add('has-kit');

View File

@@ -68,7 +68,7 @@
function getJSON(u) { return fetch(u, { cache: 'no-cache' }).then(function (r) { if (!r.ok) throw r.status; return r.json(); }); }
function related(box) {
getJSON('../_shared/idx.json?v=26110290').then(function (idx) {
getJSON('../_shared/idx.json?v=26110291').then(function (idx) {
var me = null; idx.forEach(function (x) { if (x[0] === SLUG) me = x; });
var tag = me ? me[2] : '', h = 0; for (var i = 0; i < SLUG.length; i++) h = (h * 31 + SLUG.charCodeAt(i)) >>> 0;
var rest = idx.filter(function (x) { return x[0] !== SLUG; });
@@ -175,7 +175,7 @@
}
fetch(API + '/comments?kind=topic&target=' + encodeURIComponent(SLUG) + (OID ? '&openid=' + encodeURIComponent(OID) : ''))
.then(function (r) { return r.json(); }).then(function (j) { if (j && j.code === 200) { RC = j.result; paint(); } }).catch(function () {});
getJSON('../_shared/cm/' + SLUG + '.json?v=26110290').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
getJSON('../_shared/cm/' + SLUG + '.json?v=26110291').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
}
function extras(el) {