feat(首页头图): 按预产期推算星座,孕囊右下角挂「xx宝宝」玻璃小牌 (v26100424)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
||||
var VER = '26100423';
|
||||
var VER = '26100424';
|
||||
const $ = (s, c) => (c || document).querySelector(s);
|
||||
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
||||
|
||||
@@ -1219,7 +1219,8 @@
|
||||
syncPregnancy 有好几个提前 return 的分支,所以用微任务等它整个跑完再发,拿到的是最终状态。 */
|
||||
function pubPreg() {
|
||||
const d = { week: (state.postpartum || state.pregEmpty) ? null : state.week, day: state.day,
|
||||
postpartum: !!state.postpartum, empty: !!state.pregEmpty };
|
||||
postpartum: !!state.postpartum, empty: !!state.pregEmpty,
|
||||
due: (state.due && !state.pregEmpty) ? [state.due.getFullYear(), state.due.getMonth() + 1, state.due.getDate()] : null }; // 2026-10-04 头图星座牌按预产期算
|
||||
window.__mbPreg = d;
|
||||
window.dispatchEvent(new CustomEvent('mb-preg', { detail: d }));
|
||||
}
|
||||
|
||||
@@ -57,7 +57,38 @@
|
||||
g.onload = () => { if (my !== seq) return; kid.src = g.src; kid.classList.add('is-on'); };
|
||||
g.src = IMG + gif;
|
||||
}
|
||||
function onPreg(d) { show(stageOf(force != null ? +force : (d && d.week))); }
|
||||
/* ---- 星座牌(2026-10-04,用户:「按预产期推算宝宝是哪个星座,在羊水囊外边放上『巨蟹宝宝』之类,协调、字不要太大、高级一些」) ----
|
||||
挂在 .hero-baby 里(跟着孕囊一起浮),落在孕囊右下角那块空角上。
|
||||
只在孕期显示(未建档 / 产后不显示:产后应按真实生日,而这里只有预产期)。
|
||||
预产期离星座分界 ≤2 天时写成「巨蟹·狮子宝宝」—— 预产期本来就是估算,别说得太死。 */
|
||||
const ZOD = [ // [起始月, 起始日, 名, 符号] 按起始日期排
|
||||
[1, 20, '水瓶', '♒'], [2, 19, '双鱼', '♓'], [3, 21, '白羊', '♈'], [4, 20, '金牛', '♉'], [5, 21, '双子', '♊'], [6, 22, '巨蟹', '♋'],
|
||||
[7, 23, '狮子', '♌'], [8, 23, '处女', '♍'], [9, 23, '天秤', '♎'], [10, 24, '天蝎', '♏'], [11, 23, '射手', '♐'], [12, 22, '摩羯', '♑']];
|
||||
function zodiacOf(y, m, d) {
|
||||
const t = Date.UTC(y, m - 1, d);
|
||||
let i = ZOD.length - 1; // 1/1~1/19 是摩羯
|
||||
for (let k = 0; k < ZOD.length; k++) if (t >= Date.UTC(y, ZOD[k][0] - 1, ZOD[k][1])) i = k;
|
||||
// 摩羯跨年:1 月里的摩羯从去年 12/22 起、到今年 1/20 止;12 月里的摩羯到明年 1/20 止
|
||||
const jan = i === 11 && m === 1, day = 864e5;
|
||||
const start = Date.UTC(jan ? y - 1 : y, ZOD[i][0] - 1, ZOD[i][1]);
|
||||
const nx = ZOD[(i + 1) % 12], nextStart = Date.UTC(i === 11 && !jan ? y + 1 : y, nx[0] - 1, nx[1]);
|
||||
const near = (t - start) / day < 2 ? (i + 11) % 12 : (nextStart - t) / day <= 2 ? (i + 1) % 12 : -1;
|
||||
return { main: ZOD[i], alt: near >= 0 ? ZOD[near] : null, prevAlt: near === (i + 11) % 12 };
|
||||
}
|
||||
const zEl = document.createElement('span');
|
||||
zEl.className = 'hero-zod'; zEl.setAttribute('aria-hidden', 'true');
|
||||
box.appendChild(zEl);
|
||||
function renderZod(d) {
|
||||
const due = d && !d.empty && !d.postpartum && d.due;
|
||||
if (!due) { zEl.classList.remove('is-on'); return; }
|
||||
const z = zodiacOf(due[0], due[1], due[2]);
|
||||
const pair = z.alt ? (z.prevAlt ? [z.alt, z.main] : [z.main, z.alt]) : [z.main];
|
||||
// 图标用自绘四角星:星座符号(♋ 之类)在部分安卓上没有字形,会显示成方框
|
||||
zEl.innerHTML = '<i><svg viewBox="0 0 12 12" width="8" height="8"><path d="M6 .6c.4 2.9 1.5 4 4.4 4.4v.1C7.5 5.5 6.4 6.6 6 9.4h-.1C5.5 6.6 4.4 5.5 1.6 5.1V5C4.4 4.6 5.5 3.5 5.9.6z" fill="currentColor"/></svg></i>' +
|
||||
'<b>' + pair.map(x => x[2]).join('·') + '宝宝</b>';
|
||||
zEl.classList.add('is-on');
|
||||
}
|
||||
function onPreg(d) { show(stageOf(force != null ? +force : (d && d.week))); renderZod(d); }
|
||||
addEventListener('mb-preg', e => onPreg(e.detail));
|
||||
if (force != null || window.__mbPreg) onPreg(window.__mbPreg);
|
||||
else setTimeout(() => { if (cur < 0) show(DEFAULT); }, 2500);
|
||||
|
||||
Reference in New Issue
Block a user