feat(fe): 评论改成小红书那套交互——点评论直接唤起输入
上一版做成了居中弹窗,参考图给的是另一种范式:输入栏常驻底部,点任意 一条评论就把它激活并填上「回复 @xxx」。按参考图重做,居中那套一并删掉, 不留死代码。 结构从「一个滚动容器装所有东西」改成三段式: 固定头(共 N 条评论)+ 滚动列表 + 常驻输入栏 输入栏必须在滚动区外——放进去的话列表一滚它就跟着走,点完评论还得再 把输入框找回来,正是这次要解决的问题。 交互: - 点评论或回复的任意位置 → 输入框获得焦点,placeholder 变「回复 @xxx」, 上方出现可取消的橙色提示条。不用再单独点一个「回复」按钮 - 删除从长按改成显式的「删除」文字,只在自己的评论上出现——长按是 隐藏交互,没人会发现 - 回复带首字头像并缩进一层,「甲 回复 乙」的指向关系显示在昵称行 键盘处理用 adjust-position=false + bindfocus 拿键盘高度自己顶:弹层是 fixed 定位,交给系统调整会把整块推出屏幕。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -83,60 +83,54 @@
|
||||
/* 离屏画布:挪到可视区外而不是 display:none,否则 selectorQuery 取不到节点 */
|
||||
.poster-canvas{position:fixed;left:-9999rpx;top:0;width:600rpx;height:840rpx}
|
||||
|
||||
/* 评论。原来拿 .record-row(左右两端对齐)当评论用,昵称在左内容在右,
|
||||
内容一长就被挤扁。改成头像 + 昵称时间 + 内容的正常结构。 */
|
||||
.cm{display:flex;gap:var(--sp-3);padding:var(--sp-3) 0;border-bottom:1rpx solid var(--line)}
|
||||
.cm:last-of-type{border-bottom:0}
|
||||
/* ── 评论:头 + 滚动列表 + 常驻输入栏 ── */
|
||||
.sheet.sheet-cmp{display:flex;flex-direction:column;height:82vh;padding-bottom:0}
|
||||
.cmp-head{
|
||||
flex:none;text-align:center;padding:0 0 var(--sp-3);
|
||||
font-size:var(--fs-sm);color:var(--muted);border-bottom:1rpx solid var(--line);
|
||||
}
|
||||
.cmp-list{flex:1;min-height:0;padding:var(--sp-3) var(--sp-5) 0}
|
||||
.cmp-dock{
|
||||
flex:none;background:#fff;border-top:1rpx solid var(--line);
|
||||
padding:var(--sp-3) var(--sp-5) calc(20rpx + env(safe-area-inset-bottom));
|
||||
transition:padding-bottom .2s ease;
|
||||
}
|
||||
|
||||
.cm{display:flex;gap:var(--sp-3);padding:var(--sp-3) 0}
|
||||
.cm-av{
|
||||
width:64rpx;height:64rpx;border-radius:var(--r-sm);flex:none;
|
||||
width:64rpx;height:64rpx;border-radius:50%;flex:none;
|
||||
display:flex;align-items:center;justify-content:center;
|
||||
background:var(--primary-soft);color:var(--primary-ink);
|
||||
font-size:var(--fs-md);font-weight:var(--fw-b);
|
||||
}
|
||||
.cm-av-sm{width:48rpx;height:48rpx;font-size:var(--fs-sm)}
|
||||
.cm-body{flex:1;min-width:0}
|
||||
.cm-head{display:flex;align-items:center;gap:var(--sp-1)}
|
||||
.cm-name{font-size:var(--fs-sm);font-weight:var(--fw-b);color:var(--text-2)}
|
||||
.cm-time{margin-left:auto;font-size:var(--fs-cap);color:var(--muted2);flex:none}
|
||||
.cm-name{font-size:var(--fs-sm);color:var(--muted)}
|
||||
.cm-at{color:var(--muted2)}
|
||||
.cm-text{margin-top:6rpx;font-size:var(--fs-md);line-height:1.55;word-break:break-word}
|
||||
.cm-tip{margin-top:var(--sp-3);text-align:center;color:var(--muted2);font-size:var(--fs-cap)}
|
||||
|
||||
.cm-input{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-4)}
|
||||
.cm-input .input{flex:1}
|
||||
.cm-send{
|
||||
flex:none;height:88rpx;padding:0 var(--sp-5);border-radius:var(--r-md);
|
||||
display:flex;align-items:center;justify-content:center;
|
||||
background:var(--line);color:#fff;font-size:var(--fs-md);font-weight:var(--fw-b);transition:.16s ease;
|
||||
}
|
||||
.cm-send.on{background:var(--cta)}
|
||||
|
||||
/* 居中弹层:评论这类以输入为主的,贴底会被键盘顶掉大半屏 */
|
||||
.sheet.sheet-center{
|
||||
left:var(--sp-5);right:var(--sp-5);bottom:auto;top:50%;
|
||||
border-radius:var(--r-lg);
|
||||
transform:translateY(-50%) scale(.94);opacity:0;
|
||||
}
|
||||
.overlay.show .sheet.sheet-center{transform:translateY(-50%) scale(1);opacity:1}
|
||||
.sheet-center .sheet-scroll{max-height:62vh;padding:0 var(--sp-5) var(--sp-5)}
|
||||
.sheet-center .sheetbar{display:none}
|
||||
|
||||
/* 评论编辑区 */
|
||||
.cm-editor{margin-top:var(--sp-4);border-top:1rpx solid var(--line);padding-top:var(--sp-4)}
|
||||
.cm-ta{min-height:160rpx;height:auto}
|
||||
.cm-bar{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-3)}
|
||||
.cm-pic{display:flex;align-items:center;gap:var(--sp-1);color:var(--muted);font-size:var(--fs-sm)}
|
||||
.cm-count{margin-left:auto;color:var(--muted2);font-size:var(--fs-cap)}
|
||||
.cm-imgs{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-2)}
|
||||
.cm-img{width:150rpx;height:150rpx;border-radius:var(--r-sm)}
|
||||
.cm-meta{display:flex;align-items:center;gap:var(--sp-4);margin-top:var(--sp-2);font-size:var(--fs-cap);color:var(--muted2)}
|
||||
.cm-reply-btn{color:var(--muted)}
|
||||
.cm-del{color:var(--red-ink)}
|
||||
.cm-replies{margin-top:var(--sp-2)}
|
||||
.cm-reply{display:flex;gap:var(--sp-2);padding:var(--sp-2) 0}
|
||||
.cm-more{margin-top:4rpx;font-size:var(--fs-cap);color:var(--muted)}
|
||||
|
||||
/* 回复:只缩进一层,再深手机上就没法读了 */
|
||||
.cm-replies{margin-top:var(--sp-2);padding:var(--sp-2) var(--sp-3);background:var(--surface-2);border-radius:var(--r-sm)}
|
||||
.cm-reply{font-size:var(--fs-sm);line-height:1.6;color:var(--text);padding:4rpx 0}
|
||||
.cm-at{color:var(--muted)}
|
||||
.cm-more{margin-top:6rpx;font-size:var(--fs-cap);color:var(--primary-dark)}
|
||||
.cm-act{margin-top:var(--sp-2);font-size:var(--fs-cap);color:var(--muted)}
|
||||
/* 「回复 @xxx」的提示条 */
|
||||
.cm-replying{
|
||||
display:flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2);
|
||||
padding:var(--sp-1) var(--sp-3);border-radius:var(--r-full);
|
||||
background:var(--primary-soft);color:var(--primary-ink);font-size:var(--fs-cap);align-self:flex-start;
|
||||
display:inline-flex;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-2);
|
||||
padding:4rpx var(--sp-3);border-radius:var(--r-full);
|
||||
background:var(--primary-soft);color:var(--primary-ink);font-size:var(--fs-cap);
|
||||
}
|
||||
.cm-cancel{display:flex;align-items:center}
|
||||
.cm-ta{min-height:120rpx;height:auto;background:var(--surface-2)}
|
||||
.cm-bar{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-2)}
|
||||
.cm-pic{display:flex;align-items:center;color:var(--muted)}
|
||||
.cm-count{margin-left:auto;color:var(--muted2);font-size:var(--fs-cap)}
|
||||
.cm-send{
|
||||
flex:none;height:72rpx;padding:0 var(--sp-5);border-radius:var(--r-full);
|
||||
display:flex;align-items:center;justify-content:center;
|
||||
background:var(--line);color:#fff;font-size:var(--fs-sm);font-weight:var(--fw-b);transition:.16s ease;
|
||||
}
|
||||
.cm-send.on{background:var(--cta)}
|
||||
|
||||
Reference in New Issue
Block a user