基于Vue实现一个textarea幽灵建议功能
作者:60岁咯
不知道你有没有发现Bing AI聊天有个输入提示功能,在用户输入部分内容时后面会给出灰色提示文案,用户只要按下tab键就可以快速添加提示的后续内容,我将这个功能称为幽灵建议,接下来我将用Vue框架来实现这个功能,需要的朋友可以参考下
不知道你有没有发现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代码。
- 我们需要阻止
tab
按下的默认事件,按下tab
键会导致切换到其他元素,使输入框失去焦点; - 使用
v-html
来绑定HTML内容。
到此这篇关于基于Vue实现一个textarea幽灵建议功能的文章就介绍到这了,更多相关Vue textarea建议功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!