-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Improve mouse selection blocks #14010
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
然后shift+右选择文本没有背景色,这个需要统一处理,否则这个 bug 有点严重。 |
这个要怎么复现?我这样操作没问题: video.webm |
哦不对,是右方向键。 我觉得不显示还是合理的吧,毕竟选中块之后也不应该还能选择文本。 |
划选后,不要用鼠标,用键盘操作。 |
@Vanessa219 我试了一下,选中块之后是用不了 video.webm |
@Vanessa219 还有个问题,表格 .table__select 用 |
Shift+→ 在块选中的情况下目前也是不可划选的。 |
* fix: 鼠标框选块或单元格时不应选中其中的文本 fix siyuan-note#12120 * refactor: 表格选择单元格不灵活 fix siyuan-note#11388
@Vanessa219 这个地方我还是不理解,能不能再解释一下? 无论是否去掉这段代码,选中块之后按 |
Jietu20250413-173206-HD.mp4 |
选中块的情况下按 Esc 之后执行 |
可能会有其他没有考虑到的情况,这样用户就无法看到选中的内容了。问题比较严重。 比如拖拽,同步,回调,刷新等(没有测试过,但点比较多) |
可以先把能想到的情况都解决了,之后遇到特殊情况再继续改进。我觉得应该不会很严重,鼠标划一下还是点一下就可以恢复选择文本的背景色了。 |
这是高频功能,不能忽视。 |
那不用 CSS,用操作文本选区的方案行不行,我用 AI 生成了一个示例(有BUG,但能表达我的意思): 要实现在鼠标从第一个段落(1)划选到第二个段落(2)时取消选区,并在移回第一个段落时恢复选区,可以通过以下步骤实现: 方法说明
实现代码<p id="p1">111111111111111111</p>
<p id="p2">222222222222222222</p>
<script>
let savedRange = null; // 保存选区的变量
// 检查节点是否在指定元素内
function isInElement(node, elementId) {
const element = document.getElementById(elementId);
return element.contains(node);
}
// 监听选区变化
document.addEventListener('selectionchange', () => {
const selection = document.getSelection();
if (!selection.rangeCount) return;
const range = selection.getRangeAt(0);
const startInP1 = isInElement(range.startContainer, 'p1');
const endInP2 = isInElement(range.endContainer, 'p2');
// 如果选区从p1开始并在p2结束,保存并清除
if (startInP1 && endInP2) {
savedRange = range.cloneRange();
selection.removeAllRanges();
}
});
// 鼠标移入p1时恢复选区
document.getElementById('p1').addEventListener('mouseenter', () => {
if (savedRange) {
const selection = document.getSelection();
selection.removeAllRanges();
selection.addRange(savedRange);
savedRange = null; // 恢复后清空
}
});
</script> 关键点解释
注意事项
通过这种方式,用户划选到第二个段落时会立即清除选区,移回第一个段落时自动恢复,提供流畅的交互体验。 |
试了一下,不行。无法上下拖拽滚动了。 |
那看来没有很完美的方法了,直接用这个 CSS 怎么样?应该能解决大部分问题 .protyle-wysiwyg--select ::selection,
.protyle-wysiwyg--hl ::selection {
background-color: transparent;
}
.protyle-wysiwyg--select + [data-node-id] ::selection,
.protyle-wysiwyg--hl + [data-node-id] ::selection {
background-color: transparent;
} |
这个是不是以前说过,但是没有用,还记得为什么不? |
因为没有其他的完美的方案,所以我现在能接受这个 CSS 了,至少用了比不用更好 #12120 1楼: |
改了一下再看看吧。 |
还有这个也需要修改一下:#14012 |
01 改进后效果:
video.webm
02 改进后效果:
video.webm
待解决:
还有 Shift+Click 多选块的问题需要 #14012 解决:
video.webm