孕期计算器新增 10 个(孕周/产检时间表/增重范围/生育津贴/育儿补贴/个税/月子花费/身高/血型/出生后手续),共用 topic/_shared/calc.*,配转发图(v26110299)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-04 04:09:51 +00:00
parent bb4d84fb85
commit 75c418f453
36 changed files with 5913 additions and 33 deletions

BIN
assets/share/t/butie-js.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
assets/share/t/yuezi-js.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

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

View File

@@ -837,11 +837,11 @@ 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=26110298"></script>
<script src="data.js?v=26110298"></script>
<script src="feed.js?v=26110298"></script>
<script src="ceshi/meta.js?v=26110298"></script>
<script src="../js/share-card.js?v=26110298"></script>
<script src="topics.js?v=26110299"></script>
<script src="data.js?v=26110299"></script>
<script src="feed.js?v=26110299"></script>
<script src="ceshi/meta.js?v=26110299"></script>
<script src="../js/share-card.js?v=26110299"></script>
<script>
(function () {
'use strict';
@@ -907,7 +907,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=26110298').then(function (r) { return r.json(); }).then(function (j) {
fetch('cm.json?v=26110299').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) {

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=26110298"></script>
<script src="../topics.js?v=26110299"></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:26110298 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<!-- V:26110299 缓存版本标记:改 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=26110298">
<link rel="stylesheet" href="js/hero-cd.css?v=26110299">
<!-- 夜晚模式:首屏绘制前就按上次的选择加 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>
@@ -2590,17 +2590,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=26110298"></script>
<script src="guangchang/topics.js?v=26110299"></script>
<script src="js/app.js"></script>
<script src="js/hero-cd.js?v=26110298"></script>
<script src="js/kit.js?v=26110298"></script>
<script src="js/hero-cd.js?v=26110299"></script>
<script src="js/kit.js?v=26110299"></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=26110298';
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110299';
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;
@@ -2609,7 +2609,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=26110298'; bs.src = 'js/gch/brand.js?v=26110298';
bl.rel = 'stylesheet'; bl.href = 'js/gch/brand.css?v=26110299'; bs.src = 'js/gch/brand.js?v=26110299';
document.head.appendChild(bl); document.body.appendChild(bs);
}
})();
@@ -2620,7 +2620,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=26110298"></script>
<script src="js/coach.js?v=26110299"></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 = '26110298';
var VER = '26110299';
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=26110298'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110299'; 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=26110298';
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110299';
document.head.appendChild(l);
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110298';
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110299';
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 = '26110298';
var V = '26110299';
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');
@@ -30,7 +30,7 @@
var E = [
/* 11-04 用户:三个入口顺序改为 孕期百问 → 孕期计算器 → 趣味小测试 */
{ k: 'qa', n: '孕期百问', d: '孕妈最常问的问题,一次看明白', c: '100 个问题', img: 'kepu', u: '人看过' },
{ k: 'js', n: '孕期计算器', d: '花多少钱、休几天产假,算一算', c: '4 个计算器', img: 'jisuan', u: '人算过' },
{ k: 'js', n: '孕期计算器', d: '花多少钱、休几天产假,算一算', c: '14 个计算器', img: 'jisuan', u: '人算过' },
{ k: 'qz', n: '趣味小测试', d: '1 分钟测出你是哪种孕妈', c: '30 个测试', img: 'ceshi', u: '人测过' }
];
box.innerHTML = '<div class="kit-hd"><h2 class="kit-tt"><span>孕期百宝箱</span></h2><span>查一查 · 算一算 · 测一测</span></div><div class="kit-pn"><div class="kit-g">' +

View File

