diff --git a/guangchang/ceshi/index.html b/guangchang/ceshi/index.html
index a3730f5..3a13a6a 100644
--- a/guangchang/ceshi/index.html
+++ b/guangchang/ceshi/index.html
@@ -3,7 +3,7 @@
-
+
测一测 · 孕妈广场
@@ -322,9 +322,9 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
-
-
-
+
+
+
+
孕妈广场
@@ -890,11 +890,11 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
-
-
-
-
-
+
+
+
+
+
+
我的投稿
@@ -107,7 +107,7 @@ main{padding:6px 16px 0}
-
+
-
+
+
@@ -2618,12 +2618,12 @@
-
+
-
+
-
+
-
+
diff --git a/js/app.js b/js/app.js
index 5e9607c..66873f5 100644
--- a/js/app.js
+++ b/js/app.js
@@ -3,7 +3,7 @@
(function () {
'use strict';
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
- var VER = '26110438';
+ var VER = '26110439';
const $ = (s, c) => (c || document).querySelector(s);
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
diff --git a/js/baby-limbs.js b/js/baby-limbs.js
index fc38b7d..f73d1df 100644
--- a/js/baby-limbs.js
+++ b/js/baby-limbs.js
@@ -119,6 +119,34 @@
}
const kick = () => { if (!raf && ready) raf = requestAnimationFrame(loop); };
+ /* 11-05 用户:「踢的时候给一个小音效,不要持续,只有踢的时候给一点点」
+ → 只在小腿 / 小脚动(=踢)时响一声,小胳膊动不响;WebAudio 现场合成一声很轻的「噗」(隔着水的低沉闷响 + 一个极轻的小气泡),约 0.2 秒、音量很小,不加载音频文件。
+ · 浏览器规定用户碰过页面后才能出声 → 第一次点 / 摸屏幕时才建 AudioContext,之前的踢腿不响。
+ · 页面在后台 / 首页不在前台时本来就不动,也就不响;系统「减少动态效果」整个文件不跑。
+ · URL 带 kicksound=0 关掉(调试用)。 */
+ let ac = null;
+ const soundOff = /[?]kicksound=0/.test(location.href);
+ const unlock = () => {
+ if (ac || soundOff) return;
+ try { const A = window.AudioContext || window.webkitAudioContext; if (A) { ac = new A(); if (ac.state === 'suspended') ac.resume(); } } catch (e) { ac = null; }
+ };
+ ['touchstart', 'pointerdown', 'click'].forEach(t => addEventListener(t, unlock, { passive: true, once: false, capture: true }));
+ function kickSound(delay) {
+ if (!ac || ac.state !== 'running') return;
+ const t = ac.currentTime + delay / 1000;
+ // 闷响:正弦 150→60Hz 快速下滑,低通滤掉高频,像隔着肚皮
+ const o = ac.createOscillator(), g = ac.createGain(), lp = ac.createBiquadFilter();
+ o.type = 'sine'; o.frequency.setValueAtTime(150, t); o.frequency.exponentialRampToValueAtTime(60, t + .16);
+ lp.type = 'lowpass'; lp.frequency.value = 420;
+ g.gain.setValueAtTime(0.0001, t); g.gain.exponentialRampToValueAtTime(0.16, t + .012); g.gain.exponentialRampToValueAtTime(0.0001, t + .2);
+ o.connect(lp); lp.connect(g); g.connect(ac.destination); o.start(t); o.stop(t + .22);
+ // 小气泡:很轻的上滑「啵」,晚一点点
+ const b = ac.createOscillator(), bg = ac.createGain(), t2 = t + .05;
+ b.type = 'sine'; b.frequency.setValueAtTime(520, t2); b.frequency.exponentialRampToValueAtTime(900, t2 + .07);
+ bg.gain.setValueAtTime(0.0001, t2); bg.gain.exponentialRampToValueAtTime(0.025, t2 + .01); bg.gain.exponentialRampToValueAtTime(0.0001, t2 + .09);
+ b.connect(bg); bg.connect(ac.destination); b.start(t2); b.stop(t2 + .1);
+ }
+
// 安排下一次「动一动」
function plan() {
clearTimeout(timer);
@@ -134,6 +162,7 @@
const f = cfg.l.findIndex(x => x[6] === 'foot');
if (l[6] === 'leg' && f >= 0 && Math.random() < .4)
moves.push({ i: f, t0: now + 300, dur: dur - 200, amp: -dir * cfg.l[f][5] * .7 * (DEBUG ? 4 : 1) * Math.PI / 180 });
+ if (l[6] === 'leg' || l[6] === 'foot') kickSound(dur * .3); // 踢到最快那一下时响(缓起缓落,约 3 成处)
kick();
}
plan();
diff --git a/js/gch/v4.js b/js/gch/v4.js
index 468cddc..406db6a 100644
--- a/js/gch/v4.js
+++ b/js/gch/v4.js
@@ -244,5 +244,5 @@
}
/* feed.js 首页默认不加载(index.html 只引了 topics.js),这里按需拉一次 */
if (window.GC_FEED) init();
- else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110438'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
+ else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110439'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
})();
diff --git a/js/gch/v6.js b/js/gch/v6.js
index fd50905..9cdd398 100644
--- a/js/gch/v6.js
+++ b/js/gch/v6.js
@@ -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=26110438';
+ var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110439';
document.head.appendChild(l);
- var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110438';
+ var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110439';
s.onload = function () { if (sec.querySelector('.g4-foot')) merge(); else sec.addEventListener('gc4-ready', merge, { once: true }); }; /* v4 要先拉 feed.js 才渲染 */
document.body.appendChild(s);
diff --git a/js/kit.js b/js/kit.js
index 522c016..36b6b74 100644
--- a/js/kit.js
+++ b/js/kit.js
@@ -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 = '26110438';
+ var V = '26110439';
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');
diff --git a/js/share-card.js b/js/share-card.js
index dc64a08..cc40341 100644
--- a/js/share-card.js
+++ b/js/share-card.js
@@ -8,7 +8,7 @@
postMessage 不是实时投递,微信在分享那一刻才派发,所以每次换内容都要再报一次;子页面没引 jweixin,这里按需加载。 */
(function (g) {
'use strict';
- var V = '26110438';
+ var V = '26110439';
var isWx = /MicroMessenger/i.test(navigator.userAgent || '');
var waiting = [], loading = false;
function ready(cb) {
diff --git a/topic/_shared/tools.js b/topic/_shared/tools.js
index fc49207..0e29b5e 100644
--- a/topic/_shared/tools.js
+++ b/topic/_shared/tools.js
@@ -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/.jpg(核心词大字 + logo),见 js/share-card.js */
- if (SLUG) (function () { var s = document.createElement('script'); s.src = '../../js/share-card.js?v=26110438'; 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=26110439'; 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=26110438').then(function (idx) {
+ getJSON('../_shared/idx.json?v=26110439').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 && (window.__mbUgc || ['ceshi', 'duiyou'].indexOf(x[0]) < 0); }); /* UGC 关着不推两个测试 */
@@ -177,13 +177,13 @@
}
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=26110438').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
+ getJSON('../_shared/cm/' + SLUG + '.json?v=26110439').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
}
function ugcReady() {
if (window.__mbUgcReady) return window.__mbUgcReady;
return new Promise(function (res) {
- var u = document.createElement('script'); u.src = '../../js/ugc.js?v=26110438';
+ var u = document.createElement('script'); u.src = '../../js/ugc.js?v=26110439';
u.onload = function () { (window.__mbUgcReady || Promise.resolve(false)).then(res); };
u.onerror = function () { res(false); };
document.head.appendChild(u);
diff --git a/topic/butie-js/index.html b/topic/butie-js/index.html
index 6cc25fd..bd23985 100644
--- a/topic/butie-js/index.html
+++ b/topic/butie-js/index.html
@@ -11,8 +11,8 @@
月数按「自然月」数:从 max(出生月, 2025-01) 起,到满 3 周岁那个月之前为止(结果标「约」,以当地核定为准)。
最多填 3 个孩子;还没出生的填预产期先算。地方另有加码的(如部分城市每孩另发)不在这里算。
共用 ../_shared/calc.css + calc.js(返回 / 禁回弹 / 日期按北京时间 / 记住上次填的值);自成一页,不引 app.js。 -->
-
-
+
+
@@ -46,7 +46,7 @@
地方可能另有补贴:部分城市在国家 3600 元之外还另发生育补贴、育儿补贴,问一下当地卫健部门或看政务平台。
-
+
-
+
-
+