网站首页 > 技术文章 正文
不知道你有没有发现Bing AI聊天有个输入提示功能,在用户输入部分内容时后面会给出灰色提示文案。用户只要按下tab键就可以快速添加提示的后续内容。我将这个功能称为幽灵建议。接下来我将用Vue框架来实现这个功能。
布局样式
布局使用label标签作为容器,这样即使建议内容在上层,也不会影响输入框的输入。
<label class="container">
<textarea></textarea>
<div class="ghost-content"></div>
</label>
样式需要确保输入框与建议内容容器除了颜色外都要一致。建议内容可以通过z-index: -1置于输入框底部,但要注意输入框必须是透明背景。
.container {
position: relative;
display: block;
width: 300px;
height: 200px;
font-size: 14px;
line-height: 21px;
}
.container textarea {
width: 100%;
height: 100%;
padding: 0;
border: 0;
font: inherit;
color: #212121;
background-color: #fff;
outline: none;
}
.ghost-content {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
color: #212121;
opacity: 0.3;
}
显示逻辑
显示逻辑比较简单,当输入框中显示输入内容时,找到匹配的内容后将其显示在建议容器中。以下是代码示例:
import { ref } from 'vue'
const content = ref('') // 输入框内容
const ghostContent = ref('') // 建议内容
const suggestions = ['你好啊', '怎么学编程'] // 建议列表
const handleInput = () => {
ghostContent.value = '' // 内容变化时,清空建议
// 如果为空或者建议内容改变,则不进行后续匹配
if (content.value === '') {
return
}
const suggestion = suggestions.find((item) => item.startsWith(content.value))
if (suggestion) {
ghostContent.value = suggestion
}
}
const handleTabKeydown = () => {
// 监听tab键按下,将输入框内容设置为建议内容,同时清空建议内容
content.value = ghostContent.value
ghostContent.value = ''
}
按照以上代码的写法,已经可以实现幽灵建议的功能了。但还存在一个小问题,输入框内容和建议内容的重叠部分会显得比较粗。因此,最好将重叠部分的文字颜色设置为透明。我的解决方法是使用span标签来包裹重叠部分的内容,然后将span的文字样式设置为透明。此外,为了表示可以使用tab键,我在末尾添加了→符号。改进后的代码如下:
// 重复部分省略
// ...
const ghostHTML = ref('') // 建议内容HTML
const handleInput = () => {
ghostContent.value = ''
ghostHTML.value = ''
if (content.value === '' || fromSuggestion) {
fromSuggestion && (fromSuggestion = false)
return
}
const suggestion = suggestions.find((item) => item.startsWith(content.value))
if (suggestion) {
ghostContent.value = suggestion
ghostHTML.value = suggestion.replace(content.value, `<span>${content.value}</span>`) + ' →' // 显示内容替换
}
}
const handleTabKeydown = () => {
content.value = ghostContent.value
ghostContent.value = ''
ghostHTML.value = ''
}
最后,补充一下HTML代码。
<label class="container">
<textarea v-model="content" @input="handleInput" @keydown.tab.prevent="handleTabKeydown"></textarea>
<div class="ghost-content" v-html="ghostHTML"></div>
</label>
- 我们需要阻止tab按下的默认事件,按下tab键会导致切换到其他元素,使输入框失去焦点;
- 使用v-html来绑定HTML内容。
原文链接:https://juejin.cn/post/7273674732448120895
猜你喜欢
- 2025-09-14 在Excel用max()/min()函数代替IF()函数的多分支判断的一个小案例
- 2025-09-14 【C语法硬核20讲】07 宏与预处理:写出安全宏
- 2025-09-14 用数学的方法理解Photoshop混合模式——变暗模式
- 2025-09-14 这4个变态的Excel函数公式,却好用的很
- 2025-09-14 常用函数示例_常用函数示例大全
- 2025-09-14 Excel教程:常用的Excel统计函数汇总
- 2025-09-14 办公小技巧:用好Excel 2019新函数为办公提速
- 2025-09-14 如何实现一个带min函数的栈?这招双栈法让查询速...
- 2025-09-14 python常用得内置函数解析——min()函数
- 2025-09-14 湿地夕阳,美的让人如痴如醉!_湿地公园日落
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)