@@ -8,7 +8,7 @@
postMessage 不是实时投递,微信在分享那一刻才派发,所以每次换内容都要再报一次;子页面没引 jweixin,这里按需加载。 */
(function (g) {
'use strict';
var V = '26110298';
var V = '26110299';
var isWx = /MicroMessenger/i.test(navigator.userAgent || '');
var waiting = [], loading = false;
function ready(cb) {

View File

@@ -14,12 +14,19 @@ const KW2 = { ceshi: '哪种妈妈', wen: '妊娠纹', zhichang: '复工维权',
chigu: '耻骨痛', jiagong: '假性宫缩', taidongshao: '胎动变少', yangshui: '羊水', wutong: '无痛分娩', poshui: '破水', jianhongsheng: '见红待产', ruyuan: '入院证件',
kainai: '开奶', chusheng: '出生打针', duiyou: '队友类型', yali: '孕期压力', yinshi: '饮食打分', zhunbei: '准备几成', jisuan: '孕期计算器', 'yuchanqi-js': '预产期' };
const TAGC = { 身体: '#EE6A8C', 准备: '#6C78E6', 产检: '#3C8BE6', 宝宝: '#FF8F3F', 生活: '#2FAE84', 营养: '#4BAE5E', 职场: '#5B6FD8', 花钱: '#F0962A', 心情: '#E66B9A', 趣味: '#9A7FE0', 补剂: '#3C9BD8', 专题: '#22A3A0' };
// 11-04 新增 10 个计算器:[大字, 标题, 主色]
const NEWC = { 'yunzhou-js': ['孕几周了', '今天孕几周几天、孕几个月、宝宝像什么', '#E2668E'], 'chanjian-js': ['产检时间表', '每次产检哪天去、查什么,一张表排清楚', '#2F86C9'],
'zengzhong-js': ['胖多少合适', '按孕前身高体重,算孕期增重的合适范围', '#2E9C6A'], 'jintie-js': ['生育津贴', '产假期间能领多少钱?按缴费工资算一算', '#E0812A'],
'butie-js': ['育儿补贴', '每孩每年 3600 元领到 3 岁,你家能领多少', '#E25C5C'], 'geshui-js': ['个税省多少', '有 3 岁以下宝宝,每月多扣 2000,一年少交多少税', '#6C5BD6'],
'yuezi-js': ['月子花费', '月子中心、请月嫂、在家坐,各要花多少钱', '#C9658F'], 'shengao-js': ['宝宝多高', '按爸妈身高,推算宝宝长大后大概多高', '#1F9BA8'],
'xuexing-js': ['宝宝血型', '爸妈血型配一配,宝宝可能是什么血型', '#D9475A'], 'shouxu-js': ['出生后手续', '出生证、上户口、医保、社保卡,每件事截止哪天', '#4E7FD8'] };
const QUIZ_TOPIC = { ceshi: 1, duiyou: 1, yali: 1, yinshi: 1, zhunbei: 1 };
const CALC = { huafei: 1, jisuan: 1, 'yuchanqi-js': 1 };
const out = [];
const tt = d => (fs.readFileSync(R + 'topic/' + d + '/index.html', 'utf8').match(/<title>([^<]*)/) || [])[1] || '';
const dirs = fs.readdirSync(R + 'topic').filter(d => fs.existsSync(R + 'topic/' + d + '/index.html'));
dirs.forEach(d => {
if (NEWC[d]) { out.push({ k: 't/' + d, type: 'text', mod: '孕期计算器', c: NEWC[d][2], big: NEWC[d][0], title: NEWC[d][1], cta: '马上算一算', ic: 'calc' }); return; }
const h = hot.find(x => x.href === 'topic/' + d + '/');
const q = h ? h.q : tt(d).replace(/^测一测:/, '').replace(/\s*[·||].*$/, '');
const kw = (h && QA_KW[h.q]) || KW2[d];

File diff suppressed because it is too large Load Diff

85
topic/_shared/calc.css Normal file
View File

@@ -0,0 +1,85 @@
/* 孕期计算器共用样式(11-04 新增 10 个计算器共用;预产期计算器 yuchanqi-js 是同款,自带一份没改)。
页面在 :root 里改 --c / --cbg / --c2 换主题色。 */
:root{--c:#E25C7A;--c2:#FF8FA8;--cbg:#FFEEF2;--h:#1F2329;--t:#4E5969;--m:#86909C;--line:#F1E9EB}
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
html,body{height:100%;overflow:hidden;background:#fff;color:var(--t);font:15px/1.7 -apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif}
#scroll{position:fixed;inset:0;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;overscroll-behavior:none;padding-bottom:calc(28px + env(safe-area-inset-bottom))}
button,input,select{font:inherit;border:0;background:none;color:inherit}
button{cursor:pointer}
.num{font-variant-numeric:tabular-nums}
.bar{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:4px;height:48px;padding:0 8px;padding-top:env(safe-area-inset-top);border-bottom:1px solid transparent;transition:background .2s,border-color .2s}
.bar.on{background:#fff;border-bottom-color:var(--line)}
.bar .back{width:36px;height:36px;border-radius:50%;display:grid;place-items:center;color:var(--h)}
.bar .back svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.bar .t{font-size:15px;font-weight:700;color:var(--h)}
.hd{margin-top:-48px;padding:60px 20px 6px;background:linear-gradient(180deg,var(--cbg),#fff)}
.hd p{font-size:12.5px;font-weight:700;color:var(--c);letter-spacing:1px}
.hd h1{margin-top:4px;font-size:25px;font-weight:900;line-height:1.3;color:var(--h)}
.hd span{display:block;margin-top:4px;font-size:14px;color:var(--m)}
.calc{margin:12px 16px 0;padding:16px;border-radius:20px;background:#fff;box-shadow:0 10px 30px -18px var(--c);border:1px solid var(--line)}
.res{padding:16px;border-radius:16px;background:linear-gradient(135deg,var(--c2),var(--c));color:#fff}
.res .empty{padding:14px 0;text-align:center;font-size:14px;opacity:.9}
.res small{font-size:12.5px;opacity:.92}
.res .big{display:block;margin-top:2px;font-size:30px;font-weight:900;line-height:1.25}
.res .big u{text-decoration:none;font-size:16px;font-weight:700;margin-left:3px}
.res .row{display:flex;gap:10px;margin-top:12px}
.res .row div{flex:1;min-width:0;padding:8px 10px;border-radius:12px;background:rgba(255,255,255,.18)}
.res .row b{display:block;font-size:17px;font-weight:900;line-height:1.35}
.res .row div:nth-child(3) b{font-size:16px}
.res .pg{position:relative;height:6px;margin-top:12px;border-radius:99px;background:rgba(255,255,255,.3);overflow:hidden}
.res .pg i{position:absolute;left:0;top:0;bottom:0;border-radius:99px;background:#fff}
.res .note{display:block;margin-top:8px;font-size:12.5px;line-height:1.6;opacity:.95}
.tabs{display:flex;gap:6px;margin-top:16px;padding:4px;border-radius:12px;background:#F6F3F4}
.tabs button{flex:1;height:34px;border-radius:9px;font-size:14px;font-weight:700;color:var(--m)}
.tabs button.on{background:#fff;color:var(--c);box-shadow:0 2px 6px rgba(0,0,0,.08)}
.fld{margin-top:14px}
.lb{display:block;font-size:13.5px;font-weight:700;color:var(--h)}
.lb small{margin-left:6px;font-weight:400;color:var(--m)}
.in{display:block;width:100%;height:46px;margin-top:6px;padding:0 14px;border-radius:12px;background:#F7F5F6;font-size:16px;color:var(--h)}
.inw{position:relative}
.inw .in{padding-right:52px}
.inw em{position:absolute;right:14px;top:50%;margin-top:3px;transform:translateY(-50%);font-style:normal;font-size:14px;color:var(--m)}
.two{display:flex;gap:10px}.two>*{flex:1;min-width:0}
.stp{display:flex;align-items:center;gap:10px;margin-top:6px}
.stp button{width:42px;height:42px;border-radius:12px;background:#F7F5F6;font-size:20px;font-weight:700;color:var(--c)}
.stp b{flex:1;text-align:center;font-size:18px;color:var(--h)}
.seg{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px}
.seg button{flex:1;min-width:calc(33% - 6px);height:42px;padding:0 6px;border-radius:12px;background:#F7F5F6;font-size:14px;font-weight:700;color:var(--t);white-space:nowrap}
.seg.s2 button{min-width:calc(50% - 4px)}.seg.s4 button{min-width:calc(25% - 6px)}
.seg button.on{background:var(--cbg);color:var(--c);box-shadow:inset 0 0 0 1.5px var(--c)}
.hint{display:block;margin-top:5px;font-size:12px;color:var(--m);line-height:1.55}
.hide{display:none!important}
.sec{margin:26px 20px 0}
.sec h2{font-size:18px;font-weight:900;color:var(--h)}
.sec .lead{margin-top:2px;font-size:13px;color:var(--m)}
.tl{list-style:none;margin-top:12px}
.tl li{position:relative;display:flex;gap:12px;padding:0 0 16px 0}
.tl li::before{content:"";position:absolute;left:7px;top:18px;bottom:0;width:2px;background:var(--line)}
.tl li:last-child::before{display:none}
.tl .d{flex:none;width:16px;height:16px;margin-top:3px;border-radius:50%;border:3px solid var(--cbg);background:#fff;box-shadow:inset 0 0 0 1px var(--line)}
.tl li.done .d{border-color:var(--c);background:var(--c);box-shadow:none}
.tl li.now .d{border-color:var(--c);box-shadow:0 0 0 4px var(--cbg)}
.tl li.done .m{opacity:.6}
.tl .m{flex:1;min-width:0}
.tl .m b{font-size:15px;color:var(--h)}
.tl .m b em{margin-left:6px;padding:0 6px;border-radius:99px;background:var(--cbg);color:var(--c);font-size:11px;font-style:normal;font-weight:800;white-space:nowrap}
.tl .m span{display:block;font-size:13px;color:var(--m)}
.tl .m span i{font-style:normal;font-weight:700;color:var(--t)}
.cards{display:flex;flex-direction:column;gap:10px;margin-top:12px}
.cd{position:relative;padding:14px;border-radius:16px;background:#FAF8F9;border:1px solid var(--line)}
.cd.best{background:var(--cbg);border-color:var(--c)}
.cd .k{display:flex;align-items:baseline;justify-content:space-between;gap:8px}
.cd .k b{font-size:15.5px;color:var(--h)}
.cd .k strong{font-size:19px;font-weight:900;color:var(--c);white-space:nowrap}
.cd p{margin-top:4px;font-size:13px;color:var(--t);line-height:1.6}
.cd small{display:block;margin-top:4px;font-size:12px;color:var(--m)}
.cd .tg{position:absolute;right:12px;top:-9px;padding:0 8px;border-radius:99px;background:var(--c);color:#fff;font-size:11px;font-weight:800;line-height:18px}
.tbl{width:100%;margin-top:12px;border-collapse:collapse;font-size:13.5px}
.tbl th,.tbl td{padding:9px 6px;border-bottom:1px solid var(--line);text-align:left}
.tbl th{font-size:12.5px;color:var(--m);font-weight:700}
.tbl td b{color:var(--h)}
.tbl tr.on td{background:var(--cbg)}
.tbl tr.on td:first-child{box-shadow:inset 3px 0 0 var(--c)}
.tip{margin:18px 20px 0;padding:12px 14px;border-radius:14px;background:#FAF7F5;font-size:13px;line-height:1.7;color:var(--t)}
.tip b{color:var(--h)}
.foot{margin:14px 20px 0;font-size:12px;color:var(--m);text-align:center;line-height:1.6}

54
topic/_shared/calc.js Normal file
View File

@@ -0,0 +1,54 @@
/* 孕期计算器共用小工具(11-04 新增 10 个计算器用):返回 / 顶栏 / 禁回弹 / 北京时间日期 / 记住上次填的值。
页面:<script src="../_shared/calc.js"></script> 之后用 window.CK。 */
(function (g) {
'use strict';
var $ = function (s) { return document.querySelector(s); };
var DAY = 864e5;
function today() { var n = new Date(Date.now() + 288e5); return Date.UTC(n.getUTCFullYear(), n.getUTCMonth(), n.getUTCDate()); }
function parse(v) { var m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(v || ''); return m ? Date.UTC(+m[1], m[2] - 1, +m[3]) : NaN; }
function fmt(t) { var d = new Date(t); return d.getUTCFullYear() + '-' + ('0' + (d.getUTCMonth() + 1)).slice(-2) + '-' + ('0' + d.getUTCDate()).slice(-2); }
function cn(t, y) { var d = new Date(t); return (y ? d.getUTCFullYear() + ' 年 ' : '') + (d.getUTCMonth() + 1) + ' 月 ' + d.getUTCDate() + ' 日'; }
function wd(t) { return '周' + '日一二三四五六'.charAt(new Date(t).getUTCDay()); }
function addMonths(t, n) { var d = new Date(t), y = d.getUTCFullYear(), m = d.getUTCMonth() + n, day = d.getUTCDate(), last = new Date(Date.UTC(y, m + 1, 0)).getUTCDate(); return Date.UTC(y, m, Math.min(day, last)); }
function money(n) { n = Math.round(n); return n >= 1e4 ? (Math.round(n / 100) / 100).toFixed(n >= 1e5 ? 1 : 2).replace(/\.?0+$/, '') + ' 万' : n.toLocaleString('zh-CN'); }
function esc(s) { return String(s == null ? '' : s).replace(/[&<>"]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]; }); }
/* 本机记的孕期(首页同款键):{w 孕周, pp 产后};没有返回 null */
function preg() { try { var x = JSON.parse(localStorage.getItem('mmbox.gcwk.v1') || 'null'); return x && x.w ? x : null; } catch (e) { return null; } }
/* 预产期计算器填过的值 → 预产期时间戳(多个计算器共用,用户不用重复填) */
function savedDue() {
try {
var s = JSON.parse(localStorage.getItem('mmbox.edd.calc') || 'null'); if (!s) return NaN;
if (s.m === 'ivf') { var t = parse(s.tr); return isNaN(t) ? NaN : t + (+s.emb === 3 ? 263 : 261) * DAY; }
var l = parse(s.lmp); return isNaN(l) ? NaN : l + (280 + (+s.cy || 28) - 28) * DAY;
} catch (e) { return NaN; }
}
function store(key, def) {
var st = {}; Object.keys(def).forEach(function (k) { st[k] = def[k]; });
try { var sv = JSON.parse(localStorage.getItem(key) || 'null'); if (sv) Object.keys(def).forEach(function (k) { if (sv[k] != null) st[k] = sv[k]; }); } catch (e) {}
st.save = function () { var o = {}; Object.keys(def).forEach(function (k) { o[k] = st[k]; }); try { localStorage.setItem(key, JSON.stringify(o)); } catch (e) {} };
return st;
}
/* 分段按钮:<div class="seg" data-k="xx"><button data-v>…;点了写 st[k] 回调 */
function seg(el, st, k, cb) {
function ui() { [].forEach.call(el.children, function (b) { b.classList.toggle('on', String(b.dataset.v) === String(st[k])); }); }
el.addEventListener('click', function (e) { var b = e.target.closest('button'); if (!b) return; st[k] = isNaN(+b.dataset.v) || b.dataset.v === '' ? b.dataset.v : +b.dataset.v; ui(); cb(); });
ui(); return ui;
}
function shell() {
var sc = $('#scroll');
$('#back').addEventListener('click', function () {
if (document.referrer && document.referrer.indexOf(location.host) >= 0 && history.length > 1) history.back();
else location.href = '../jisuan/' + location.search + location.hash;
});
sc.addEventListener('scroll', function () { $('#bar').classList.toggle('on', sc.scrollTop > 8); }, { passive: true });
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
var y0 = 0;
sc.addEventListener('touchstart', function (e) { y0 = e.touches[0].clientY; }, { passive: true });
sc.addEventListener('touchmove', function (e) {
var dy = e.touches[0].clientY - y0;
if ((sc.scrollTop <= 0 && dy > 0) || (sc.scrollTop + sc.clientHeight >= sc.scrollHeight - 1 && dy < 0)) e.preventDefault();
}, { passive: false });
document.addEventListener('touchmove', function (e) { if (!sc.contains(e.target)) e.preventDefault(); }, { passive: false });
}
g.CK = { $: $, DAY: DAY, today: today, parse: parse, fmt: fmt, cn: cn, wd: wd, addMonths: addMonths, money: money, esc: esc, preg: preg, savedDue: savedDue, store: store, seg: seg, shell: shell };
})(window);

View File

@@ -57,7 +57,7 @@
'.tc-more{display:block;width:100%;margin-top:6px;height:40px;border:0;border-radius:99px;background:#F7F8FA;color:#4E5969;font-size:13px;font-weight:600}';
var SLUG = (location.pathname.match(/\/topic\/([^\/]+)\//) || [])[1] || '';
/* 11-04 微信转发图:每个专题一张 assets/share/t/<slug>.jpg(核心词大字 + logo),见 js/share-card.js */
if (SLUG) (function () { var s = document.createElement('script'); s.src = '../../js/share-card.js?v=26110298'; s.onload = function () { window.mbShare('../../assets/share/t/' + SLUG + '.jpg'); }; document.head.appendChild(s); })();
if (SLUG) (function () { var s = document.createElement('script'); s.src = '../../js/share-card.js?v=26110299'; s.onload = function () { window.mbShare('../../assets/share/t/' + SLUG + '.jpg'); }; document.head.appendChild(s); })();
var SK = 'mmbox.tp.v1', UK = (function () { var m = ((location.hash || '') + '&' + (location.search || '')).match(/[#?&]openid=([^&]*)/); return m ? decodeURIComponent(m[1]) : '_guest'; })();
function loadMe() { try { var a = JSON.parse(localStorage.getItem(SK) || '{}') || {}; var m = a[UK] || {}; m.cm = m.cm || {}; m.lk = m.lk || {}; return { a: a, m: m }; } catch (e) { return { a: {}, m: { cm: {}, lk: {} } }; } }
function saveMe(st) { try { st.a[UK] = st.m; localStorage.setItem(SK, JSON.stringify(st.a)); } catch (e) {} }
@@ -70,7 +70,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=26110298').then(function (idx) {
getJSON('../_shared/idx.json?v=26110299').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; });
@@ -177,7 +177,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=26110298').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
getJSON('../_shared/cm/' + SLUG + '.json?v=26110299').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
}
function extras(el) {

112
topic/butie-js/index.html Normal file
View File

@@ -0,0 +1,112 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>育儿补贴计算器</title>
<!-- 孕期计算器 · 育儿补贴计算器(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
依据:中办国办《育儿补贴制度实施方案》(2025 年 7 月):自 2025 年 1 月 1 日起,对 3 周岁以下婴幼儿发放育儿补贴,每孩每年 3600 元,按年发放,领到 3 周岁;
2025 年 1 月 1 日前出生、当时还不满 3 周岁的,按应补贴月数折算(每月 300 元)。补贴免个税,不计入低保等家庭收入。
月数按「自然月」数:从 max(出生月, 2025-01) 起,到满 3 周岁那个月之前为止(结果标「约」,以当地核定为准)。
最多填 3 个孩子;还没出生的填预产期先算。地方另有加码的(如部分城市每孩另发)不在这里算。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#E25C5C;--c2:#FF9A8A;--cbg:#FFEFED}.kid{position:relative;margin-top:12px;padding:12px;border-radius:14px;background:#FAF7F8}.kid .lb{display:flex;justify-content:space-between}.kid .rm{font-size:12.5px;font-weight:700;color:var(--m)}.add{display:block;width:100%;height:42px;margin-top:12px;border-radius:12px;border:1.5px dashed var(--c);color:var(--c);font-size:14px;font-weight:800}.kid .seg{margin-top:8px}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>育儿补贴计算器</h1><span>国家每孩每年 3600 元,领到 3 岁,算算你家能领多少</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">填宝宝的出生日期,马上算出来</div></div>
<div id="kids"></div>
<button type="button" class="add" id="add">+ 再加一个孩子</button>
</section>
<section class="sec hide" id="sDet">
<h2>每个孩子能领多少</h2>
<p class="lead">每孩每年 3600 元,按年申领,领到 3 周岁</p>
<ol class="tl" id="tl"></ol>
</section>
<section class="sec">
<h2>怎么领</h2>
<ol class="tl">
<li><i class="d"></i><div class="m"><b>先给宝宝上户口</b><span>申领要用宝宝的身份信息,户口落好再申请。</span></div></li>
<li><i class="d"></i><div class="m"><b>线上申请</b><span>一般由爸爸或妈妈在支付宝、微信的「育儿补贴」入口,或当地政务服务平台提交,具体看当地通知。</span></div></li>
<li><i class="d"></i><div class="m"><b>审核后发放</b><span>审核通过后打到申请人的银行卡(社保卡),按年发放。</span></div></li>
</ol>
</section>
<div class="tip"><b>地方可能另有补贴:</b>部分城市在国家 3600 元之外还另发生育补贴、育儿补贴,问一下当地卫健部门或看政务平台。</div>
<p class="foot">依据《育儿补贴制度实施方案》(2025)估算,月数折算以当地核定为准。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var DAY = C.DAY, T = C.today(), S = Date.UTC(2025, 0, 1);
var st = C.store('mmbox.calc.butie', { k: [{ d: '', b: 1 }] });
if (!st.k.length) st.k = [{ d: '', b: 1 }];
if (st.k.length === 1 && !st.k[0].d) { var sd = C.savedDue(); if (!isNaN(sd) && sd > T) st.k[0] = { d: C.fmt(sd), b: 0 }; }
function draw() {
$('#kids').innerHTML = st.k.map(function (k, i) {
return '<div class="kid" data-i="' + i + '"><span class="lb">第 ' + (i + 1) + ' 个孩子' + (st.k.length > 1 ? '<button type="button" class="rm">删除</button>' : '') + '</span>' +
'<div class="seg s2"><button type="button" data-b="1"' + (k.b ? ' class="on"' : '') + '>已出生</button><button type="button" data-b="0"' + (!k.b ? ' class="on"' : '') + '>还没出生</button></div>' +
'<input class="in num" type="date" value="' + C.esc(k.d) + '" aria-label="' + (k.b ? '出生日期' : '预产期') + '"><span class="hint">' + (k.b ? '填出生日期' : '填预产期,先估一个数') + '</span></div>';
}).join('');
$('#add').classList.toggle('hide', st.k.length >= 3);
}
function months(b) { /* 应补贴的自然月数 */
var e = C.addMonths(b, 36), s = Math.max(b, S);
if (e <= S) return 0;
var d0 = new Date(s), d1 = new Date(e);
return Math.max(0, (d1.getUTCFullYear() - d0.getUTCFullYear()) * 12 + d1.getUTCMonth() - d0.getUTCMonth());
}
function paint() {
st.save();
var R = $('#res'), tot = 0, got = 0, n = 0, h = '';
st.k.forEach(function (k, i) {
var b = C.parse(k.d); if (isNaN(b)) return;
n++;
var m = months(b), amt = m * 300, e = C.addMonths(b, 36);
tot += amt;
var y = [0, 1, 2].map(function (j) {
var a = Math.max(C.addMonths(b, 12 * j), S), z = C.addMonths(b, 12 * j + 12);
if (z <= S) return null;
var d0 = new Date(a), d1 = new Date(z), mm = (d1.getUTCFullYear() - d0.getUTCFullYear()) * 12 + d1.getUTCMonth() - d0.getUTCMonth();
if (T >= a) got += mm * 300;
return (j === 0 ? '出生~1 岁' : j + '~' + (j + 1) + ' 岁') + ' <i class="num">' + mm * 300 + ' 元</i>' + (T >= z ? '(这一年已过)' : T >= a ? '(正在这一年)' : '');
}).filter(Boolean);
h += '<li class="' + (T >= e ? 'done' : T >= b ? 'now' : '') + '"><i class="d"></i><div class="m"><b>第 ' + (i + 1) + ' 个孩子 · ' + (m ? '约 ' + amt.toLocaleString() + ' 元' : '领不到') + '</b>' +
'<span>' + (k.b ? '出生' : '预产期') + ' <i class="num">' + C.cn(b, 1) + '</i>,满 3 周岁 <i class="num">' + C.cn(e, 1) + '</i></span>' +
(m ? '<span>可领 ' + m + ' 个月' + (b < S ? '(2025 年前出生,从 2025 年 1 月起算)' : '') + ':' + y.join(';') + '</span>' : '<span>2025 年 1 月 1 日时已满 3 周岁,不在补贴范围</span>') + '</div></li>';
});
$('#sDet').classList.toggle('hide', !n);
$('#tl').innerHTML = h;
if (!n) { R.innerHTML = '<div class="empty">填宝宝的出生日期,马上算出来</div>'; return; }
R.innerHTML = '<small>' + (n > 1 ? n + ' 个孩子' : '这个孩子') + '一共能领约</small><b class="big num">' + tot.toLocaleString() + '<u>元</u></b>' +
'<div class="row"><div><small>每孩每年</small><b class="num">3600 元</b></div><div><small>到今天已可申领</small><b class="num">' + got.toLocaleString() + ' 元</b></div></div>' +
'<span class="note">补贴免个税,按年申领;地方加码另算。</span>';
}
$('#kids').addEventListener('click', function (e) {
var w = e.target.closest('.kid'); if (!w) return; var i = +w.dataset.i;
if (e.target.closest('.rm')) { st.k.splice(i, 1); draw(); paint(); return; }
var b = e.target.closest('[data-b]'); if (b) { st.k[i].b = +b.dataset.b; draw(); paint(); }
});
$('#kids').addEventListener('change', function (e) { var w = e.target.closest('.kid'); if (!w || e.target.type !== 'date') return; st.k[+w.dataset.i].d = e.target.value; paint(); });
$('#add').addEventListener('click', function () { st.k.push({ d: '', b: 1 }); draw(); paint(); });
draw(); paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/butie-js.jpg', '育儿补贴:每孩每年 3600 元,你家能领多少'); /* 11-04 微信转发图 */</script>
</body>
</html>

View File

@@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>产检时间表</title>
<!-- 孕期计算器 · 产检时间表(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
产检时间按《孕前和孕期保健指南(2018)》(中华医学会妇产科学分会)的 7~11 次常规产检孕周窗口,换算成日期;
每次「查什么」只列常规项目,具体以产检医院安排为准。做完可以打勾(记在本机 mmbox.calc.chanjian)。
预产期优先用预产期计算器填过的值。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#2F86C9;--c2:#6CB6F0;--cbg:#EAF5FF}.tl .ck{flex:none;align-self:flex-start;height:28px;padding:0 10px;margin-top:1px;border-radius:99px;background:#F4F6F8;color:var(--m);font-size:12px;font-weight:800}.tl li.ok .ck{background:var(--c);color:#fff}.tl li.ok .m{opacity:.55}.tl li.ok .d{border-color:var(--c);background:var(--c);box-shadow:none}.tl .m span.it{margin-top:3px;color:var(--t)}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>产检时间表</h1><span>按预产期排好每一次产检:哪天去、查什么,做完打个勾</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">填好预产期,马上排出时间表</div></div>
<div class="tabs" id="tabs"><button type="button" data-v="due">按预产期</button><button type="button" data-v="lmp">按末次月经</button></div>
<div class="fld" id="fDue"><label class="lb" for="cDue">预产期</label><input class="in num" type="date" id="cDue"></div>
<div class="fld hide" id="fLmp"><label class="lb" for="cLmp">末次月经第一天<small>按 28 天周期算</small></label><input class="in num" type="date" id="cLmp"></div>
</section>
<section class="sec hide" id="sPlan">
<h2>我的产检时间表</h2>
<p class="lead">28 周前约 4 周一次,28~36 周两周一次,36 周后每周一次</p>
<ol class="tl" id="tl"></ol>
</section>
<div class="tip"><b>要空腹的几次:</b>第一次建档抽血、糖耐(OGTT)一般要空腹,前一晚 10 点后别吃东西;具体看医院通知。<br><b>错过不能补的:</b>NT(11~13+6 周)、大排畸(20~24 周)、糖耐(24~28 周)都有时间窗口,提前预约。</div>
<p class="foot">按《孕前和孕期保健指南(2018)》常规时间排,具体项目和时间以产检医院安排为准。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var DAY = C.DAY, T = C.today();
var st = C.store('mmbox.calc.chanjian', { m: 'due', due: '', lmp: '', ok: {} });
if (!st.due && !st.lmp) { var sd = C.savedDue(); if (!isNaN(sd)) st.due = C.fmt(sd); }
$('#cDue').min = C.fmt(T - 60 * DAY); $('#cDue').max = C.fmt(T + 300 * DAY);
$('#cLmp').max = C.fmt(T); $('#cLmp').min = C.fmt(T - 300 * DAY);
/* [名称, 起始周, 结束周(含), 查什么, 要点] */
var V = [
['第 1 次 · 建档', 6, 13.86, '问诊建档、血常规、尿常规、血型(ABO + Rh)、肝肾功能、血糖、乙肝 / 梅毒 / 艾滋病筛查、甲状腺功能、早孕 B 超', '确认宫内孕和胎心,拿孕妇手册;抽血要空腹'],
['NT 检查', 11, 13.86, 'B 超测胎儿颈后透明层厚度,可同时做早唐', '错过就不能补,提前预约'],
['第 2 次 · 唐筛 / 无创', 14, 19.86, '中唐(15~20+6 周)或无创 DNA(12~22+6 周),血常规、尿常规、听胎心', '高龄或高风险的医生会建议羊水穿刺'],
['第 3 次 · 大排畸', 20, 24, '系统超声看宝宝结构,血常规、尿常规', '宝宝不配合可能要多照几次'],
['第 4 次 · 糖耐', 24, 28, '75 克葡萄糖耐量试验(空腹 + 喝糖水后 1 小时、2 小时抽血)、血常规、尿常规', '前一晚 10 点后禁食'],
['第 5 次', 29, 32, '产科 B 超(胎位、胎儿大小、羊水)、血常规、尿常规、听胎心', '开始两周一次'],
['第 6 次', 33, 34.86, '血常规、尿常规、听胎心、宫高腹围', '可以开始准备待产包'],
['第 7 次 · B 族链球菌', 35, 36.86, 'GBS 筛查(35~37 周)、胎心监护(34 周起)、肝功能、血常规', '确定生产医院和方式'],
['第 8 次', 37, 37.86, '胎心监护、B 超(胎位、羊水、估重)、宫颈评估', '之后每周一次'],
['第 9 次', 38, 38.86, '胎心监护、听胎心、宫高腹围', ''],
['第 10 次', 39, 39.86, '胎心监护、B 超看羊水', ''],
['第 11 次', 40, 40.86, '胎心监护、B 超、宫颈评估,过了 41 周医生一般安排住院催产', '']
];
var tabUi = C.seg($('#tabs'), st, 'm', function () { ui(); paint(); });
function ui() { $('#fDue').classList.toggle('hide', st.m !== 'due'); $('#fLmp').classList.toggle('hide', st.m !== 'lmp'); $('#cDue').value = st.due; $('#cLmp').value = st.lmp; }
function start() { var d; if (st.m === 'due') { d = C.parse(st.due); return isNaN(d) ? NaN : d - 280 * DAY; } d = C.parse(st.lmp); return d; }
function range(a, b) { return a === b ? C.cn(a) : C.cn(a) + ' ~ ' + C.cn(b); }
function paint() {
st.save();
var s0 = start(), R = $('#res');
$('#sPlan').classList.toggle('hide', isNaN(s0));
if (isNaN(s0)) { R.innerHTML = '<div class="empty">填好预产期,马上排出时间表</div>'; return; }
var nx = null, done = 0;
var h = V.map(function (v, i) {
var a = s0 + Math.round(v[1] * 7) * DAY, b = s0 + Math.round(v[2] * 7) * DAY, ok = !!st.ok[i], now = T >= a && T <= b, past = T > b;
if (ok) done++;
if (!ok && !past && !nx) nx = { v: v, a: a, b: b, now: now };
return '<li class="' + (ok ? 'ok' : now ? 'now' : past ? 'done' : '') + '"><i class="d"></i><div class="m"><b>' + v[0] + (now && !ok ? '<em>就是现在</em>' : '') + '</b>' +
'<span><i class="num">' + range(a, b) + '</i> · 孕 ' + Math.floor(v[1]) + '~' + Math.floor(v[2]) + (v[2] % 1 ? '+6' : '') + ' 周</span><span class="it">' + v[3] + '</span>' + (v[4] ? '<span>' + v[4] + '</span>' : '') + '</div>' +
'<button type="button" class="ck" data-i="' + i + '">' + (ok ? '已做 ✓' : '做完了') + '</button></li>';
}).join('');
$('#tl').innerHTML = h;
R.innerHTML = nx ? '<small>' + (nx.now ? '这次产检就是现在' : '下一次产检') + '</small><b class="big">' + nx.v[0].replace(/^第 \d+ 次 · /, '') + '</b>' +
'<div class="row"><div><small>建议时间</small><b class="num" style="font-size:15px">' + range(nx.a, nx.b) + '</b></div><div><small>' + (nx.now ? '窗口还剩' : '还有') + '</small><b class="num">' + Math.max(0, Math.round(((nx.now ? nx.b : nx.a) - T) / DAY)) + ' 天</b></div></div>' +
'<div class="pg"><i style="width:' + (done / V.length * 100).toFixed(1) + '%"></i></div><span class="note">已打勾 ' + done + ' / ' + V.length + ' 次</span>'
: '<small>产检都排完啦</small><b class="big">准备迎接宝宝</b><span class="note">已打勾 ' + done + ' / ' + V.length + ' 次</span>';
}
$('#tl').addEventListener('click', function (e) { var b = e.target.closest('.ck'); if (!b) return; var i = b.dataset.i; if (st.ok[i]) delete st.ok[i]; else st.ok[i] = 1; paint(); });
$('#cDue').addEventListener('change', function () { st.due = this.value; paint(); });
$('#cLmp').addEventListener('change', function () { st.lmp = this.value; paint(); });
tabUi(); ui(); paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/chanjian-js.jpg', '产检时间表:每次产检哪天去、查什么'); /* 11-04 微信转发图 */</script>
</body>
</html>

View File

@@ -0,0 +1,87 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>个税省多少</title>
<!-- 孕期计算器 · 个税省多少(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
依据:国务院 2023 年 8 月《关于提高个人所得税有关专项附加扣除标准的通知》:3 岁以下婴幼儿照护每孩每月 2000 元(2023-01-01 起),
父母可各扣 50%,或一方扣 100%;宝宝出生当月起可扣,满 3 岁后接着扣子女教育(同为 2000 元)。
计算:综合所得年度税表(3%~45%,年减除 6 万);应纳税所得 = 12 ×(月薪 − 个人五险一金 − 其他专项附加)− 60000,
省的税 = 不扣宝宝那项的税 − 扣了之后的税。不含年终奖单独计税、劳务报酬等,结果为估算。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#6C5BD6;--c2:#A595F2;--cbg:#F1EEFF}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>个税省多少</h1><span>3 岁以下宝宝每月可扣 2000 元,算算一年少交多少税</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">填好月薪,马上算出一年省多少</div></div>
<div class="fld"><label class="lb" for="cSal">税前月薪</label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cSal" placeholder="比如 15000"><em>元/月</em></div></div>
<div class="fld"><label class="lb" for="cSi">每月个人交的五险一金<small>工资条上「个人社保 + 公积金」</small></label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cSi" placeholder="不填按月薪 × 22.5% 估"><em>元/月</em></div></div>
<div class="fld"><label class="lb" for="cOt">已经在扣的其他专项附加<small>房贷、房租、赡养老人、继续教育等</small></label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cOt" placeholder="0"><em>元/月</em></div></div>
<div class="fld"><span class="lb">3 岁以下的宝宝</span><div class="seg" id="cN"><button type="button" data-v="1">1 个</button><button type="button" data-v="2">2 个</button><button type="button" data-v="3">3 个</button></div></div>
<div class="fld"><span class="lb">这一项你扣多少</span><div class="seg s2" id="cR"><button type="button" data-v="100">我一个人扣 100%</button><button type="button" data-v="50">夫妻各扣 50%</button></div>
<span class="hint">一般谁工资高、税率高,谁扣 100% 更省;一个纳税年度内不能改</span></div>
</section>
<section class="sec">
<h2>综合所得税率表</h2>
<p class="lead">按全年应纳税所得额(年收入 − 6 万 − 五险一金 − 专项附加扣除)</p>
<table class="tbl" id="tbl"><thead><tr><th>全年应纳税所得额</th><th>税率</th></tr></thead><tbody></tbody></table>
</section>
<section class="sec">
<h2>怎么填报</h2>
<ol class="tl">
<li><i class="d"></i><div class="m"><b>打开「个人所得税」App</b><span>首页「专项附加扣除填报」→「3 岁以下婴幼儿照护」。</span></div></li>
<li><i class="d"></i><div class="m"><b>填宝宝信息</b><span>有出生证明或身份证号就能填,扣除从出生当月开始。</span></div></li>
<li><i class="d"></i><div class="m"><b>选扣除方式</b><span>选「通过扣缴义务人申报」,从下个月工资里就开始少扣税;漏填的第二年汇算时还能补。</span></div></li>
</ol>
</section>
<p class="foot">按现行个税政策估算,未含年终奖单独计税等情况,以个税 App 实际计算为准。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var B = [[36000, .03, 0], [144000, .10, 2520], [300000, .20, 16920], [420000, .25, 31920], [660000, .30, 52920], [960000, .35, 85920], [Infinity, .45, 181920]];
function tax(x) { if (x <= 0) return 0; for (var i = 0; i < B.length; i++) if (x <= B[i][0]) return x * B[i][1] - B[i][2]; return 0; }
function rate(x) { for (var i = 0; i < B.length; i++) if (x <= B[i][0]) return i; return B.length - 1; }
var st = C.store('mmbox.calc.geshui', { sal: '', si: '', ot: '', n: 1, r: 100 });
['sal', 'si', 'ot'].forEach(function (k) { var el = $('#c' + k.charAt(0).toUpperCase() + k.slice(1)); el.value = st[k]; el.addEventListener('input', function () { st[k] = el.value; paint(); }); });
C.seg($('#cN'), st, 'n', paint); C.seg($('#cR'), st, 'r', paint);
function w(n) { return n >= 1e4 ? n / 1e4 + ' 万' : n.toLocaleString(); }
function paint() {
st.save();
var sal = +st.sal, R = $('#res'), on = -1, x0 = 0;
if (sal >= 1000 && sal <= 2e6) {
var si = st.si === '' ? sal * .225 : +st.si, ot = +st.ot || 0, ded = 2000 * st.n * st.r / 100;
x0 = 12 * (sal - si - ot) - 60000;
var x1 = x0 - 12 * ded, t0 = tax(x0), t1 = tax(x1), sv = t0 - t1;
on = rate(Math.max(0, x0));
R.innerHTML = '<small>有宝宝这一项,一年少交个税约</small><b class="big num">' + Math.round(sv).toLocaleString() + '<u>元</u></b>' +
'<div class="row"><div><small>平均每月</small><b class="num">' + Math.round(sv / 12).toLocaleString() + ' 元</b></div><div><small>每月可扣</small><b class="num">' + ded.toLocaleString() + ' 元</b></div><div><small>你的税率</small><b class="num">' + Math.round(B[on][1] * 100) + '%</b></div></div>' +
'<span class="note">' + (x0 <= 0 ? '你现在的收入扣完基本不用交个税,这一项暂时省不了钱,但记得照样填上。' : x1 < 0 ? '扣完这一项,一年的个税基本都免了。' : '一年个税从 ' + Math.round(t0).toLocaleString() + ' 元降到 ' + Math.round(t1).toLocaleString() + ' 元。') +
(+st.r === 50 ? '另一半由另一方扣,对方也能省。' : '') + (st.si === '' ? '(五险一金按月薪 22.5% 估的,填实际数更准)' : '') + '</span>';
} else R.innerHTML = '<div class="empty">' + (st.sal ? '月薪填每月多少元,再核对一下' : '填好月薪,马上算出一年省多少') + '</div>';
var lo = 0;
$('#tbl tbody').innerHTML = B.map(function (b, i) { var s = '<tr' + (i === on && x0 > 0 ? ' class="on"' : '') + '><td class="num">' + (b[0] === Infinity ? '超过 ' + w(lo) : (lo ? w(lo) + ' ~ ' : '不超过 ') + w(b[0])) + '</td><td class="num"><b>' + Math.round(b[1] * 100) + '%</b></td></tr>'; lo = b[0]; return s; }).join('');
}
paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/geshui-js.jpg', '个税省多少:有宝宝一年能少交多少税'); /* 11-04 微信转发图 */</script>
</body>
</html>

View File

@@ -0,0 +1,91 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>生育津贴计算器</title>
<!-- 孕期计算器 · 生育津贴计算器(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
公式(《社会保险法》第 56 条、《女职工劳动保护特别规定》第 8 条):生育津贴 = 用人单位上年度职工月平均工资 ÷ 30 × 产假天数。
产假天数 = 国家 98 天 + 难产 15 天 + 每多 1 个宝宝 15 天 + 本省延长天数(省份表与产假计算器 topic/zhichang 同一张,2026-11 核对,政策变了两处一起改)。
本省延长的天数是否由生育保险基金支付各地不一样,结果同时给出「按国家 98 天起」和「按本省合计」两个数。
津贴低于本人工资的,多数省份规定由单位补足差额 —— 填了本人月工资就算出差额。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#E0812A;--c2:#FFB067;--cbg:#FFF3E6}select.in{appearance:none;-webkit-appearance:none;background-image:linear-gradient(45deg,transparent 50%,#999 50%),linear-gradient(135deg,#999 50%,transparent 50%);background-position:calc(100% - 20px) 50%,calc(100% - 15px) 50%;background-size:5px 5px;background-repeat:no-repeat}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>生育津贴计算器</h1><span>产假期间能领多少钱,按单位缴费工资和产假天数算一算</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">填好单位月平均工资,马上算出来</div></div>
<div class="fld"><label class="lb" for="cAvg">单位上年度职工月平均工资<small>也就是单位给你交生育保险的基数</small></label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cAvg" placeholder="比如 8000"><em>元/月</em></div>
<span class="hint">不知道就问人事,或者先填自己的社保缴费基数(在社保 App / 个税 App 能查到),算个大概</span></div>
<div class="fld"><label class="lb" for="cProv">所在省份</label><select class="in" id="cProv"><option value="">选择省份,自动带出本省产假</option></select></div>
<div class="fld"><span class="lb">这是第几个宝宝</span><div class="seg" id="cPar"><button type="button" data-v="1">第一个</button><button type="button" data-v="2">第二个</button><button type="button" data-v="3">第三个及以上</button></div></div>
<div class="fld"><span class="lb">生产情况</span><div class="seg" id="cHard"><button type="button" data-v="0">顺产</button><button type="button" data-v="1">难产 / 剖宫产</button></div>
<span class="hint">剖宫产是否按难产算各地不一样,多数地方算</span></div>
<div class="fld"><span class="lb">怀了几个</span><div class="seg" id="cMul"><button type="button" data-v="1">一个</button><button type="button" data-v="2">双胞胎</button><button type="button" data-v="3">三胞胎</button></div></div>
<div class="fld"><label class="lb" for="cSal">我自己的月工资<small>选填,看单位要不要补差额</small></label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cSal" placeholder="税前"><em>元/月</em></div></div>
</section>
<section class="sec">
<h2>领之前确认这几件事</h2>
<ol class="tl">
<li><i class="d"></i><div class="m"><b>生育保险交够了吗</b><span>多数地方要求生产时正在参保,有的要连续交满 6~12 个月;断缴、刚换工作的先问当地医保局。</span></div></li>
<li><i class="d"></i><div class="m"><b>谁来申领</b><span>多数地方由单位网上申报,2025 年起越来越多地方直接打到本人社保卡;灵活就业人员能不能领看当地政策。</span></div></li>
<li><i class="d"></i><div class="m"><b>什么时候领</b><span>一般产后提交,常见要求在生产后 1 年内申领,过期可能领不到。</span></div></li>
<li><i class="d"></i><div class="m"><b>和工资的关系</b><span>产假期间领了津贴,单位一般不再发工资;津贴比工资低的,多数省份规定单位补足差额。</span></div></li>
</ol>
</section>
<div class="tip"><b>生育津贴 ≠ 生育医疗费:</b>产检、住院分娩的费用另外按生育保险报销,不在这个数里。</div>
<p class="foot">按《社会保险法》《女职工劳动保护特别规定》常用算法估算,实际以当地医保部门核定为准。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var PROV = [['北京', 158], ['天津', 158], ['河北', [158, 158, 188]], ['山西', 158], ['内蒙古', [158, 158, 188]], ['辽宁', 158], ['吉林', 180], ['黑龙江', 180],
['上海', 158], ['江苏', 158], ['浙江', [158, 188, 188]], ['安徽', 158], ['福建', 158, '福建条例是 158~180 天,由单位在这个范围内定,问下人事'], ['江西', 188], ['山东', 158],
['河南', 188], ['湖北', 158], ['湖南', 158], ['广东', 178], ['广西', [158, 168, 178]], ['海南', 188], ['重庆', 178, '经批准还可休育儿假到宝宝 1 岁'],
['四川', [188, 188, 188], '第三个宝宝经本人申请、单位同意,还能再加 30 天'], ['贵州', 158], ['云南', 158], ['西藏', 365], ['陕西', [158, 158, 173]], ['甘肃', 180], ['青海', 188], ['宁夏', 158], ['新疆', 158]];
var st = C.store('mmbox.calc.jintie', { avg: '', prov: '', par: 1, hard: 0, mul: 1, sal: '' });
try { var pk = (localStorage.getItem('mmbox.leave.prov') || '').split('|'); if (st.prov === '' && pk[0]) PROV.forEach(function (x, i) { if (x[0] === pk[0]) { st.prov = String(i); if (+pk[1]) st.par = +pk[1]; } }); } catch (e) {} /* 产假计算器选过省份就带过来 */
var sel = $('#cProv');
sel.innerHTML += PROV.map(function (x, i) { return '<option value="' + i + '">' + x[0] + '</option>'; }).join('');
sel.value = st.prov; $('#cAvg').value = st.avg; $('#cSal').value = st.sal;
sel.addEventListener('change', function () { st.prov = sel.value; paint(); });
$('#cAvg').addEventListener('input', function () { st.avg = this.value; paint(); });
$('#cSal').addEventListener('input', function () { st.sal = this.value; paint(); });
C.seg($('#cPar'), st, 'par', paint); C.seg($('#cHard'), st, 'hard', paint); C.seg($('#cMul'), st, 'mul', paint);
function paint() {
st.save();
var avg = +st.avg, R = $('#res');
var nat = 98 + (+st.hard ? 15 : 0) + (st.mul - 1) * 15, x = PROV[st.prov], loc = 0;
if (x) { var t = Array.isArray(x[1]) ? x[1][Math.min(3, st.par) - 1] : x[1]; loc = t - 98; }
if (!(avg >= 500 && avg <= 200000)) { R.innerHTML = '<div class="empty">' + (st.avg ? '月平均工资填每月多少元,再核对一下' : '填好单位月平均工资,马上算出来') + '</div>'; return; }
var day = avg / 30, all = nat + loc, a1 = day * nat, a2 = day * all;
var h = '<small>' + (x ? x[0] + ' · ' : '') + '产假 ' + all + ' 天,生育津贴约</small><b class="big num">' + C.money(x ? a2 : a1) + '<u>元</u></b>' +
'<div class="row"><div><small>每天</small><b class="num">' + Math.round(day) + ' 元</b></div><div><small>国家 ' + nat + ' 天</small><b class="num">' + C.money(a1) + '</b></div>' + (x ? '<div><small>本省 +' + loc + ' 天</small><b class="num">+' + C.money(day * loc) + '</b></div>' : '') + '</div>';
var sal = +st.sal;
if (sal > 0) {
var gap = (sal - avg) / 30 * all;
h += '<span class="note">' + (gap > 1 ? '津贴比你的工资每月少 ' + C.money(sal - avg) + ' 元,产假下来差 ' + C.money(gap) + ' 元,多数省份规定由单位补足。' : '津贴不比你的工资少,产假期间按津贴拿就行。') + '</span>';
} else h += '<span class="note">' + (x ? '本省延长的 ' + loc + ' 天由不由生育保险发,各地不一样,问一下当地医保局。' : '选了省份会把本省延长的产假也算上。') + '</span>';
R.innerHTML = h;
}
paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/jintie-js.jpg', '生育津贴计算器:产假期间能领多少钱'); /* 11-04 微信转发图 */</script>
</body>
</html>

View File

@@ -54,7 +54,7 @@ button{font:inherit;border:0;background:none;color:inherit;cursor:pointer}
<img src="../../assets/img/kit/jisuan.webp" alt="">
<small>算一算</small>
<h1>孕期计算器</h1>
<p>花多少钱、休几天产假、宝宝多重,算明白心里才有底</p>
<p>14 个计算器:花多少钱、能领多少补贴、产检哪天去,算明白心里才有底</p>
</section>
<div class="list" id="list"></div>
<div class="more">更多计算器陆续上线中</div>
@@ -74,13 +74,34 @@ button{font:inherit;border:0;background:none;color:inherit;cursor:pointer}
var SV = {
money: '<svg viewBox="0 0 24 24"><rect x="5" y="3" width="14" height="18" rx="3"/><path d="M8.5 7h7M8.5 11h1M12 11h1M15.5 11h0M8.5 14.5h1M12 14.5h1M8.5 18h1M12 18h1M15.5 14.5v3.5"/></svg>',
cal: '<svg viewBox="0 0 24 24"><rect x="3.5" y="5" width="17" height="15.5" rx="3"/><path d="M8 3v4M16 3v4M3.5 10h17M8 14h3M8 17h6"/></svg>',
due: '<svg viewBox="0 0 24 24"><rect x="3.5" y="5" width="17" height="15.5" rx="3"/><path d="M8 3v4M16 3v4M3.5 10h17"/><path d="M12 18.2s-3-1.8-3-3.7c0-1 .8-1.7 1.6-1.7.6 0 1.1.3 1.4.8.3-.5.8-.8 1.4-.8.8 0 1.6.7 1.6 1.7 0 1.9-3 3.7-3 3.7z"/></svg>'
due: '<svg viewBox="0 0 24 24"><rect x="3.5" y="5" width="17" height="15.5" rx="3"/><path d="M8 3v4M16 3v4M3.5 10h17"/><path d="M12 18.2s-3-1.8-3-3.7c0-1 .8-1.7 1.6-1.7.6 0 1.1.3 1.4.8.3-.5.8-.8 1.4-.8.8 0 1.6.7 1.6 1.7 0 1.9-3 3.7-3 3.7z"/></svg>',
wk: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="8.5"/><path d="M12 7v5l3.5 2"/></svg>',
chk: '<svg viewBox="0 0 24 24"><rect x="5" y="3.5" width="14" height="17.5" rx="2.5"/><path d="M9 3.5h6v3H9zM8.5 12l2 2 4-4M8.5 17.5h7"/></svg>',
wt: '<svg viewBox="0 0 24 24"><rect x="3.5" y="4" width="17" height="16.5" rx="4"/><path d="M8 10a4 4 0 018 0M12 10l1.8-2.2"/></svg>',
jt: '<svg viewBox="0 0 24 24"><rect x="3" y="6" width="18" height="13" rx="2.5"/><path d="M3 10h18M7 15h4"/></svg>',
bt: '<svg viewBox="0 0 24 24"><path d="M5 9h14v11H5zM3.5 6h17v3h-17zM12 6v14M12 6c-1.5-3.5-5.5-3-4 0M12 6c1.5-3.5 5.5-3 4 0"/></svg>',
tax: '<svg viewBox="0 0 24 24"><path d="M6 3.5h9l3.5 3.5v13.5H6z"/><path d="M9 11h6M9 15h6M14.5 3.5V7h4"/></svg>',
yz: '<svg viewBox="0 0 24 24"><path d="M3.5 10.5L12 4l8.5 6.5V20h-17z"/><path d="M12 17.5s-3-1.8-3-3.7c0-1 .8-1.7 1.6-1.7.6 0 1.1.3 1.4.8.3-.5.8-.8 1.4-.8.8 0 1.6.7 1.6 1.7 0 1.9-3 3.7-3 3.7z"/></svg>',
ht: '<svg viewBox="0 0 24 24"><path d="M6 3v18M6 5h3M6 9h2M6 13h3M6 17h2"/><circle cx="15" cy="7" r="2.5"/><path d="M15 9.5v6M12 21l3-5.5 3 5.5M12 12.5h6"/></svg>',
xx: '<svg viewBox="0 0 24 24"><path d="M12 3s-6.5 7.2-6.5 11.6a6.5 6.5 0 0013 0C18.5 10.2 12 3 12 3z"/><path d="M9.5 15.5a2.6 2.6 0 002.4 2.4"/></svg>',
sx: '<svg viewBox="0 0 24 24"><rect x="4" y="3.5" width="16" height="17" rx="2.5"/><path d="M8 8.5h8M8 12.5h8M8 16.5h5"/></svg>'
};
var L = [
{ n: '生娃花费计算器', tag: '最多人用', d: '产检、分娩、月子、宝宝第一年,一共要花多少钱', u: '../huafei/', heat: .118, c: '#F07A2E', bg: '#FFF0E4', ic: SV.money },
{ n: '产假天数计算器', d: '能休几天、哪天开始休、哪天回去上班', u: '../zhichang/', cm: 1, heat: .062, c: '#5B6CFF', bg: '#EEF0FF', ic: SV.cal },
{ n: '胎儿体重估算', d: '填 B 超上的几个数,估宝宝现在多重', u: '/taier-guzhong/', heat: .071, c: '#2E9B78', bg: '#E6F6F0', img: '/upload/picture/715333a69fb67d8812ab093f342fa00f.png', gate: 15 },
{ n: '预产期计算器', d: '填末次月经或移植日,算预产期、现在几周、产检哪天去', u: '../yuchanqi-js/', heat: .083, c: '#E25C7A', bg: '#FFECEF', ic: SV.due } /* 11-04 换掉「孕期增重」(那是记录工具) */
{ n: '预产期计算器', d: '填末次月经或移植日,算预产期、现在几周、产检哪天去', u: '../yuchanqi-js/', heat: .083, c: '#E25C7A', bg: '#FFECEF', ic: SV.due }, /* 11-04 换掉「孕期增重」(那是记录工具) */
/* 11-04 用户从 20 个备选里选了带星的 10 个(共用 ../_shared/calc.*),按「孕期 → 钱 → 生了以后 → 趣味」排 */
{ n: '孕周计算器', tag: '新', d: '今天孕几周几天、孕几个月、宝宝像什么', u: '../yunzhou-js/', heat: .076, c: '#E2668E', bg: '#FFEEF3', ic: SV.wk },
{ n: '产检时间表', tag: '新', d: '每次产检哪天去、查什么,做完打个勾', u: '../chanjian-js/', heat: .069, c: '#2F86C9', bg: '#EAF5FF', ic: SV.chk },
{ n: '孕期增重范围', tag: '新', d: '按孕前身高体重,算孕期胖多少合适', u: '../zengzhong-js/', heat: .058, c: '#2E9C6A', bg: '#E8F7EF', ic: SV.wt },
{ n: '生育津贴计算器', tag: '新', d: '产假期间能领多少钱,单位要不要补差额', u: '../jintie-js/', heat: .072, c: '#E0812A', bg: '#FFF3E6', ic: SV.jt },
{ n: '育儿补贴计算器', tag: '新', d: '每孩每年 3600 元领到 3 岁,你家能领多少', u: '../butie-js/', heat: .081, c: '#E25C5C', bg: '#FFEFED', ic: SV.bt },
{ n: '个税省多少', tag: '新', d: '3 岁以下宝宝每月扣 2000,一年少交多少税', u: '../geshui-js/', heat: .047, c: '#6C5BD6', bg: '#F1EEFF', ic: SV.tax },
{ n: '月子花费计算器', tag: '新', d: '月子中心、请月嫂、在家坐,各要花多少', u: '../yuezi-js/', heat: .064, c: '#C9658F', bg: '#FCEEF4', ic: SV.yz },
{ n: '出生后手续时间线', tag: '新', d: '出生证、上户口、医保、社保卡,每件截止哪天', u: '../shouxu-js/', heat: .043, c: '#4E7FD8', bg: '#EDF3FF', ic: SV.sx },
{ n: '宝宝身高预测', tag: '新', d: '按爸妈身高,推算宝宝长大后多高', u: '../shengao-js/', heat: .079, c: '#1F9BA8', bg: '#E6F7F8', ic: SV.ht },
{ n: '宝宝血型推算', tag: '新', d: '爸妈血型配一配,宝宝可能是什么型', u: '../xuexing-js/', heat: .066, c: '#D9475A', bg: '#FFEDEF', ic: SV.xx }
];
$('#list').innerHTML = L.map(function (x, i) {
var lk = x.gate && week && week < x.gate;
@@ -113,7 +134,7 @@ button{font:inherit;border:0;background:none;color:inherit;cursor:pointer}
document.addEventListener('touchmove', function (e) { if (!sc.contains(e.target)) e.preventDefault(); }, { passive: false });
})();
</script>
<script src="../../js/share-card.js?v=26110298"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/jisuan.jpg', '孕期计算器:生娃花费、预产期、产假天数,一算就知道'); /* 11-04 微信转发图 */</script>
</body>
</html>

View File

@@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>宝宝身高预测</title>
<!-- 孕期计算器 · 宝宝身高预测(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
遗传靶身高公式(中华医学会儿科学分会常用):男孩 =(父身高 + 母身高 + 13)÷ 2,女孩 =(父身高 + 母身高 − 13)÷ 2,误差约 ± 6.5 厘米。
对比用国家卫健委《中国居民营养与慢性病状况报告(2020 年)》18~44 岁平均身高:男 169.7 cm、女 158.0 cm。
身高约 70% 看遗传,营养、睡眠、运动影响剩下的部分 —— 结果只是参考范围。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#1F9BA8;--c2:#5FCBD3;--cbg:#E6F7F8}.sx{display:flex;gap:10px;margin-top:12px}.sx div{flex:1;padding:10px;border-radius:12px;background:rgba(255,255,255,.18)}.sx b{display:block;font-size:22px;font-weight:900;line-height:1.3}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>宝宝身高预测</h1><span>按爸妈身高,推算宝宝长大后大概多高</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">填好爸爸妈妈的身高,马上算出来</div></div>
<div class="fld two">
<div><label class="lb" for="cF">爸爸身高</label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cF" placeholder="175"><em>厘米</em></div></div>
<div><label class="lb" for="cM">妈妈身高</label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cM" placeholder="162"><em>厘米</em></div></div>
</div>
<div class="fld"><span class="lb">宝宝是</span><div class="seg" id="cS"><button type="button" data-v="b">男孩</button><button type="button" data-v="g">女孩</button><button type="button" data-v="u">还不知道</button></div></div>
</section>
<section class="sec">
<h2>想长高,后天能做的</h2>
<ol class="tl">
<li><i class="d"></i><div class="m"><b>吃够蛋白质和钙</b><span>奶、蛋、肉、豆制品每天都有,别挑食;维生素 D 按医生建议补。</span></div></li>
<li><i class="d"></i><div class="m"><b>睡得早、睡得足</b><span>生长激素主要在深睡时分泌,晚上 9~10 点前入睡更好。</span></div></li>
<li><i class="d"></i><div class="m"><b>多跑多跳</b><span>跳绳、篮球、游泳这类纵向运动,每天户外活动 1~2 小时。</span></div></li>
<li><i class="d"></i><div class="m"><b>定期量身高</b><span>按儿保体检记录生长曲线,一年长不到 5 厘米(3 岁后)要找医生看看。</span></div></li>
</ol>
</section>
<p class="foot">按遗传靶身高公式估算,实际身高受营养、睡眠、运动和疾病等影响,仅供参考。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var AVG = { b: 169.7, g: 158.0 };
var st = C.store('mmbox.calc.shengao', { f: '', m: '', s: 'u' });
$('#cF').value = st.f; $('#cM').value = st.m;
$('#cF').addEventListener('input', function () { st.f = this.value; paint(); });
$('#cM').addEventListener('input', function () { st.m = this.value; paint(); });
C.seg($('#cS'), st, 's', paint);
function one(sx, f, m) { var t = (f + m + (sx === 'b' ? 13 : -13)) / 2; return { t: t, lo: t - 6.5, hi: t + 6.5 }; }
function cmp(sx, t) { var d = t - AVG[sx]; return Math.abs(d) < 1.5 ? '和全国平均差不多' : (d > 0 ? '比全国平均高 ' : '比全国平均矮 ') + Math.abs(d).toFixed(1) + ' cm'; }
function paint() {
st.save();
var f = +st.f, m = +st.m, R = $('#res');
if (!(f >= 130 && f <= 230 && m >= 120 && m <= 210)) { R.innerHTML = '<div class="empty">' + (st.f || st.m ? '身高填厘米,再核对一下' : '填好爸爸妈妈的身高,马上算出来') + '</div>'; return; }
if (st.s === 'u') {
var b = one('b', f, m), g = one('g', f, m);
R.innerHTML = '<small>宝宝长大后的身高大约</small><div class="sx"><div><small>如果是男孩</small><b class="num">' + b.t.toFixed(1) + ' cm</b><small class="num">' + b.lo.toFixed(0) + '~' + b.hi.toFixed(0) + ' cm</small></div>' +
'<div><small>如果是女孩</small><b class="num">' + g.t.toFixed(1) + ' cm</b><small class="num">' + g.lo.toFixed(0) + '~' + g.hi.toFixed(0) + ' cm</small></div></div>' +
'<span class="note">男孩' + cmp('b', b.t) + ',女孩' + cmp('g', g.t) + '(全国 18~44 岁平均:男 169.7、女 158.0)</span>';
return;
}
var x = one(st.s, f, m);
R.innerHTML = '<small>' + (st.s === 'b' ? '儿子' : '女儿') + '长大后的身高大约</small><b class="big num">' + x.t.toFixed(1) + '<u>厘米</u></b>' +
'<div class="row"><div><small>大概范围</small><b class="num">' + x.lo.toFixed(0) + '~' + x.hi.toFixed(0) + ' cm</b></div><div><small>和全国同龄比</small><b>' + cmp(st.s, x.t).replace('和全国平均', '').replace('比全国平均', '') + '</b></div></div>' +
'<span class="note">身高大约 70% 看遗传,吃好、睡好、多运动,有机会长到范围的上半段。</span>';
}
paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/shengao-js.jpg', '宝宝身高预测:长大后大概多高'); /* 11-04 微信转发图 */</script>
</body>
</html>

View File

@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>出生后手续时间线</title>
<!-- 孕期计算器 · 出生后手续时间线(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
时间依据:《户口登记条例》第 7 条(出生后 1 个月内申报户口);新生儿参加城乡居民医保多数地方要求出生后 3 个月(90 天)内参保、可从出生起享受待遇;
预防接种证出生后 1 个月内到社区建证;个税 3 岁以下照护扣除出生当月起;育儿补贴落户后申领;产后 42 天复查。
各地规定不一,页面写「以当地为准」。很多地方已开通「新生儿出生一件事」联办(出生证 + 户口 + 医保 + 社保卡一次办)。
做完可以打勾(记在本机 mmbox.calc.shouxu);还没生的按预产期先排。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#4E7FD8;--c2:#86AEF2;--cbg:#EDF3FF}.tl .ck{flex:none;align-self:flex-start;height:28px;padding:0 10px;margin-top:1px;border-radius:99px;background:#F4F6F8;color:var(--m);font-size:12px;font-weight:800}.tl li.ok .ck{background:var(--c);color:#fff}.tl li.ok .m{opacity:.55}.tl li.ok .d{border-color:var(--c);background:var(--c);box-shadow:none}.tl li.late .m b em{background:#FFE8E6;color:#E0453A}.tl .m span.w{color:var(--t)}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>出生后手续时间线</h1><span>出生证、上户口、医保、社保卡……每件事截止哪天</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">填宝宝出生日期,马上排出时间线</div></div>
<div class="tabs" id="tabs"><button type="button" data-v="1">已经生了</button><button type="button" data-v="0">还没生,按预产期</button></div>
<div class="fld"><label class="lb" for="cD" id="cDl">宝宝出生日期</label><input class="in num" type="date" id="cD"></div>
</section>
<section class="sec hide" id="sTl">
<h2>手续时间线</h2>
<p class="lead">按截止时间排,做完点「办好了」</p>
<ol class="tl" id="tl"></ol>
</section>
<div class="tip"><b>先查有没有「出生一件事」:</b>很多城市在支付宝、微信或当地政务 App 上能把出生医学证明、上户口、医保参保、社保卡一次办完,不用一趟趟跑。<br><b>要准备的:</b>爸妈身份证、户口本、结婚证、出生医学证明(宝宝名字定好再办)。</div>
<p class="foot">各地规定和截止时间不完全一样,以当地公安、医保、卫健部门要求为准。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var DAY = C.DAY, T = C.today();
/* [名称, 截止:天数 或 'm1' = 1 个月 / 'm3' = 3 个月, 在哪办 / 说明, 起始偏移天] */
var L = [
['出生医学证明', 3, '出院前在医院办,名字定好再填;写错要去医院改,很麻烦', 0],
['乙肝疫苗第 1 针 + 卡介苗', 1, '医院出生后 24 小时内接种,出院前确认接种记录', 0],
['个税加上宝宝', 'm1', '「个人所得税」App 填 3 岁以下婴幼儿照护,出生当月起每月可扣 2000 元', 0],
['办预防接种证', 'm1', '带出院时的接种记录,到户籍或居住地社区卫生服务中心建证', 0],
['上户口', 'm1', '《户口登记条例》规定出生后 1 个月内申报,带出生证、爸妈身份证、户口本、结婚证去派出所,或网上办', 0],
['乙肝疫苗第 2 针', 'm1', '满 1 个月到社区医院接种', 25],
['产后 42 天复查 + 宝宝体检', 42, '妈妈查子宫恢复、伤口、盆底,宝宝查生长发育;去生产医院或社区', 40],
['新生儿医保参保', 'm3', '多数地方出生后 3 个月(90 天)内参保,可以从出生那天起报销;上完户口就办', 0],
['申请育儿补贴', 'm3', '落户后在支付宝、微信「育儿补贴」或当地政务平台申请,每年 3600 元', 0],
['申领社保卡 / 医保电子凭证', 'm3', '参保后办,看病报销要用', 0],
['申领生育津贴', 365, '一般单位代办,产假结束后提交;多数地方要求产后 1 年内', 90]
];
var st = C.store('mmbox.calc.shouxu', { b: 1, d: '', ok: {} });
if (!st.d) { var sd = C.savedDue(); if (!isNaN(sd)) { st.d = C.fmt(sd); st.b = sd > T ? 0 : 1; } }
var tabUi = C.seg($('#tabs'), st, 'b', function () { ui(); paint(); });
function ui() { $('#cDl').textContent = st.b ? '宝宝出生日期' : '预产期'; $('#cD').value = st.d; }
function due(b, x) { return typeof x === 'number' ? b + x * DAY : C.addMonths(b, +x.slice(1)); }
function paint() {
st.save();
var b = C.parse(st.d), R = $('#res');
$('#sTl').classList.toggle('hide', isNaN(b));
if (isNaN(b)) { R.innerHTML = '<div class="empty">填宝宝出生日期,马上排出时间线</div>'; return; }
var rows = L.map(function (x, i) { return { x: x, i: i, e: due(b, x[1]), s: b + x[3] * DAY, ok: !!st.ok[i] }; }).sort(function (p, q) { return p.e - q.e; });
var nx = null, late = 0, done = 0;
$('#tl').innerHTML = rows.map(function (r) {
var left = Math.round((r.e - T) / DAY), lt = !r.ok && left < 0, cls = r.ok ? 'ok' : lt ? 'late now' : '';
if (r.ok) done++; if (lt) late++; if (!r.ok && !lt && !nx) nx = r;
return '<li class="' + cls + '"><i class="d"></i><div class="m"><b>' + r.x[0] + (r.ok ? '' : lt ? '<em>已超过截止</em>' : left <= 7 ? '<em>还剩 ' + left + ' 天</em>' : '') + '</b>' +
'<span><i class="num">' + (r.x[3] ? C.cn(r.s) + ' 起,' : '') + C.cn(r.e) + ' 前</i></span><span class="w">' + r.x[2] + '</span></div>' +
'<button type="button" class="ck" data-i="' + r.i + '">' + (r.ok ? '办好了 ✓' : '办好了') + '</button></li>';
}).join('');
R.innerHTML = nx ? '<small>' + (st.b ? '接下来最急的一件' : '宝宝出生后第一件要办的') + '</small><b class="big">' + nx.x[0] + '</b>' +
'<div class="row"><div><small>截止</small><b class="num">' + C.cn(nx.e) + '</b></div><div><small>还剩</small><b class="num">' + Math.max(0, Math.round((nx.e - T) / DAY)) + ' 天</b></div></div>' +
'<div class="pg"><i style="width:' + (done / L.length * 100).toFixed(1) + '%"></i></div><span class="note">已办好 ' + done + ' / ' + L.length + ' 件' + (late ? ',有 ' + late + ' 件过了常规截止时间,尽快去办,多数还能补' : '') + '</span>'
: '<small>手续都办完啦</small><b class="big">' + (late ? '还有 ' + late + ' 件待补' : '全部搞定') + '</b><span class="note">已办好 ' + done + ' / ' + L.length + ' 件</span>';
}
$('#tl').addEventListener('click', function (e) { var b = e.target.closest('.ck'); if (!b) return; var i = b.dataset.i; if (st.ok[i]) delete st.ok[i]; else st.ok[i] = 1; paint(); });
$('#cD').addEventListener('change', function () { st.d = this.value; paint(); });
tabUi(); ui(); paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/shouxu-js.jpg', '出生后手续时间线:每件事截止哪天'); /* 11-04 微信转发图 */</script>
</body>
</html>

103
topic/xuexing-js/index.html Normal file
View File

@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>宝宝血型推算</title>
<!-- 孕期计算器 · 宝宝血型推算(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
ABO 按孟德尔遗传:先由爸妈的表现型推出各自基因型的概率(汉族人群等位基因频率约 A 0.23、B 0.21、O 0.56,对应 A 31% / B 28% / O 31% / AB 10%),
再组合出宝宝每种血型的概率;Rh 同理(汉族 Rh 阴性约 0.3%,d 等位基因约 0.055)。
顺带提示两种溶血风险:妈妈 Rh 阴性 + 爸爸 Rh 阳性(Rh 溶血,要查抗 D 抗体);妈妈 O 型 + 爸爸非 O 型(ABO 溶血,多数轻)。
顺式 AB(cis-AB)、孟买型等罕见情况不算,页面写明。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#D9475A;--c2:#FF8A96;--cbg:#FFEDEF}.bars{margin-top:12px}.bars div{display:flex;align-items:center;gap:8px;margin-top:6px}.bars b{flex:none;width:44px;font-size:16px}.bars i{flex:1;height:12px;border-radius:99px;background:rgba(255,255,255,.25);overflow:hidden}.bars i u{display:block;height:100%;border-radius:99px;background:#fff}.bars span{flex:none;width:52px;text-align:right;font-size:14px;font-weight:800}.bars .no{opacity:.45}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>宝宝血型推算</h1><span>按爸妈血型,算宝宝可能是什么血型</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">选好爸爸妈妈的血型,马上算出来</div></div>
<div class="fld"><span class="lb">爸爸的血型</span><div class="seg s4" id="cF"><button type="button" data-v="A">A</button><button type="button" data-v="B">B</button><button type="button" data-v="AB">AB</button><button type="button" data-v="O">O</button></div>
<div class="seg s2" id="cFr"><button type="button" data-v="+">Rh 阳性</button><button type="button" data-v="-">Rh 阴性</button></div></div>
<div class="fld"><span class="lb">妈妈的血型</span><div class="seg s4" id="cM"><button type="button" data-v="A">A</button><button type="button" data-v="B">B</button><button type="button" data-v="AB">AB</button><button type="button" data-v="O">O</button></div>
<div class="seg s2" id="cMr"><button type="button" data-v="+">Rh 阳性</button><button type="button" data-v="-">Rh 阴性</button></div>
<span class="hint">不知道 Rh 就选阳性(中国人 99.7% 是阳性);妈妈的血型产检第一次抽血就会查</span></div>
</section>
<section class="sec hide" id="sRisk">
<h2>要留意的</h2>
<div class="cards" id="risk"></div>
</section>
<section class="sec">
<h2>血型遗传对照表</h2>
<p class="lead">只看 ABO,「可能」按概率从高到低</p>
<table class="tbl" id="tbl"><thead><tr><th>爸妈血型</th><th>宝宝可能</th><th>宝宝不可能</th></tr></thead><tbody></tbody></table>
</section>
<p class="foot">按常规遗传规律估算,不能用来做亲子鉴定;顺式 AB、孟买型等罕见血型不在计算范围。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var FQ = { A: .23, B: .21, O: .56 }, D = .055;
/* 表现型 → 基因型(两个等位基因)及其相对概率 */
function geno(p) {
var a = FQ.A, b = FQ.B, o = FQ.O, L = { A: [['A', 'A', a * a], ['A', 'O', 2 * a * o]], B: [['B', 'B', b * b], ['B', 'O', 2 * b * o]], AB: [['A', 'B', 1]], O: [['O', 'O', 1]] }[p];
var s = L.reduce(function (x, g) { return x + g[2]; }, 0); return L.map(function (g) { return [g[0], g[1], g[2] / s]; });
}
function pheno(x, y) { var s = [x, y].sort().join(''); return s === 'AB' ? 'AB' : s.indexOf('A') >= 0 ? 'A' : s.indexOf('B') >= 0 ? 'B' : 'O'; }
function kid(f, m) {
var r = { A: 0, B: 0, AB: 0, O: 0 };
geno(f).forEach(function (g) { geno(m).forEach(function (h) { [g[0], g[1]].forEach(function (x) { [h[0], h[1]].forEach(function (y) { r[pheno(x, y)] += g[2] * h[2] / 4; }); }); }); });
return r;
}
function rhNeg(f, m) { /* 宝宝 Rh 阴性的概率 */
function pd(r) { if (r === '-') return 1; var dd = 2 * D * (1 - D), DD = (1 - D) * (1 - D); return dd / (dd + DD) / 2; } /* 给出 d 的概率 */
return pd(f) * pd(m);
}
var st = C.store('mmbox.calc.xuexing', { f: '', m: '', fr: '+', mr: '+' });
C.seg($('#cF'), st, 'f', paint); C.seg($('#cM'), st, 'm', paint); C.seg($('#cFr'), st, 'fr', paint); C.seg($('#cMr'), st, 'mr', paint);
var T4 = ['A', 'B', 'AB', 'O'];
function pct(x) { return x <= 0 ? '0' : x < .01 ? '<1%' : Math.round(x * 100) + '%'; }
(function table() {
var h = '';
T4.forEach(function (f, i) { T4.slice(i).forEach(function (m) {
var r = kid(f, m), yes = T4.filter(function (t) { return r[t] > 1e-9; }).sort(function (a, b) { return r[b] - r[a]; }), no = T4.filter(function (t) { return r[t] <= 1e-9; });
h += '<tr data-k="' + [f, m].sort().join('-') + '"><td><b>' + f + ' + ' + m + '</b></td><td>' + yes.join('、') + '</td><td>' + (no.join('、') || '—') + '</td></tr>';
}); });
$('#tbl tbody').innerHTML = h;
})();
function paint() {
st.save();
var R = $('#res');
[].forEach.call($('#tbl tbody').children, function (tr) { tr.classList.toggle('on', st.f && st.m && tr.dataset.k === [st.f, st.m].sort().join('-')); });
if (!st.f || !st.m) { R.innerHTML = '<div class="empty">选好爸爸妈妈的血型,马上算出来</div>'; $('#sRisk').classList.add('hide'); return; }
var r = kid(st.f, st.m), ord = T4.slice().sort(function (a, b) { return r[b] - r[a]; }), neg = rhNeg(st.fr, st.mr);
R.innerHTML = '<small>爸爸 ' + st.f + ' 型 + 妈妈 ' + st.m + ' 型,宝宝可能是</small><div class="bars">' + ord.map(function (t) {
return '<div class="' + (r[t] > 1e-9 ? '' : 'no') + '"><b>' + t + ' 型</b><i><u style="width:' + (r[t] * 100).toFixed(1) + '%"></u></i><span class="num">' + (r[t] > 1e-9 ? pct(r[t]) : '不可能') + '</span></div>';
}).join('') + '</div><span class="note">Rh:宝宝' + (neg >= .999 ? '一定是 Rh 阴性' : neg < .005 ? '几乎都是 Rh 阳性' : '是 Rh 阴性的概率约 ' + pct(neg)) + '。概率按中国汉族人群血型分布推算。</span>';
var rk = [];
if (st.mr === '-' && st.fr === '+') rk.push(['Rh 溶血要重视', '妈妈 Rh 阴性、爸爸 Rh 阳性,宝宝可能是 Rh 阳性。产检时要查抗 D 抗体,孕 28 周左右和产后 72 小时内医生可能会建议打抗 D 免疫球蛋白,一定主动告诉医生。']);
if (st.mr === '-' && st.fr === '-') rk.push(['都是 Rh 阴性', '宝宝也是 Rh 阴性,不会有 Rh 溶血;Rh 阴性血源紧张,提前告诉生产医院备血。']);
if (st.m === 'O' && st.f !== 'O') rk.push(['可能有 ABO 溶血', '妈妈 O 型、爸爸不是 O 型,宝宝可能出现 ABO 溶血,多数很轻,表现为黄疸偏重、退得慢。不用太担心,产后留意宝宝黄疸就好;有的医院孕期会查抗体效价。']);
$('#sRisk').classList.toggle('hide', !rk.length);
$('#risk').innerHTML = rk.map(function (x) { return '<div class="cd"><div class="k"><b>' + x[0] + '</b></div><p>' + x[1] + '</p></div>'; }).join('');
}
paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/xuexing-js.jpg', '宝宝血型推算:爸妈血型配宝宝会是什么型'); /* 11-04 微信转发图 */</script>
</body>
</html>

View File

@@ -187,7 +187,7 @@ button{cursor:pointer}
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110298"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/yuchanqi-js.jpg', '预产期计算器:宝宝哪天到?还有几天见面'); /* 11-04 微信转发图 */</script>
</body>
</html>

76
topic/yuezi-js/index.html Normal file
View File

@@ -0,0 +1,76 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>月子花费计算器</title>
<!-- 孕期计算器 · 月子花费计算器(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
价格是 2026 年市场行情的估算区间(月子中心 28 天套餐、金牌 / 普通月嫂 26 天、在家坐月子的食材营养 + 用品),按城市 × 档次取值,按天数折算;
不是报价,只帮用户比较三种方式的量级。改价格只改下面 P 表。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#C9658F;--c2:#F0A0C0;--cbg:#FCEEF4}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>月子花费计算器</h1><span>月子中心、请月嫂、在家坐,三种方式各要花多少</span></section>
<section class="calc">
<div class="res" id="res"></div>
<div class="fld"><span class="lb">在哪个城市坐月子</span><div class="seg s4" id="cCity"><button type="button" data-v="0">一线</button><button type="button" data-v="1">新一线</button><button type="button" data-v="2">二线</button><button type="button" data-v="3">三四线</button></div>
<span class="hint">一线:北上广深;新一线:杭州、成都、南京、武汉、西安等</span></div>
<div class="fld"><span class="lb">想要的档次</span><div class="seg" id="cLv"><button type="button" data-v="0">经济</button><button type="button" data-v="1">中档</button><button type="button" data-v="2">高端</button></div></div>
<div class="fld"><span class="lb">坐多久</span><div class="seg s2" id="cDay"><button type="button" data-v="28">28 天</button><button type="button" data-v="42">42 天</button></div></div>
</section>
<section class="sec">
<h2>三种方式比一比</h2>
<p class="lead">按你选的城市和档次估算</p>
<div class="cards" id="cards"></div>
</section>
<div class="tip"><b>看月子中心记得问清:</b>价格含不含宝宝护理、产后修复、家属餐和陪护床;护士是否 24 小时、一对几;有没有医护资质和儿科医生定期巡房。<br><b>请月嫂:</b>看健康证、育婴师证,最好先面试、试工,合同写清休息和换人规则。</div>
<p class="foot">价格为 2026 年市场行情估算,各地差别很大,以实际报价为准。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
/* 每 28 天(万元)[城市][档次]:月子中心 / 月嫂(26 天按 28 天计,含额外伙食)/ 在家(食材营养 + 用品 + 小时工) */
var P = {
zx: [[3.5, 6, 12], [2.5, 4, 8], [1.8, 3, 5.5], [1.2, 2, 3.5]],
ys: [[1.4, 2, 3.1], [1.1, 1.6, 2.5], [.9, 1.3, 2], [.7, 1, 1.5]],
jj: [[.5, .8, 1.3], [.4, .65, 1.1], [.35, .55, .9], [.3, .45, .7]]
};
var st = C.store('mmbox.calc.yuezi', { city: 1, lv: 1, day: 28 });
C.seg($('#cCity'), st, 'city', paint); C.seg($('#cLv'), st, 'lv', paint); C.seg($('#cDay'), st, 'day', paint);
function v(k) { return P[k][st.city][st.lv] * 1e4 * st.day / 28; }
function rg(k) { var x = v(k); return C.money(x * .85) + '~' + C.money(x * 1.15); }
function paint() {
st.save();
var a = v('zx'), b = v('ys'), c = v('jj');
$('#res').innerHTML = '<small>' + ['一线', '新一线', '二线', '三四线'][st.city] + ' · ' + ['经济', '中档', '高端'][st.lv] + ' · ' + st.day + ' 天,三种方式大约</small>' +
'<div class="row"><div><small>月子中心</small><b class="num">' + C.money(a) + '</b></div><div><small>请月嫂</small><b class="num">' + C.money(b) + '</b></div><div><small>家人照顾</small><b class="num">' + C.money(c) + '</b></div></div>' +
'<span class="note">月子中心比在家贵 ' + C.money(a - c) + ' 元左右;中间方案是月子中心住一段 + 回家请月嫂。</span>';
var mix = v('zx') / 2 + v('ys') / 2;
$('#cards').innerHTML = [
['月子中心', rg('zx'), '有专业护士 24 小时带宝宝,妈妈只管休息和吃,产后修复、月子餐一站式。', '适合:家里没人帮忙、想彻底休息、预算充足', 0],
['请月嫂在家', rg('ys'), '月嫂住家照顾妈妈和宝宝,做月子餐;在自己家更自在,家人也能搭把手。', '适合:家里住得开、想在熟悉环境里坐月子', 0],
['家人照顾', rg('jj'), '花在食材营养、产后用品和偶尔的小时工上,最省钱,但家人会很累,也容易有育儿观念分歧。', '适合:长辈身体好、有经验,家庭关系融洽', 0],
['组合:月子中心一半 + 月嫂一半', C.money(mix * .85) + '~' + C.money(mix * 1.15), '前两周在月子中心恢复、学会喂奶护理,后两周回家请月嫂过渡。', '适合:想要专业照护又想省一点', 0]
].map(function (x) { return '<div class="cd"><div class="k"><b>' + x[0] + '</b><strong class="num">' + x[1] + ' 元</strong></div><p>' + x[2] + '</p><small>' + x[3] + '</small></div>'; }).join('');
}
paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/yuezi-js.jpg', '月子花费:月子中心、月嫂、在家坐各花多少'); /* 11-04 微信转发图 */</script>
</body>
</html>

114
topic/yunzhou-js/index.html Normal file
View File

@@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>孕周计算器</title>
<!-- 孕期计算器 · 孕周计算器(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
算法:孕周 = 今天 − 末次月经第一天(周期不是 28 天的顺延 周期−28 天);或 = 今天 −(预产期 − 280 天)。
孕月按 4 周一个月(孕 1~10 月);孕早期 < 14 周、孕中期 14~27+6 周、孕晚期 ≥ 28 周;37 周足月、42 周过期。
宝宝像什么用全生态统一表 /common/baby-size.js(别自己维护)。预产期计算器填过的值直接拿来用。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#E2668E;--c2:#FF9DB8;--cbg:#FFEEF3}.bs{display:flex;align-items:center;gap:12px;margin-top:12px;padding:10px 12px;border-radius:12px;background:rgba(255,255,255,.18)}.bs i{font-style:normal;font-size:30px;line-height:1}.bs b{display:block;font-size:15px}.chk{display:flex;align-items:center;gap:10px;margin-top:10px}.chk .in{flex:1;margin:0}.chk b{flex:none;min-width:120px;text-align:right;font-size:15px;color:var(--c)}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>孕周计算器</h1><span>今天孕几周几天、孕几个月、宝宝像什么,填一个日期就知道</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">填好下面的日期,马上出结果</div></div>
<div class="tabs" id="tabs"><button type="button" data-v="lmp">按末次月经</button><button type="button" data-v="due">按预产期</button></div>
<div id="fLmp">
<div class="fld"><label class="lb" for="cLmp">末次月经第一天</label><input class="in num" type="date" id="cLmp"></div>
<div class="fld"><span class="lb">月经周期<small>两次月经第一天间隔几天</small></span>
<div class="stp"><button type="button" id="cyM" aria-label="减一天">−</button><b class="num" id="cyV">28 天</b><button type="button" id="cyP" aria-label="加一天">+</button></div></div>
</div>
<div id="fDue" class="hide">
<div class="fld"><label class="lb" for="cDue">预产期<small>产检本上医生写的那个</small></label><input class="in num" type="date" id="cDue"></div>
</div>
</section>
<section class="sec hide" id="sStage">
<h2>我的孕期进度</h2>
<p class="lead">几个关键节点分别是哪天</p>
<ol class="tl" id="tl"></ol>
</section>
<section class="sec hide" id="sAsk">
<h2>查某一天是孕几周</h2>
<p class="lead">比如产检那天、旅行那天、某个节日</p>
<div class="chk"><input class="in num" type="date" id="cAsk"><b class="num" id="rAsk">选个日期</b></div>
</section>
<div class="tip"><b>孕周以早孕 B 超为准:</b>月经不规律或记不清末次月经时,医生会按孕早期 B 超(头臀长)定孕周。这里算的是常规算法,仅供参考。</div>
<p class="foot">计算结果仅供参考,不能代替医生诊断。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script src="/common/baby-size.js?v=26101001"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var DAY = C.DAY, T = C.today();
var st = C.store('mmbox.calc.yunzhou', { m: 'lmp', lmp: '', cy: 28, due: '' });
if (!st.lmp && !st.due) { var sd = C.savedDue(); if (!isNaN(sd)) { st.m = 'due'; st.due = C.fmt(sd); } } /* 预产期计算器填过就直接用 */
$('#cLmp').max = C.fmt(T); $('#cLmp').min = C.fmt(T - 300 * DAY);
$('#cDue').min = C.fmt(T - 60 * DAY); $('#cDue').max = C.fmt(T + 300 * DAY);
var tabUi = C.seg($('#tabs'), st, 'm', function () { ui(); paint(); });
function ui() {
$('#fLmp').classList.toggle('hide', st.m !== 'lmp'); $('#fDue').classList.toggle('hide', st.m !== 'due');
$('#cLmp').value = st.lmp; $('#cDue').value = st.due; $('#cyV').textContent = st.cy + ' 天';
}
function start() { /* 孕 0 周 0 天那天 */
if (st.m === 'lmp') { var l = C.parse(st.lmp); return isNaN(l) ? NaN : l + (st.cy - 28) * DAY; }
var d = C.parse(st.due); return isNaN(d) ? NaN : d - 280 * DAY;
}
function wk(g) { var w = Math.floor(g / 7), d = g % 7; return w + ' 周' + (d ? ' + ' + d + ' 天' : ''); }
var MS = [['孕早期结束', 14 * 7, '最容易不舒服的阶段过去了'], ['孕中期 · 开始有胎动', 18 * 7, '18~20 周左右能感到胎动'], ['孕晚期开始', 28 * 7, '产检变成两周一次'],
['足月', 37 * 7, '这之后出生都算足月'], ['预产期', 280, ''], ['过期妊娠', 294, '到 41 周还没动静,医生一般会安排催产']];
function paint() {
st.save();
var s0 = start(), R = $('#res');
['#sStage', '#sAsk'].forEach(function (k) { $(k).classList.toggle('hide', isNaN(s0)); });
if (isNaN(s0)) { R.innerHTML = '<div class="empty">填好下面的日期,马上出结果</div>'; return; }
var g = Math.floor((T - s0) / DAY);
if (g < 0 || g > 300) { R.innerHTML = '<div class="empty">这个日期算出来不在孕期里,再核对一下</div>'; return; }
var w = Math.floor(g / 7), mon = Math.min(10, Math.floor(g / 28) + 1), stage = w < 14 ? '孕早期' : w < 28 ? '孕中期' : '孕晚期', left = 280 - g;
var bs = window.BabySize && w >= 4 ? BabySize.get(w) : null;
R.innerHTML = '<small>今天是</small><b class="big num">孕 ' + wk(g) + '</b>' +
'<div class="row"><div><small>孕几个月</small><b>孕 ' + mon + ' 月</b></div><div><small>所处阶段</small><b>' + stage + '</b></div><div><small>' + (left >= 0 ? '离预产期' : '已过预产期') + '</small><b class="num">' + Math.abs(left) + ' 天</b></div></div>' +
'<div class="pg"><i style="width:' + Math.min(100, g / 280 * 100).toFixed(1) + '%"></i></div>' +
(bs ? '<div class="bs"><i>' + bs.emoji + '</i><span><small>宝宝现在</small><b>像' + C.esc(bs.name) + ' · 约 ' + C.esc(bs.txt) + '</b></span></div>' : '<span class="note">孕 4 周以后就能看到宝宝像什么啦</span>');
$('#tl').innerHTML =
MS.map(function (m) {
var t = s0 + m[1] * DAY, done = T >= t, nx = !done && MS.filter(function (x) { return s0 + x[1] * DAY > T; })[0] === m;
return '<li class="' + (done ? 'done' : nx ? 'now' : '') + '"><i class="d"></i><div class="m"><b>' + m[0] + (nx ? '<em>还有 ' + Math.round((t - T) / DAY) + ' 天</em>' : '') + '</b>' +
'<span><i class="num">' + C.cn(t, 1) + ' ' + C.wd(t) + '</i> · 孕 ' + wk(m[1]) + (m[2] ? ' · ' + m[2] : '') + '</span></div></li>';
}).join('');
ask();
}
function ask() {
var s0 = start(), a = C.parse($('#cAsk').value), o = $('#rAsk');
if (isNaN(s0) || isNaN(a)) { o.textContent = '选个日期'; return; }
var g = Math.floor((a - s0) / DAY);
o.textContent = g < 0 ? '那时还没怀上' : g > 300 ? '宝宝早出生啦' : '孕 ' + wk(g);
}
$('#cLmp').addEventListener('change', function () { st.lmp = this.value; paint(); });
$('#cDue').addEventListener('change', function () { st.due = this.value; paint(); });
$('#cAsk').addEventListener('change', ask);
$('#cyM').addEventListener('click', function () { st.cy = Math.max(21, st.cy - 1); ui(); paint(); });
$('#cyP').addEventListener('click', function () { st.cy = Math.min(45, st.cy + 1); ui(); paint(); });
tabUi(); ui(); paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/yunzhou-js.jpg', '孕周计算器:今天孕几周几天,宝宝像什么'); /* 11-04 微信转发图 */</script>
</body>
</html>

View File

@@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<title>孕期增重范围</title>
<!-- 孕期计算器 · 孕期增重范围(2026-11-04 用户从 20 个备选里选了带星的 10 个,本页是其中之一)。
依据:国家卫健委行业标准 WS/T 801—2022《妊娠期妇女体重增长推荐值标准》(单胎)。
孕前 BMI < 18.5:总增重 11~16 kg,孕中晚期每周 0.46(0.37~0.56)kg;18.5~23.9:8~14 kg,0.37(0.26~0.48);
24~27.9:7~11 kg,0.30(0.22~0.37);≥ 28:5~9 kg,0.22(0.15~0.30);孕早期(< 14 周)共增 0~2 kg。
某一孕周的推荐范围 = 孕早期 0~2 kg + (孕周 − 13) × 每周范围,封顶到总范围。双胎按 IOM 2009(标准没覆盖双胎)。
只算范围不做记录(11-04 用户:记体重是另一个记录工具)。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
<link rel="stylesheet" href="../_shared/calc.css?v=26110299">
<style>:root{--c:#2E9C6A;--c2:#6CCB9A;--cbg:#E8F7EF}.gauge{position:relative;height:10px;margin-top:14px;border-radius:99px;background:rgba(255,255,255,.28)}.gauge .ok{position:absolute;top:0;bottom:0;border-radius:99px;background:rgba(255,255,255,.65)}.gauge .me{position:absolute;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;background:#fff;box-shadow:0 0 0 3px rgba(0,0,0,.15)}.glab{display:flex;justify-content:space-between;margin-top:4px;font-size:11.5px;opacity:.85}</style>
</head>
<body>
<div id="scroll">
<header class="bar" id="bar">
<button class="back" id="back" aria-label="返回"><svg viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></svg></button>
<span class="t">孕期计算器</span>
</header>
<section class="hd"><p>孕期计算器</p><h1>孕期增重范围</h1><span>按孕前身高体重,算整个孕期胖多少合适、现在该胖多少</span></section>
<section class="calc">
<div class="res" id="res"><div class="empty">填好身高和孕前体重,马上出结果</div></div>
<div class="fld two">
<div><label class="lb" for="cH">身高</label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cH" placeholder="160"><em>厘米</em></div></div>
<div><label class="lb" for="cW0">孕前体重</label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cW0" placeholder="52"><em>公斤</em></div></div>
</div>
<div class="fld"><span class="lb">怀了几个</span><div class="seg s2" id="cN"><button type="button" data-v="1">一个宝宝</button><button type="button" data-v="2">双胞胎</button></div></div>
<div class="fld two">
<div><label class="lb" for="cWk">现在孕周<small>选填</small></label><div class="inw"><input class="in num" type="number" inputmode="numeric" id="cWk" placeholder="20"><em>周</em></div></div>
<div><label class="lb" for="cW1">现在体重<small>选填</small></label><div class="inw"><input class="in num" type="number" inputmode="decimal" id="cW1" placeholder="58"><em>公斤</em></div></div>
</div>
<span class="hint">填了现在的孕周和体重,会告诉你现在胖得合不合适</span>
</section>
<section class="sec">
<h2>不同体型该胖多少</h2>
<p class="lead">孕前 BMI = 体重(kg) ÷ 身高(m)²,单胎</p>
<table class="tbl" id="tbl"><thead><tr><th>孕前体型</th><th>BMI</th><th>整个孕期</th><th>孕中晚期每周</th></tr></thead><tbody></tbody></table>
</section>
<div class="tip"><b>胖得太快或太慢都要留意:</b>增重过多容易妊娠糖尿病、巨大儿,过少可能影响宝宝发育。一周涨超过 1 公斤,或者突然腿脚、脸都肿,要尽快告诉医生。</div>
<p class="foot">依据 WS/T 801—2022《妊娠期妇女体重增长推荐值标准》;双胎参考美国医学研究所 IOM 2009。仅供参考。</p>
</div>
<script src="../_shared/calc.js?v=26110299"></script>
<script>
(function () {
'use strict';
var C = window.CK, $ = C.$;
C.shell();
var st = C.store('mmbox.calc.zengzhong', { h: '', w0: '', n: 1, wk: '', w1: '' });
var p = C.preg(); if (!st.wk && p && !p.pp && p.w) st.wk = p.w;
/* [名称, BMI 下限, 上限, 总增重低, 高, 每周中值, 每周低, 每周高, 双胎低, 双胎高] */
var K = [['偏瘦', 0, 18.5, 11, 16, .46, .37, .56, null, null], ['正常', 18.5, 24, 8, 14, .37, .26, .48, 16.8, 24.5],
['超重', 24, 28, 7, 11, .30, .22, .37, 14.1, 22.7], ['肥胖', 28, 99, 5, 9, .22, .15, .30, 11.3, 19.1]];
function f1(n) { return (Math.round(n * 10) / 10).toString(); }
var IN = { h: '#cH', w0: '#cW0', wk: '#cWk', w1: '#cW1' };
Object.keys(IN).forEach(function (k) { var el = $(IN[k]); el.value = st[k]; el.addEventListener('input', function () { st[k] = el.value; paint(); }); });
C.seg($('#cN'), st, 'n', paint);
function paint() {
st.save();
var h = +st.h / 100, w0 = +st.w0, R = $('#res'), ki = -1;
if (h >= 1.3 && h <= 2.1 && w0 >= 30 && w0 <= 200) {
var bmi = w0 / h / h; K.forEach(function (k, i) { if (bmi >= k[1] && bmi < k[2]) ki = i; });
}
$('#tbl tbody').innerHTML = K.map(function (k, i) {
return '<tr' + (i === ki ? ' class="on"' : '') + '><td><b>' + k[0] + '</b></td><td class="num">' + (i === 0 ? '< 18.5' : i === 3 ? '≥ 28' : k[1] + '~' + (k[2] - .1)) + '</td><td class="num">' + k[3] + '~' + k[4] + ' kg</td><td class="num">' + k[5] + ' kg</td></tr>';
}).join('');
if (ki < 0) { R.innerHTML = '<div class="empty">' + (st.h || st.w0 ? '身高填厘米、体重填公斤,再核对一下' : '填好身高和孕前体重,马上出结果') + '</div>'; return; }
var k = K[ki], tw = +st.n === 2, lo = tw ? k[8] : k[3], hi = tw ? k[9] : k[4];
var html = '<small>孕前 BMI ' + f1(bmi) + ' · ' + k[0] + (tw ? ' · 双胞胎' : '') + ',整个孕期建议胖</small>';
if (tw && lo == null) { R.innerHTML = html + '<b class="big">请问医生</b><span class="note">孕前偏瘦又是双胞胎,没有统一推荐值,增重目标请产检医生单独定。</span>'; return; }
html += '<b class="big num">' + lo + ' ~ ' + hi + '<u>公斤</u></b><span class="note">也就是 ' + Math.round(lo * 2) + '~' + Math.round(hi * 2) + ' 斤' + (tw ? '' : ';孕早期共 0~2 公斤,孕中晚期每周约 ' + k[5] + ' 公斤(' + k[6] + '~' + k[7] + ')') + '</span>';
var wk = +st.wk;
if (wk >= 1 && wk <= 42) {
var rl, rh;
if (tw) { rl = lo * Math.min(1, wk / 40); rh = hi * Math.min(1, wk / 40); } /* 双胎没有分周推荐,按比例摊 */
else if (wk <= 13) { rl = 0; rh = 2 * wk / 13; }
else { rl = Math.min(lo, (wk - 13) * k[6]); rh = Math.min(hi, 2 + (wk - 13) * k[7]); }
var w1 = +st.w1, g = w1 > 30 ? w1 - w0 : null;
html += '<div class="row"><div><small>孕 ' + wk + ' 周建议已胖</small><b class="num">' + f1(rl) + '~' + f1(rh) + ' kg</b></div>' +
(g != null ? '<div><small>你已经胖了</small><b class="num">' + f1(g) + ' kg · ' + (g < rl - .05 ? '偏少' : g > rh + .05 ? '偏多' : '刚好') + '</b></div>' : '') + '</div>';
if (g != null) {
var mx = Math.max(rh * 1.6, g + 1, 2), mn = Math.min(0, g - 1), sc = function (v) { return ((v - mn) / (mx - mn) * 100).toFixed(1) + '%'; };
html += '<div class="gauge"><i class="ok" style="left:' + sc(rl) + ';width:calc(' + sc(rh) + ' - ' + sc(rl) + ')"></i><i class="me" style="left:' + sc(g) + '"></i></div><div class="glab"><span>偏少</span><span>合适范围</span><span>偏多</span></div>';
}
}
R.innerHTML = html;
}
paint();
})();
</script>
<script src="../_shared/brand.js?v=26110203"></script>
<script src="../../js/share-card.js?v=26110299"></script>
<script>window.mbShare('../../assets/share/t/zengzhong-js.jpg', '孕期增重范围:孕期胖多少才合适'); /* 11-04 微信转发图 */</script>
</body>
</html>