留言面板改按高度伸缩(半屏 50% / 最高 68%),底部输入框一直露着
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
<!-- V:26110618 缓存版本标记:改 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=26110618">
|
||||
<link rel="stylesheet" href="js/wh-cm.css?v=26110619">
|
||||
<!-- 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=26110618" defer></script>
|
||||
<script src="js/wh-cm.js?v=26110619" defer></script>
|
||||
<script src="js/app.js"></script>
|
||||
<script src="js/kit.js?v=26110605"></script>
|
||||
<!-- 11-05 用户:孕期百问加上跟趣味小测试一样的底部 Tab(孕期百问 / 记一下 / 返回首页)。挂在 #detailQA 里,面板关着时跟着滑出屏外;
|
||||
|
||||
@@ -21,8 +21,9 @@
|
||||
/* 半屏面板 */
|
||||
.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:68%;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)}
|
||||
.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;
|
||||
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}
|
||||
.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}
|
||||
|
||||
19
js/wh-cm.js
19
js/wh-cm.js
@@ -219,17 +219,16 @@
|
||||
inp.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); send(); } });
|
||||
|
||||
/* ---------- 半屏面板:开 / 关 / 拖 ----------
|
||||
面板高 = 星空页 68%(上面至少留 1/3 星空);half = 露出 50%,full = 露出 68%,再往上拉不动;往下拖过一半关掉 */
|
||||
按高度伸缩(底部输入框一直露着):half = 星空页 50%,full = 68%(上面至少留 1/3 星空),再往上拉不动;往下拖到 25% 以下关掉 */
|
||||
var state = 'closed';
|
||||
function ph() { return page.clientHeight; }
|
||||
function H() { return P.offsetHeight; }
|
||||
function offFor(s) { return s === 'full' ? 0 : s === 'half' ? Math.max(0, H() - ph() * .5) : H() + 20; }
|
||||
function setY(y, anim) { P.style.transition = anim ? '' : 'none'; P.style.transform = 'translateY(' + y + 'px)'; }
|
||||
function hFor(s) { return ph() * (s === 'full' ? .68 : .5); }
|
||||
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');
|
||||
setY(offFor(s), true);
|
||||
if (s !== 'closed') setH(hFor(s), true);
|
||||
if (s === 'closed') { inp.blur(); setReply(null); }
|
||||
}
|
||||
function open() { load(); snap('half'); }
|
||||
@@ -247,7 +246,7 @@
|
||||
var d0 = null;
|
||||
P.addEventListener('touchstart', function (e) {
|
||||
if (e.touches.length !== 1 || e.target.closest('.wcs-in')) return;
|
||||
d0 = { y: e.touches[0].clientY, base: offFor(state), hd: !!e.target.closest('.wcs-hd'), drag: false, t: Date.now() };
|
||||
d0 = { y: e.touches[0].clientY, base: P.offsetHeight, hd: !!e.target.closest('.wcs-hd'), drag: false, t: Date.now() };
|
||||
}, { passive: true });
|
||||
P.addEventListener('touchmove', function (e) {
|
||||
if (!d0) return;
|
||||
@@ -260,15 +259,15 @@
|
||||
d0.drag = true;
|
||||
}
|
||||
if (e.cancelable) e.preventDefault();
|
||||
setY(Math.min(H() + 20, Math.max(0, d0.base + dy)), false);
|
||||
setH(Math.max(ph() * .12, 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, y = dd.base + dy, v = dy / Math.max(1, Date.now() - dd.t);
|
||||
if (v > .6 || y > H() - ph() * .25) snap('closed');
|
||||
else if (v < -.4 || y < offFor('half') / 2) snap('full');
|
||||
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');
|
||||
else snap('half');
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user