孕妈悄悄话:留言抽屉底部常露一截、弹窗星空版+三步规则、找人帮我点赞、变星特效、背景小星可点、内容卡自动消失
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,10 +9,10 @@
|
||||
<title>兜爸心选 · 孕育陪伴</title>
|
||||
<!-- 11-04 UGC 总开关(孕妈广场 + 测一测,后台 /box_bm/plaza 顶部切换),见 js/ugc.js -->
|
||||
<script src="js/ugc.js?v=26110487"></script>
|
||||
<!-- V:26110618 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<!-- V:26110621 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||
<link rel="stylesheet" href="mama-box.css">
|
||||
<link rel="stylesheet" href="night.css?v=26110608">
|
||||
<link rel="stylesheet" href="js/wh-cm.css?v=26110619">
|
||||
<link rel="stylesheet" href="js/wh-cm.css?v=26110621">
|
||||
<!-- 11-04 用户:「顶部图片上的倒计时先删除掉」→ 不加载 hero-cd.css / hero-cd.js(文件留着,加回这两行即恢复),头图回到原样式 -->
|
||||
<!-- 夜晚模式:首屏绘制前就按上次的选择加 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>
|
||||
@@ -2680,7 +2680,7 @@ html.night .rs-pan .rp-card{background:rgba(255,255,255,.06);border-color:rgba(2
|
||||
<script src="guangchang/topics.js?v=26110487"></script>
|
||||
<script src="js/ava-pool.js?v=26110487"></script> <!-- 11-05 装饰头像分配表(各模块互不重复) -->
|
||||
<script src="js/wh-themes.js?v=26110609"></script>
|
||||
<script src="js/wh-cm.js?v=26110620" defer></script>
|
||||
<script src="js/wh-cm.js?v=26110621" defer></script>
|
||||
<script src="js/app.js"></script>
|
||||
<script src="js/kit.js?v=26110605"></script>
|
||||
<!-- 11-05 用户:孕期百问加上跟趣味小测试一样的底部 Tab(孕期百问 / 记一下 / 返回首页)。挂在 #detailQA 里,面板关着时跟着滑出屏外;
|
||||
|
||||
33
js/app.js
33
js/app.js
@@ -3,7 +3,7 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
||||
var VER = '26110618';
|
||||
var VER = '26110621';
|
||||
const $ = (s, c) => (c || document).querySelector(s);
|
||||
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
||||
|
||||
@@ -4553,6 +4553,9 @@
|
||||
card.classList.remove('show');
|
||||
void card.offsetWidth;
|
||||
card.classList.add('show');
|
||||
/* 11-07 用户:这句话呈现出来之后,过几秒钟就让它消失 */
|
||||
clearTimeout(paintCard.t);
|
||||
paintCard.t = setTimeout(() => card.classList.remove('show'), 6500);
|
||||
const pal = it.mine ? ['#A8723A', '#E0A86A'] : AURA[(i - 1) % AURA.length];
|
||||
const au = $$('#whvAura i');
|
||||
au[0].style.backgroundColor = pal[0]; au[1].style.backgroundColor = pal[1];
|
||||
@@ -4766,6 +4769,29 @@
|
||||
mts.set(i, m);
|
||||
m.raf = requestAnimationFrame(frame);
|
||||
}
|
||||
/* 11-07 用户:「背后的一些小星星也可以点」—— 点到装饰小星附近,借一颗还没在飞的亮星挪到那儿划出去
|
||||
(话按顺序轮着来,所以背景星点不完;小星本身闪一下) */
|
||||
$('#wsk').addEventListener('click', e => {
|
||||
if (e.target.closest('.wsk-st')) return;
|
||||
const l = list(); if (!l.length) return;
|
||||
let best = null, bd = 24 * 24;
|
||||
$$('#wskStars i').forEach(d => {
|
||||
const r = d.getBoundingClientRect(), dx = r.left + r.width / 2 - e.clientX, dy = r.top + r.height / 2 - e.clientY, dd = dx * dx + dy * dy;
|
||||
if (dd < bd) { bd = dd; best = d; }
|
||||
});
|
||||
if (!best) return;
|
||||
let i = 0;
|
||||
for (let k = 1; k <= l.length; k++) { const j = (deco.n + k) % l.length; if (!mts.has(j + 1)) { i = j + 1; break; } }
|
||||
if (!i) return;
|
||||
deco.n = i - 1 + 1;
|
||||
const btn = $('.wsk-st[data-go="' + i + '"]', page); if (!btn) return;
|
||||
btn.style.left = best.style.left; btn.style.top = best.style.top;
|
||||
btn.classList.remove('used', 'born');
|
||||
best.classList.add('pk'); setTimeout(() => best.classList.remove('pk'), 900);
|
||||
haptic(); drawer(false);
|
||||
launch(i);
|
||||
});
|
||||
const deco = { n: 0 };
|
||||
function nextStar() {
|
||||
const l = list(), n = l.length;
|
||||
for (let k = 1; k <= n; k++) {
|
||||
@@ -4838,7 +4864,7 @@
|
||||
function load(w, silent) {
|
||||
wk = w;
|
||||
if (!w) { data = null; show(false); return; }
|
||||
fetch(API + '?openid=' + encodeURIComponent(oid() || '') + '&week=' + w)
|
||||
fetch(API + '?openid=' + encodeURIComponent(oid() || '') + '&week=' + w + '&more=1') /* 11-07 用户:星星再多一些 */
|
||||
.then(r => (r.ok ? r.json() : null))
|
||||
.then(j => {
|
||||
const r = j && j.code === 200 && j.result;
|
||||
@@ -4872,6 +4898,7 @@
|
||||
page.setAttribute('aria-hidden', 'false');
|
||||
let gw = 0;
|
||||
try { const g = JSON.parse(localStorage.getItem('mmbox.gcwk.v1') || 'null'); gw = g && !g.pp && g.w ? +g.w : 0; } catch (e) {}
|
||||
if (gw < 4 && /[?&]wc=/.test(location.search)) gw = 20; /* 别人转发来请你点赞的:没建档也打开(孕周以服务端档案为准,没有就随便取一周的星空) */
|
||||
if (gw >= 4) setTimeout(() => load(gw), 0); else setTimeout(autoFail, 0);
|
||||
}
|
||||
function autoFail() {
|
||||
@@ -4941,7 +4968,7 @@
|
||||
ta.placeholder = th && th.ph ? th.ph : '今天想对谁说点什么?';
|
||||
$('#whPresets').innerHTML = ((th && th.presets && th.presets.length) ? th.presets : (data.presets || [])).map(t => '<button class="wh-pre" type="button">' + esc(t) + '</button>').join('');
|
||||
$('#whLeft').textContent = window.MBWhCm ? '' : '今天还能说 ' + data.left + ' 句';
|
||||
if (window.MBWhCm) { $('#whMLead').textContent = '发出去先审核,通过了大家就能在留言里看到。被赞够 ' + MBWhCm.starLikes() + ' 次,它会变成天上的一颗星星,同孕周的妈妈都点得到。'; }
|
||||
if (window.MBWhCm && MBWhCm.fillModal) MBWhCm.fillModal(); /* 11-07 弹窗重新设计(规则三步走 + 星空样式),见 js/wh-cm.js */
|
||||
openModal('modalWhisper');
|
||||
});
|
||||
$('#whPresets').addEventListener('click', e => {
|
||||
|
||||
119
js/wh-cm.css
119
js/wh-cm.css
@@ -1,39 +1,38 @@
|
||||
/* 星空页 · 妈妈们的留言(2026-11-07,js/wh-cm.js)
|
||||
二改:从「整页上滑盖住星空」改成半屏面板 —— 最高 68%,上面始终露出星空;深靛紫玻璃,跟星空一个色系 */
|
||||
|
||||
/* 入口:「说一句」下面一条 */
|
||||
.wcm-go{display:flex;align-items:center;gap:8px;width:100%;margin:10px 0 0;height:44px;padding:0 14px 0 10px;border:0;border-radius:14px;font:inherit;color:#F4ECFF;text-align:left;
|
||||
background:linear-gradient(135deg,rgba(255,255,255,.12),rgba(255,255,255,.05));box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
|
||||
.wcm-go:active{transform:scale(.985)}
|
||||
.wcm-go-av{display:flex;flex:none}
|
||||
.wcm-go-av img{width:24px;height:24px;border-radius:50%;object-fit:cover;box-shadow:0 0 0 1.5px #2A1F48;background:#3A2F5E}
|
||||
.wcm-go-av img+img{margin-left:-7px}
|
||||
.wcm-go-t{flex:1;min-width:0;font-size:14px;font-weight:700}
|
||||
.wcm-go-t em{margin-left:6px;font-style:normal;font-size:12px;font-weight:400;color:rgba(232,222,255,.55)}
|
||||
.wcm-go-up{flex:none;width:8px;height:8px;margin-top:4px;border:solid #FFD9B8;border-width:2px 0 0 2px;transform:rotate(45deg);animation:wcmUp 1.6s ease-in-out infinite}
|
||||
@keyframes wcmUp{50%{transform:translateY(-3px) rotate(45deg)}}
|
||||
.wh-page .whp-left{margin-top:7px}
|
||||
/* 入口占了一行,流星内容卡往上让一让 */
|
||||
.wh-page .wsc{bottom:calc(150px + env(safe-area-inset-bottom))}
|
||||
/* 三改(11-07):去掉「看看大家说了啥」入口 → 抽屉平时在底部露一截(--wpk 由 wh-cm.js 写),「说一句」和流星内容卡往上让 */
|
||||
.wh-page .whp-left{display:none}
|
||||
.wh-page .whp-bar{bottom:var(--wpk,58px);padding-bottom:12px}
|
||||
.wh-page .wsc{bottom:calc(var(--wpk,58px) + 104px)}
|
||||
/* 原来的「全部」抽屉不用了 */
|
||||
.wh-page .whd{display:none}
|
||||
|
||||
/* 半屏面板 */
|
||||
.wcs{position:absolute;inset:0;z-index:8;background:rgba(10,6,24,0);visibility:hidden;transition:background .3s,visibility .3s}
|
||||
.wcs.show{visibility:visible;background:rgba(10,6,24,.32)}
|
||||
.wcs-p{position:absolute;left:0;right:0;bottom:0;height:50%;max-height:68%;display:flex;flex-direction:column;border-radius:22px 22px 0 0;color:#F4ECFF;
|
||||
.wcs{position:absolute;inset:0;z-index:8;background:rgba(10,6,24,0);pointer-events:none;transition:background .3s}
|
||||
.wcs.show{pointer-events:auto;background:rgba(10,6,24,.32)}
|
||||
.wcs-p{position:absolute;left:0;right:0;bottom:0;height:58px;max-height:76%;pointer-events:auto;overflow:hidden;display:flex;flex-direction:column;border-radius:22px 22px 0 0;color:#F4ECFF;
|
||||
background:linear-gradient(#2A1F48,#1E1634);box-shadow:0 -10px 40px rgba(0,0,0,.4);transform:translateY(110%);transition:transform .35s cubic-bezier(.2,.8,.2,1),height .3s cubic-bezier(.2,.8,.2,1)}
|
||||
.wcs.show .wcs-p{transform:none}
|
||||
.wh-page.show .wcs-p{transform:none}
|
||||
.wcs-hd{flex:none;padding:8px 0 6px;touch-action:none}
|
||||
.wcs-grab{display:block;width:38px;height:4px;margin:0 auto 8px;border-radius:2px;background:rgba(255,255,255,.28)}
|
||||
.wcs-tt{display:flex;align-items:baseline;gap:8px;padding:0 16px 0 18px}
|
||||
.wcs-tt b{font-size:16px;font-weight:800;letter-spacing:.5px}
|
||||
.wcs-tt span{font-size:12px;color:rgba(232,222,255,.5)}
|
||||
.wcs-x{margin-left:auto;align-self:center;display:grid;place-items:center;width:28px;height:28px;border:0;border-radius:50%;background:rgba(255,255,255,.1);color:#fff}
|
||||
.wcs-up{margin-left:auto;font-style:normal;font-size:12px;color:#FFD9B8;animation:wcmUp 1.6s ease-in-out infinite}
|
||||
@keyframes wcmUp{50%{transform:translateY(-3px)}}
|
||||
.wcs.show .wcs-up{display:none}
|
||||
.wcs-x{display:none!important}
|
||||
.wcs.show .wcs-x{display:grid!important;margin-left:auto;align-self:center;display:grid;place-items:center;width:28px;height:28px;border:0;border-radius:50%;background:rgba(255,255,255,.1);color:#fff}
|
||||
.wcm-tb{display:flex;align-items:center;gap:6px;margin:10px 18px 2px}
|
||||
.wcm-tb button{height:26px;padding:0 12px;border-radius:99px;border:0;background:rgba(255,255,255,.07);color:rgba(232,222,255,.62);font:inherit;font-size:12.5px}
|
||||
.wcm-tb button.on{background:linear-gradient(135deg,rgba(255,214,170,.92),rgba(255,170,160,.92));color:#3A2312;font-weight:800}
|
||||
.wcm-rule{margin-left:auto;font-size:11px;color:rgba(232,222,255,.42)}
|
||||
/* 重点:被赞 N 次就变成星星 */
|
||||
.wcs-rule{display:flex;align-items:center;gap:8px;margin:10px 14px 0;padding:9px 12px;border-radius:14px;font-size:13px;color:#FFF3E2;
|
||||
background:linear-gradient(110deg,rgba(255,200,150,.22),rgba(150,110,255,.22));box-shadow:inset 0 0 0 1px rgba(255,214,170,.3),0 0 18px rgba(255,200,150,.12)}
|
||||
.wcs-rule svg{flex:none;width:18px;height:18px;fill:#FFD9A0;filter:drop-shadow(0 0 4px rgba(255,214,160,.9));animation:wstTw 2.2s ease-in-out infinite}
|
||||
.wcs-rule b{font-size:16px;color:#FFD08A;margin:0 1px}
|
||||
@keyframes wstTw{50%{transform:scale(.8) rotate(20deg);opacity:.7}}
|
||||
.wcs-ls{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:0 12px 14px}
|
||||
.wcm-e{margin:24px 0;text-align:center;font-size:12.5px;color:rgba(232,222,255,.45)}
|
||||
.wcm-it{display:flex;gap:10px;margin-top:8px;padding:12px 10px 10px 12px;border-radius:16px;
|
||||
@@ -74,3 +73,83 @@
|
||||
/* 星星点完会再冒出来(app.js reborn) */
|
||||
.wsk-st.born i{animation:wskBorn 1.4s ease-out both}
|
||||
@keyframes wskBorn{0%{opacity:0;transform:scale(.2)}60%{opacity:1;transform:scale(1.35)}100%{opacity:1;transform:none}}
|
||||
|
||||
/* 背景小星被点到:闪一下(app.js 把一颗亮星挪过去) */
|
||||
.wsk-deco i.pk{animation:wskPk .6s ease-out}
|
||||
@keyframes wskPk{50%{transform:scale(2.4);opacity:1}}
|
||||
|
||||
/* 自己的留言:还差几个赞 + 找人帮我点赞 */
|
||||
.wcm-mf{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;margin:8px 0 0;font-size:11.5px;color:rgba(232,222,255,.62)}
|
||||
p.wcm-mf{display:block;color:#FFC07A}
|
||||
.wcm-pg{position:relative;width:54px;height:5px;border-radius:3px;background:rgba(255,255,255,.12);overflow:hidden}
|
||||
.wcm-pg i{position:absolute;left:0;top:0;bottom:0;border-radius:3px;background:linear-gradient(90deg,#FFD6AA,#FF9FB0)}
|
||||
.wcm-share{flex-basis:100%;height:32px;margin-top:2px;border:0;border-radius:99px;font:inherit;font-size:13px;font-weight:800;color:#3A2312;
|
||||
background:linear-gradient(135deg,#FFE0B5,#FFAAA0);box-shadow:0 4px 16px -4px rgba(255,170,150,.6)}
|
||||
.wcm-share:active{transform:scale(.97)}
|
||||
.wcm-it.hl{animation:wcmHl 2.4s ease}
|
||||
@keyframes wcmHl{0%,60%{box-shadow:inset 0 0 0 1.5px #FFD9A0,0 0 22px rgba(255,214,160,.45)}}
|
||||
|
||||
/* 转发引导 */
|
||||
.wsh-g{position:absolute;inset:0;z-index:20;background:rgba(8,5,20,.72);animation:wshIn .25s ease}
|
||||
@keyframes wshIn{from{opacity:0}}
|
||||
.wsh-arrow{position:absolute;right:26px;top:calc(10px + env(safe-area-inset-top));width:60px;height:70px;
|
||||
background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 70' fill='none' stroke='%23FFD9A0' stroke-width='3' stroke-linecap='round'%3E%3Cpath d='M8 66C12 36 28 18 48 8' stroke-dasharray='6 6'/%3E%3Cpath d='M36 6l13 2-4 12'/%3E%3C/svg%3E") center/contain no-repeat;animation:wshA 1.2s ease-in-out infinite}
|
||||
@keyframes wshA{50%{transform:translate(4px,-4px)}}
|
||||
.wsh-c{position:absolute;left:28px;right:28px;top:120px;padding:22px 20px 18px;border-radius:22px;text-align:center;color:#F4ECFF;
|
||||
background:linear-gradient(#2E2350,#1F1738);box-shadow:inset 0 0 0 1px rgba(255,214,170,.25),0 20px 50px rgba(0,0,0,.5)}
|
||||
.wsh-c b{font-size:18px;color:#FFD9A0}
|
||||
.wsh-c p{margin:8px 0 0;font-size:13.5px;line-height:1.6;color:rgba(232,222,255,.8)}
|
||||
.wsh-c p.q{margin-top:12px;padding:10px 12px;border-radius:12px;background:rgba(255,255,255,.07);color:#fff}
|
||||
.wsh-c p.s{font-size:12.5px;color:#FFC9A0}
|
||||
.wsh-c button{margin-top:14px;height:38px;padding:0 34px;border:0;border-radius:99px;font:inherit;font-size:14px;font-weight:800;color:#3A2312;background:linear-gradient(135deg,#FFE0B5,#FFAAA0)}
|
||||
|
||||
/* 变成星星的特效:一颗星从底下升上去,炸开碎星,亮出那句话 */
|
||||
.wst-fx{position:absolute;inset:0;z-index:21;background:radial-gradient(60% 40% at 50% 34%,rgba(120,80,200,.35),rgba(8,5,20,.78));animation:wshIn .4s ease;overflow:hidden}
|
||||
.wst-fx.out{opacity:0;transition:opacity .5s}
|
||||
.wst-star,.wst-ring,.wst-sp{position:absolute;left:50%;top:30%}
|
||||
.wst-star{width:64px;height:64px;margin:-32px 0 0 -32px;
|
||||
background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M10 .5C10.9 7.4 12.6 9.1 19.5 10 12.6 10.9 10.9 12.6 10 19.5 9.1 12.6 7.4 10.9.5 10 7.4 9.1 9.1 7.4 10 .5Z' fill='%23FFF6E4'/%3E%3C/svg%3E") center/contain no-repeat;
|
||||
filter:drop-shadow(0 0 10px #FFD9A0) drop-shadow(0 0 26px rgba(255,200,140,.8));animation:wstUp 1.3s cubic-bezier(.3,.7,.3,1) both,wstGlow 1.8s 1.3s ease-in-out infinite}
|
||||
@keyframes wstUp{0%{transform:translateY(60vh) scale(.3);opacity:0}20%{opacity:1}80%{transform:translateY(-6px) scale(1.15)}100%{transform:none}}
|
||||
@keyframes wstGlow{50%{transform:scale(1.18) rotate(12deg)}}
|
||||
.wst-ring{width:20px;height:20px;margin:-10px 0 0 -10px;border-radius:50%;box-shadow:0 0 0 2px rgba(255,220,170,.9);opacity:0;animation:wstRing 1s 1.2s ease-out both}
|
||||
@keyframes wstRing{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(12)}}
|
||||
.wst-sp{width:6px;height:6px;margin:-3px 0 0 -3px;border-radius:50%;background:#FFE7C2;box-shadow:0 0 8px #FFD9A0;opacity:0;animation:wstSp 1s ease-out both}
|
||||
@keyframes wstSp{0%{opacity:1;transform:rotate(var(--a)) translateX(0)}100%{opacity:0;transform:rotate(var(--a)) translateX(var(--d)) scale(.4)}}
|
||||
.wst-tx{position:absolute;left:30px;right:30px;top:calc(30% + 60px);text-align:center;animation:wstTx .6s 1.4s ease-out both}
|
||||
@keyframes wstTx{from{opacity:0;transform:translateY(14px)}}
|
||||
.wst-tx b{display:block;font-size:22px;font-weight:900;letter-spacing:1px;color:#FFE2B0;text-shadow:0 0 18px rgba(255,200,140,.7)}
|
||||
.wst-tx p{margin:12px 0 0;font-size:15px;line-height:1.65;color:#fff}
|
||||
.wst-tx span{display:block;margin-top:10px;font-size:12.5px;color:rgba(232,222,255,.65)}
|
||||
@media (prefers-reduced-motion:reduce){.wst-star,.wst-sp,.wst-ring,.wst-tx,.wcs-up,.wsh-arrow{animation:none!important}.wst-sp{display:none}}
|
||||
|
||||
/* 「说一句」弹窗 · 星空版(wh-cm.js fillModal 给 #modalWhisper 加 .wh-star) */
|
||||
#modalWhisper.wh-star{background:linear-gradient(170deg,#33265A 0%,#221A40 55%,#1B1533 100%);color:#F4ECFF;box-shadow:0 -14px 50px rgba(20,10,50,.6),inset 0 1px 0 rgba(255,255,255,.12);overflow-x:hidden}
|
||||
.wms-sky{display:none}
|
||||
#modalWhisper.wh-star .wms-sky{display:block;position:absolute;left:0;right:0;top:0;height:150px;pointer-events:none;opacity:.9;
|
||||
background:
|
||||
radial-gradient(1.5px 1.5px at 12% 22%,#fff,transparent),radial-gradient(1px 1px at 28% 60%,#fff,transparent),radial-gradient(1.5px 1.5px at 46% 14%,#FFE7C2,transparent),
|
||||
radial-gradient(1px 1px at 63% 40%,#fff,transparent),radial-gradient(2px 2px at 78% 18%,#FFE7C2,transparent),radial-gradient(1px 1px at 90% 52%,#fff,transparent),
|
||||
radial-gradient(1px 1px at 36% 84%,#fff,transparent),radial-gradient(1.5px 1.5px at 70% 76%,#fff,transparent),
|
||||
radial-gradient(80% 100% at 85% 0%,rgba(255,180,150,.18),transparent 70%)}
|
||||
#modalWhisper.wh-star .modal-head,#modalWhisper.wh-star>*{position:relative}
|
||||
#modalWhisper.wh-star .modal-head h3{color:#FFF1DE;font-size:21px;letter-spacing:.5px;text-shadow:0 0 16px rgba(255,200,150,.35)}
|
||||
#modalWhisper.wh-star .modal-x{background:rgba(255,255,255,.1);color:#E8DEFF}
|
||||
#modalWhisper.wh-star .wh-m-topic{margin-top:6px;color:#FFC9A0}
|
||||
#modalWhisper.wh-star .wh-m-topic span{color:rgba(232,222,255,.55)}
|
||||
#modalWhisper.wh-star .wh-m-lead{display:flex;gap:6px;margin-top:12px}
|
||||
.wms{flex:1;display:flex;flex-direction:column;align-items:center;gap:5px;padding:9px 4px 8px;border-radius:14px;font-size:11.5px;line-height:1.35;text-align:center;
|
||||
color:rgba(232,222,255,.75);background:rgba(255,255,255,.06);box-shadow:inset 0 0 0 1px rgba(255,255,255,.07)}
|
||||
.wms i{display:grid;place-items:center;width:20px;height:20px;border-radius:50%;font-style:normal;font-size:11px;font-weight:800;color:#2A1F48;background:rgba(232,222,255,.7)}
|
||||
.wms.hi{color:#FFF3E2;font-weight:700;background:linear-gradient(150deg,rgba(255,200,150,.3),rgba(150,110,255,.28));box-shadow:inset 0 0 0 1px rgba(255,214,170,.45),0 0 18px rgba(255,200,150,.2)}
|
||||
.wms.hi i{background:#FFD9A0;box-shadow:0 0 10px #FFD9A0}
|
||||
.wms.hi b{font-size:15px;color:#FFD08A}
|
||||
#modalWhisper.wh-star .wh-ta{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.14);color:#fff}
|
||||
#modalWhisper.wh-star .wh-ta::placeholder{color:rgba(232,222,255,.4)}
|
||||
#modalWhisper.wh-star .wh-ta:focus{border-color:rgba(255,214,170,.6);box-shadow:0 0 0 3px rgba(255,214,170,.12)}
|
||||
#modalWhisper.wh-star .wh-cnt{color:rgba(232,222,255,.4)}
|
||||
#modalWhisper.wh-star .wh-m-sub{color:rgba(232,222,255,.6);font-weight:600}
|
||||
#modalWhisper.wh-star .wh-pre{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.1);color:rgba(242,236,250,.85)}
|
||||
#modalWhisper.wh-star .wh-pre.on{background:rgba(255,214,170,.18);border-color:rgba(255,214,170,.6);color:#FFE2B8}
|
||||
#modalWhisper.wh-star .dl-btn.main{background:linear-gradient(135deg,#FFE0B5,#FFAAA0);color:#3A2312;box-shadow:0 10px 26px -8px rgba(255,170,150,.7)}
|
||||
#modalWhisper.wh-star .wh-left{color:rgba(232,222,255,.5)}
|
||||
|
||||
142
js/wh-cm.js
142
js/wh-cm.js
@@ -9,7 +9,10 @@
|
||||
模拟留言的赞只记本机 mmbox.whcm.v1。最热 / 最新 / 同孕周 三种看法。
|
||||
· 三改(用户:「我不能给别人的留言回复」):点留言上的「回复」→ 底部输入框回复那一楼(先审后发);
|
||||
底部输入框不点「回复」时就是发一条新留言。楼的 key 同广场:模拟 = wh-xxx#序号,真实 = r:<id>。
|
||||
· 星空页「说一句」发的话也进这里(window.MBWhCm.post,app.js 调)。 */
|
||||
· 星空页「说一句」发的话也进这里(window.MBWhCm.post,app.js 调)。
|
||||
· 四改(用户 11-07):去掉「看看大家说了啥」那条入口 → 抽屉平时在屏幕底部露一截(把手 + 标题),一滑就拉开,最高再往上一点(76%);
|
||||
「被赞 3 次就变成星星」做重点;自己的留言能转发出去请人帮点赞(宿主转发卡,链接 ?wh=1&wc=<评论id>,对方打开直接定位到这条);
|
||||
自己的话变成星星时放一段特效(每条只放一次,记在 mmbox.whstar.v1);说一句的弹窗换成星空样式(fillModal)。 */
|
||||
(function () {
|
||||
var page = document.getElementById('whPage'), bar = page && page.querySelector('.whp-bar');
|
||||
if (!page || !bar || !window.MB_WH_THEME) return;
|
||||
@@ -18,20 +21,16 @@
|
||||
var m = ((location.hash || '') + '&').match(/[#&]openid=([^&]*)/), OID = m ? decodeURIComponent(m[1]) : '';
|
||||
var HEART = '<svg viewBox="0 0 24 24"><path d="M12 20.5s-7.5-4.6-7.5-10.2A4.3 4.3 0 0112 7.6a4.3 4.3 0 017.5 2.7c0 5.6-7.5 10.2-7.5 10.2z"/></svg>';
|
||||
|
||||
/* 入口:「说一句」下面一条,带几个头像 + 条数,看得出能点 */
|
||||
var go = document.createElement('button');
|
||||
go.type = 'button'; go.className = 'wcm-go'; go.id = 'wcmGo';
|
||||
go.innerHTML = '<span class="wcm-go-av" id="wcmGoAv"></span><span class="wcm-go-t">看看大家说了啥<em id="wcmGoN"></em></span><i class="wcm-go-up" aria-hidden="true"></i>';
|
||||
bar.appendChild(go);
|
||||
var WC = (location.search.match(/[?&]wc=([A-Za-z0-9]{1,40})/) || [])[1] || ''; /* 别人转发来请我点赞的那条 */
|
||||
|
||||
/* 半屏面板 */
|
||||
var sh = document.createElement('div');
|
||||
sh.className = 'wcs'; sh.id = 'wcs'; sh.setAttribute('aria-hidden', 'true');
|
||||
sh.innerHTML = '<div class="wcs-p" role="dialog" aria-label="妈妈们的留言">' +
|
||||
'<div class="wcs-hd"><i class="wcs-grab" aria-hidden="true"></i><div class="wcs-tt"><b>妈妈们的留言</b><span id="wcmN"></span>' +
|
||||
'<div class="wcs-hd"><i class="wcs-grab" aria-hidden="true"></i><div class="wcs-tt"><b>妈妈们的留言</b><span id="wcmN"></span><i class="wcs-up">上滑看看</i>' +
|
||||
'<button type="button" class="wcs-x" aria-label="收起"><svg viewBox="0 0 24 24" width="14" height="14"><path d="M6 6l12 12M18 6L6 18" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"/></svg></button></div>' +
|
||||
'<div class="wcm-tb" role="tablist"><button type="button" class="on" data-wso="hot">最热</button><button type="button" data-wso="new">最新</button><button type="button" data-wso="wk">同孕周</button>' +
|
||||
'<span class="wcm-rule" id="wcmRule"></span></div></div>' +
|
||||
'<div class="wcs-rule"><svg viewBox="0 0 20 20"><path d="M10 .5C10.9 7.4 12.6 9.1 19.5 10 12.6 10.9 10.9 12.6 10 19.5 9.1 12.6 7.4 10.9.5 10 7.4 9.1 9.1 7.4 10 .5Z"/></svg><span>留言被赞 <b id="wcmRuleN">3</b> 次,就会变成一颗星星挂上去</span></div>' +
|
||||
'<div class="wcm-tb" role="tablist"><button type="button" class="on" data-wso="hot">最热</button><button type="button" data-wso="new">最新</button><button type="button" data-wso="wk">同孕周</button></div></div>' +
|
||||
'<div class="wcs-ls" id="wcsLs"><div id="wcmLs"><p class="wcm-e">留言加载中…</p></div><button type="button" class="wcm-more" id="wcmMore" hidden>再看看</button></div>' +
|
||||
'<div class="wcs-in"><span class="wcs-to" id="wcsTo" hidden></span><input id="wcsIn" type="text" maxlength="200" enterkeyhint="send" placeholder="说点什么…"><button type="button" id="wcsSend">发送</button></div>' +
|
||||
'</div>';
|
||||
@@ -83,14 +82,68 @@
|
||||
RREP = (R.list || []).filter(function (c) { return !top(c); }).map(function (c) { return repOf(c, 0); })
|
||||
.concat(mine.filter(function (c) { return !top(c); }).map(function (c) { return repOf(c, 1); }));
|
||||
build(); paintGo();
|
||||
celebrate(); focusWc();
|
||||
}).catch(function () { if (!REAL) { REAL = []; build(); } });
|
||||
}
|
||||
/* ---------- 我的话变成星星:特效(每条只放一次) ---------- */
|
||||
var SK = 'mmbox.whstar.v1';
|
||||
function celebrate() {
|
||||
var done = {}; try { done = JSON.parse(localStorage.getItem(SK) || '{}') || {}; } catch (e) {}
|
||||
var c = (REAL || []).filter(function (x) { return x.me && x.star && !done[x.id]; })[0];
|
||||
if (!c) return;
|
||||
done[c.id] = 1; try { localStorage.setItem(SK, JSON.stringify(done)); } catch (e) {}
|
||||
setTimeout(function () { if (page.classList.contains('show')) starFx(c.t, true); }, 1200);
|
||||
}
|
||||
function starFx(text, mine) {
|
||||
snap('closed');
|
||||
var fx = document.createElement('div');
|
||||
fx.className = 'wst-fx';
|
||||
fx.innerHTML = '<i class="wst-ring"></i><i class="wst-star"></i>' + Array.apply(null, Array(14)).map(function (_, k) {
|
||||
return '<i class="wst-sp" style="--a:' + (k * 360 / 14) + 'deg;--d:' + (60 + Math.random() * 70).toFixed(0) + 'px;animation-delay:' + (1.25 + Math.random() * .2).toFixed(2) + 's"></i>'; }).join('') +
|
||||
'<div class="wst-tx"><b>' + (mine ? '你的话变成星星啦' : '这句变成星星啦') + '</b><p>“' + esc(text.length > 40 ? text.slice(0, 39) + '…' : text) + '”</p><span>' +
|
||||
(mine ? '同孕周的妈妈点开星空,就能看到你对宝宝说的话' : '谢谢你帮她点亮') + '</span></div>';
|
||||
page.appendChild(fx);
|
||||
if (navigator.vibrate) navigator.vibrate([10, 60, 20]);
|
||||
fx.addEventListener('click', function () { fx.classList.add('out'); setTimeout(function () { fx.remove(); }, 500); });
|
||||
setTimeout(function () { if (fx.isConnected) { fx.classList.add('out'); setTimeout(function () { fx.remove(); }, 500); } }, 5200);
|
||||
}
|
||||
/* ---------- 转发求赞 ---------- */
|
||||
function shareMine(id) {
|
||||
var c = (REAL || []).filter(function (x) { return x.id === id; })[0]; if (!c) return;
|
||||
var href = location.origin + location.pathname + '?wh=1&wc=' + encodeURIComponent(id);
|
||||
var title = '帮我点个赞吧!被赞 ' + STAR_N + ' 次,我对宝宝说的话就能变成一颗星星';
|
||||
var img = new URL('assets/share/g/home.jpg', document.baseURI).href;
|
||||
if (window.wxAuth && wxAuth.reportLocation) wxAuth.reportLocation({ href: href, title: title, imageUrl: img });
|
||||
var g = document.createElement('div');
|
||||
g.className = 'wsh-g';
|
||||
g.innerHTML = '<i class="wsh-arrow"></i><div class="wsh-c"><b>点右上角「···」</b><p>选「发送给朋友」或发到群里,<br>请她们帮你点个赞</p><p class="q">“' + esc(c.t.length > 30 ? c.t.slice(0, 29) + '…' : c.t) + '”</p>' +
|
||||
'<p class="s">还差 ' + Math.max(0, STAR_N - c.likes) + ' 个赞,就变成星星了</p><button type="button">知道了</button></div>';
|
||||
page.appendChild(g);
|
||||
g.addEventListener('click', function (e) { if (e.target === g || e.target.closest('button')) g.remove(); });
|
||||
}
|
||||
/* 打开的是别人转发来的链接:拉开抽屉、把那条放最前并闪一下 */
|
||||
function focusWc() {
|
||||
if (!WC || !REAL || !SIM) return;
|
||||
var w = WC; WC = '';
|
||||
try { var q = new URLSearchParams(location.search); q.delete('wc'); history.replaceState(history.state, '', location.pathname + (q.toString() ? '?' + q : '') + location.hash); } catch (e) {}
|
||||
var c = REAL.filter(function (x) { return x.id === w; })[0];
|
||||
if (!c) { toast('这条留言还在审核,或者已经找不到了'); return; }
|
||||
REAL = [c].concat(REAL.filter(function (x) { return x !== c; }));
|
||||
c.pin = 1; build();
|
||||
setTimeout(function () {
|
||||
snap('full');
|
||||
var el = ls.querySelector('.wcm-it[data-k="' + CSS.escape(c.key) + '"]');
|
||||
if (el) { el.classList.add('hl'); lsBox.scrollTop = 0; }
|
||||
toast(c.star ? '这句已经变成星星啦' : (c.me ? '这是你的留言' : '帮她点个赞,让这句话变成星星'));
|
||||
}, 600);
|
||||
}
|
||||
var wkOf = function (c) { var x = /孕\s*(\d+)\s*周/.exec(c.s || ''); return x ? +x[1] : 0; };
|
||||
var likesOf = function (c) { return c.real ? c.likes : c.likes + (LIKE[c.key] ? 1 : 0); };
|
||||
var likedOf = function (c) { return c.real ? c.liked : !!LIKE[c.key]; };
|
||||
/* 最热:挂了星的在前,再按赞;最新:真实留言按时间,模拟的接在后面;同孕周:和我差 ±1 周的,按最热。我自己发的永远在最上面 */
|
||||
function sorted() {
|
||||
var mine = REAL.filter(function (c) { return c.me; }), rest = REAL.filter(function (c) { return !c.me; }).concat(SIM);
|
||||
var pin = REAL.filter(function (c) { return c.pin; });
|
||||
var mine = REAL.filter(function (c) { return c.me && !c.pin; }), rest = REAL.filter(function (c) { return !c.me && !c.pin; }).concat(SIM);
|
||||
var hot = function (a, b) { return (!!b.star - !!a.star) || (likesOf(b) - likesOf(a)); };
|
||||
if (SORT === 'new') rest = rest.filter(function (c) { return c.real; }).sort(function (a, b) { return b.ts - a.ts; }).concat(SIM);
|
||||
else if (SORT === 'wk') {
|
||||
@@ -98,20 +151,17 @@
|
||||
rest = w ? rest.filter(function (c) { var k = wkOf(c); return k && Math.abs(k - w) <= 1; }) : [];
|
||||
rest.sort(hot);
|
||||
} else rest.sort(hot);
|
||||
return mine.sort(function (a, b) { return b.ts - a.ts; }).concat(rest);
|
||||
return pin.concat(mine.sort(function (a, b) { return b.ts - a.ts; }), rest);
|
||||
}
|
||||
function total() { return (REAL ? REAL.length : 0) + (SIM ? SIM.length : 0); }
|
||||
function paintGo() {
|
||||
var n = total();
|
||||
document.getElementById('wcmGoN').textContent = n ? n + ' 条' : '';
|
||||
var av = (SIM || []).slice(0, 3).map(function (c) { return '<img src="' + esc(c.av) + '" alt="">'; }).join('');
|
||||
document.getElementById('wcmGoAv').innerHTML = av;
|
||||
document.getElementById('wcmN').textContent = total() ? total() + ' 条' : '';
|
||||
document.getElementById('wcmRuleN').textContent = STAR_N;
|
||||
}
|
||||
function build() {
|
||||
if (!SIM || !REAL) return;
|
||||
ALL = sorted(); shown = 0; ls.innerHTML = '';
|
||||
document.getElementById('wcmN').textContent = total() ? total() + ' 条' : '';
|
||||
document.getElementById('wcmRule').textContent = '被赞 ' + STAR_N + ' 次就变成星星';
|
||||
paintGo();
|
||||
if (!ALL.length) {
|
||||
ls.innerHTML = '<p class="wcm-e">' + (SORT === 'wk' ? (window.MB_WH_WEEK ? '同孕周的妈妈还没留言,你先说一句吧' : '填好预产期,就能看同孕周妈妈说了啥') : '还没有人留言') + '</p>';
|
||||
more.hidden = true; return;
|
||||
@@ -133,10 +183,18 @@
|
||||
return '<p' + (x.me ? ' class="me"' : '') + '><b>' + esc(x.n) + '</b>' + (x.to && x.to !== c.n ? ' 回复 <b>' + esc(x.to) + '</b>' : '') + ':' + esc(x.t) +
|
||||
(x.st === 'pending' ? '<span class="wcm-st">(审核中)</span>' : '') + '</p>';
|
||||
}).join('') + '</div>' : '') +
|
||||
(c.me ? '' : '<button type="button" class="wcm-re" data-wrp="' + esc(c.key) + '">回复</button>') + '</div>' +
|
||||
(c.me ? mineFoot(c) : '<button type="button" class="wcm-re" data-wrp="' + esc(c.key) + '">回复</button>') + '</div>' +
|
||||
(c.me ? '<span class="wcm-lk me">' + HEART + '<span>' + fmt(likesOf(c)) + '</span></span></div>' :
|
||||
'<button type="button" class="wcm-lk' + (on ? ' on' : '') + '" data-wcl="' + esc(c.key) + '" aria-label="赞">' + HEART + '<span>' + fmt(likesOf(c)) + '</span></button></div>');
|
||||
}
|
||||
/* 自己的留言底下:还差几个赞 + 找人帮我点赞(审核通过才能转) */
|
||||
function mineFoot(c) {
|
||||
if (c.star) return '';
|
||||
if (c.st !== 'approved') return '<p class="wcm-mf">审核通过后,就能转给朋友帮你点赞</p>';
|
||||
var n = Math.min(c.likes, STAR_N);
|
||||
return '<div class="wcm-mf"><span class="wcm-pg"><i style="width:' + Math.round(n / STAR_N * 100) + '%"></i></span><span>' + n + '/' + STAR_N + ' 个赞,还差 ' + (STAR_N - n) + ' 个就变成星星</span>' +
|
||||
'<button type="button" class="wcm-share" data-wsh="' + esc(c.id) + '">找人帮我点赞</button></div>';
|
||||
}
|
||||
function add(k) {
|
||||
ls.insertAdjacentHTML('beforeend', ALL.slice(shown, shown + k).map(item).join(''));
|
||||
shown = Math.min(ALL.length, shown + k); more.hidden = shown >= ALL.length;
|
||||
@@ -153,6 +211,8 @@
|
||||
inp.placeholder = c ? '回复 ' + c.n + '…' : '说点什么…';
|
||||
}
|
||||
ls.addEventListener('click', function (e) {
|
||||
var sb = e.target.closest('[data-wsh]');
|
||||
if (sb) { shareMine(sb.dataset.wsh); return; }
|
||||
var r = e.target.closest('[data-wrp]');
|
||||
if (r) {
|
||||
var rc = ALL.filter(function (x) { return x.key === r.dataset.wrp; })[0]; if (!rc) return;
|
||||
@@ -175,7 +235,7 @@
|
||||
.then(function (x) { return x.json(); }).then(function (j) {
|
||||
if (!j || j.code !== 200) throw j;
|
||||
c.likes = j.result.likes; var was = c.star; c.star = !!j.result.star; paintLk(b, c);
|
||||
if (c.star && !was) { toast('被赞够 ' + STAR_N + ' 次,这句变成星星啦'); rerender(c); }
|
||||
if (c.star && !was) { rerender(c); starFx(c.t, false); }
|
||||
}).catch(function (j) { c.liked = false; c.likes--; paintLk(b, c); toast((j && j.message) || '网络不太好,再点一次试试'); });
|
||||
});
|
||||
sh.querySelector('.wcm-tb').addEventListener('click', function (e) {
|
||||
@@ -219,29 +279,30 @@
|
||||
inp.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); send(); } });
|
||||
|
||||
/* ---------- 半屏面板:开 / 关 / 拖 ----------
|
||||
按高度伸缩(底部输入框一直露着):half = 星空页 50%,full = 68%(上面至少留 1/3 星空),再往上拉不动;往下拖到 25% 以下关掉 */
|
||||
var state = 'closed';
|
||||
按高度伸缩(底部输入框一直露着):closed = 底部露一截(把手 + 标题,PEEK px),half = 55%,full = 76%(上面留出一块星空),再往上拉不动 */
|
||||
var state = 'closed', PEEK = 58;
|
||||
(function () { /* 底部露一截要加上 iPhone 底部安全区 */
|
||||
var pr = document.createElement('i'); pr.style.cssText = 'position:absolute;height:env(safe-area-inset-bottom);visibility:hidden';
|
||||
page.appendChild(pr); PEEK += pr.offsetHeight || 0; pr.remove();
|
||||
page.style.setProperty('--wpk', PEEK + 'px');
|
||||
})();
|
||||
function ph() { return page.clientHeight; }
|
||||
function hFor(s) { return ph() * (s === 'full' ? .68 : .5); }
|
||||
function hFor(s) { return s === 'closed' ? PEEK : ph() * (s === 'full' ? .76 : .55); }
|
||||
function setH(h, anim) { P.style.transition = anim ? '' : 'none'; P.style.height = Math.round(h) + 'px'; }
|
||||
function snap(s) {
|
||||
state = s;
|
||||
sh.classList.toggle('show', s !== 'closed');
|
||||
sh.setAttribute('aria-hidden', s === 'closed' ? 'true' : 'false');
|
||||
if (s !== 'closed') setH(hFor(s), true);
|
||||
if (s === 'closed') { inp.blur(); setReply(null); }
|
||||
setH(hFor(s), true);
|
||||
if (s === 'closed') { inp.blur(); setReply(null); lsBox.scrollTop = 0; }
|
||||
}
|
||||
function open() { load(); snap('half'); }
|
||||
go.addEventListener('click', open);
|
||||
sh.querySelector('.wcs-hd').addEventListener('click', function (e) { if (state === 'closed' && !e.target.closest('.wcs-x')) open(); });
|
||||
sh.querySelector('.wcs-x').addEventListener('click', function () { snap('closed'); });
|
||||
sh.addEventListener('click', function (e) { if (e.target === sh) snap('closed'); });
|
||||
/* 右上角「全部」也开这个面板(原来那个只列悄悄话的抽屉不再用) */
|
||||
var all = document.getElementById('whvAll');
|
||||
if (all) all.addEventListener('click', function (e) { e.stopImmediatePropagation(); open(); }, true);
|
||||
/* 入口上往上划也能拉开 */
|
||||
var gy = null;
|
||||
go.addEventListener('touchstart', function (e) { gy = e.touches[0].clientY; }, { passive: true });
|
||||
go.addEventListener('touchmove', function (e) { if (gy != null && gy - e.touches[0].clientY > 24) { gy = null; open(); } }, { passive: true });
|
||||
/* 拖:抓把手 / 标题拖;列表在顶上时往下拖 = 拖面板;半屏时在列表上往上划 = 先把面板拉满 */
|
||||
var d0 = null;
|
||||
P.addEventListener('touchstart', function (e) {
|
||||
@@ -254,20 +315,21 @@
|
||||
if (!d0.drag) {
|
||||
if (Math.abs(dy) < 6) return;
|
||||
var canDown = dy > 0 && (d0.hd || lsBox.scrollTop <= 0);
|
||||
var canUp = dy < 0 && (d0.hd || state === 'half');
|
||||
var canUp = dy < 0 && (d0.hd || state !== 'full');
|
||||
if (!canDown && !canUp) { d0 = null; return; }
|
||||
d0.drag = true;
|
||||
}
|
||||
if (e.cancelable) e.preventDefault();
|
||||
setH(Math.max(ph() * .12, Math.min(hFor('full'), d0.base - dy)), false);
|
||||
if (state === 'closed') { load(); sh.classList.add('show'); }
|
||||
setH(Math.max(PEEK, Math.min(hFor('full'), d0.base - dy)), false);
|
||||
}, { passive: false });
|
||||
P.addEventListener('touchend', function (e) {
|
||||
if (!d0) return;
|
||||
var dd = d0; d0 = null;
|
||||
if (!dd.drag) return;
|
||||
var dy = e.changedTouches[0].clientY - dd.y, h = dd.base - dy, v = dy / Math.max(1, Date.now() - dd.t);
|
||||
if (v > .6 || h < ph() * .3) snap('closed');
|
||||
else if (v < -.4 || h > ph() * .59) snap('full');
|
||||
if (v > .6 || h < ph() * .32) snap('closed');
|
||||
else if (v < -.4 || h > ph() * .64) snap('full');
|
||||
else snap('half');
|
||||
});
|
||||
|
||||
@@ -280,13 +342,25 @@
|
||||
/* 关掉星空页时面板一起收 */
|
||||
new MutationObserver(function () {
|
||||
fixLeft();
|
||||
if (page.classList.contains('show')) load(); else snap('closed');
|
||||
if (page.classList.contains('show')) { load(); setH(PEEK, false); } else snap('closed');
|
||||
}).observe(page, { attributes: true, attributeFilter: ['class'] });
|
||||
if (page.classList.contains('show')) load();
|
||||
fixLeft();
|
||||
|
||||
/* 星空页「说一句」→ 发成留言(app.js 的 #whSend 调)。返回 Promise:resolve(null) = 成功,resolve('提示') = 没发出去 */
|
||||
/* 说一句的弹窗(11-07 用户:重新设计,有点设计感;「今天还能说」这类说明放到弹窗里) */
|
||||
var M = document.getElementById('modalWhisper');
|
||||
function fillModal() {
|
||||
if (!M) return;
|
||||
M.classList.add('wh-star');
|
||||
var ld = document.getElementById('whMLead');
|
||||
ld.innerHTML = '<span class="wms"><i>1</i>写下想对宝宝说的话</span><span class="wms"><i>2</i>审核通过,大家都能看到</span>' +
|
||||
'<span class="wms hi"><i>3</i>被赞 <b>' + STAR_N + '</b> 次,变成一颗星星</span>';
|
||||
var lf = document.getElementById('whLeft'); if (lf) lf.textContent = '审核通过后,可以转给朋友帮你点赞';
|
||||
}
|
||||
if (M && !M.querySelector('.wms-sky')) M.insertAdjacentHTML('afterbegin', '<i class="wms-sky" aria-hidden="true"></i>');
|
||||
window.MBWhCm = {
|
||||
fillModal: fillModal,
|
||||
starLikes: function () { return STAR_N; },
|
||||
post: function (text, week) {
|
||||
return post(text, week, null).then(function (msg) { if (!msg) setTimeout(function () { snap('half'); }, 400); return msg; });
|
||||
|
||||
Reference in New Issue
Block a user