Tailwind css實戰,基于Kooboo構建AI對話框頁面(二)

基于上篇內容,添加交互邏輯,實現一個偽聊天功能的對話框效果:?

Tailwind css實戰,基于Kooboo構建AI對話框頁面(一)-CSDN博客


在前期文章中,我們完成了 AI 對話框的靜態頁面搭建。本文將聚焦交互邏輯開發,通過原生 JavaScript 實現消息發送 / 接收動態渲染“正在輸入” 動畫反饋關鍵詞觸發的智能回復,最終實現一個具備對話能力的交互界面。以下是核心功能的代碼實現與邏輯解析:

一、技術棧

1. 技術棧說明

  • Kooboo:快速構建對話界面的靜態結構(如消息容器、輸入框、按鈕的布局)。通過拖拽組件和樣式配置(直接應用 Tailwind 類名),生成基礎 HTML 框架,無需手動編寫重復代碼。
  • Tailwind CSS:通過類名快速實現對話氣泡樣式(如bg-blue-600用戶消息、bg-whiteAI 回復)
  • 原生 JavaScript:通過監聽用戶操作,動態渲染消息,與 Kooboo 生成的靜態 DOM 無縫協作,確保交互功能的靈活性

二、核心文件結構

1. 初始化與 DOM 元素獲取

document.addEventListener('DOMContentLoaded', function() {const messageContainer = document.getElementById('messageContainer');const messageInput = document.getElementById('messageInput');const sendButton = document.getElementById('sendButton');
});
  • 事件監聽:頁面 DOM 加載完成后執行初始化
  • 元素引用:獲取消息容器、輸入框和發送按鈕的 DOM 節點

2. 時間格式化函數

// 獲取當前時間(格式:HH:MM AM/PM)
function getCurrentTime() {const now = new Date();let hours = now.getHours();let minutes = now.getMinutes();const ampm = hours >= 12 ? 'PM' : 'AM';hours = hours % 12;hours = hours ? hours : 12; // 0點轉為12點minutes = minutes < 10 ? '0'+minutes : minutes;return `${hours}:${minutes} ${ampm}`;
}
  • 時間格式:將 24 小時制轉換為 12 小時制(例如:2:30 PM
  • 補零處理:分鐘數小于 10 時添加前導零(例如:2:05 PM

3. 消息發送功能

? ? ?3.1 獲取用戶輸入并校驗

function sendMessage() {const message = messageInput.value.trim();if (message === '') return; // 忽略空消息
  • 去除空格:獲取輸入框中的內容并去除前后空格。
  • 空消息過濾:如果輸入內容為空,直接返回,不執行后續操作,避免發送空消息。

? ? ? 3.2?生成用戶消息的 HTML 結構

// 添加用戶消息const userMessageHtml = `<div class="flex items-start space-x-2 justify-end"><div class="max-w-[70%]"><div class="bg-blue-600 text-white p-4 rounded-lg rounded-tr-none shadow-sm"><p>${message}</p><span class="text-xs text-blue-200 mt-1 block">${getCurrentTime()}</span></div></div><div class="w-8 h-8 rounded-full bg-blue-500 flex items-center justify-center"><span class="text-white">我</span></div></div>
  • 外層容器flex items-start space-x-2 justify-end:使用彈性布局,子元素從頂部開始排列,水平間距為 2 單位,用戶消息右對齊(justify-end)。
  • 消息內容區域max-w-[70%]:消息內容最大寬度為父容器的 70%,避免消息過寬。
  • 消息氣泡bg-blue-600 text-white p-4 rounded-lg rounded-tr-none shadow-sm:藍色背景,白色文字,內邊距 4 單位,圓角(右上角為直角,rounded-tr-none),添加陰影。
  • 消息內容<p>${message}</p>:顯示用戶輸入的消息內容。
  • 時間戳<span class="text-xs text-blue-200 mt-1 block">${getCurrentTime()}</span>:小字體,淺藍色,距離頂部 1 單位,塊級元素,顯示當前時間(通過getCurrentTime函數獲取)。
  • 用戶頭像w-8 h-8 rounded-full bg-blue-500 flex items-center justify-center:8x8 單位的圓形,藍色背景,內部文字 “我” 居中顯示。

????????3.3 插入用戶消息到容器

messageContainer.insertAdjacentHTML('beforeend', userMessageHtml);
  • 將生成的用戶消息 HTML 插入到messageContainer的末尾,更新界面顯示用戶消息。

? ? ? ? 3.4 清空輸入框并聚焦

messageInput.value = '';
messageInput.focus();
  • 清空輸入框內容,準備接收下一條消息,并將焦點保持在輸入框,方便用戶繼續輸入。

? ? ? ? 3.5 滾動到底部

scrollToBottom();
  • 調用scrollToBottom函數,確保消息容器滾動到最底部,顯示最新的用戶消息。

4. "正在輸入" 動畫效果

// 顯示加載指示器
const typingIndicator = `<div id="typingIndicator" class="flex items-start space-x-2"><div class="w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center">🤖</div><div class="max-w-[70%]"><div class="bg-white p-4 rounded-lg rounded-tl-none shadow-sm"><div class="flex space-x-1"><div class="w-2 h-2 rounded-full bg-gray-400 animate-pulse"></div><div class="w-2 h-2 rounded-full bg-gray-400 animate-pulse" style="animation-delay: 0.2s"></div><div class="w-2 h-2 rounded-full bg-gray-400 animate-pulse" style="animation-delay: 0.4s"></div></div></div></div></div>
`;
messageContainer.insertAdjacentHTML('beforeend', typingIndicator);
scrollToBottom();
  • 動畫實現:使用三個小圓點的脈沖動畫(animate-pulse
  • 交錯延遲:通過 CSS 動畫延遲(0.2s 和 0.4s)創造波浪效果
  • AI 標識:使用🤖圖標區分 AI 回復

5. 模擬 AI 回復邏輯

// 模擬AI回復setTimeout(() => {// 移除"正在輸入"指示器const typing = document.getElementById('typingIndicator');if (typing) typing.remove();// 根據用戶消息生成不同的回復let aiResponse = "";if (message.toLowerCase().includes('python')) {aiResponse = `這是一個簡單的Python函數示例:def calculate_sum(a, b):"""計算兩個數字的和"""return a + b# 調用函數result = calculate_sum(5, 3)print(f"結果是: {result}") \n這個函數接受兩個參數并返回它們的和。`;} else if (message.toLowerCase().includes('hello') || message.toLowerCase().includes('hi')) {aiResponse = "您好!很高興見到您。有什么我可以幫助您的嗎?";} else if (message.includes('你是誰')) {aiResponse = "我是AI小助手,您的智能聊天伙伴!";} else {aiResponse = "感謝您的提問。我正在學習更多知識,以便更好地回答您的問題。";}// 添加AI回復const aiMessageHtml = `<div class="flex items-start space-x-2"><div class="w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center">🤖</div><div class="max-w-[70%]"><div class="bg-white p-4 rounded-lg rounded-tl-none shadow-sm"><pre class="text-sm bg-gray-50 p-3 rounded-md"><code>${aiResponse}</code></pre><span class="text-xs text-gray-500 mt-2 block">${getCurrentTime()}</span></div></div></div>`;messageContainer.insertAdjacentHTML('beforeend', aiMessageHtml);scrollToBottom();}, 1000 + Math.random() * 1000); // 隨機延遲1-2秒}
  • 關鍵詞匹配:根據用戶輸入內容生成不同回復
  • 代碼格式化:使用<pre><code>標簽保持 Python 代碼格式
  • 隨機延遲:模擬 AI 思考時間,增強真實感

6. 滾動控制函數

function scrollToBottom() {messageContainer.scrollTop = messageContainer.scrollHeight;
}
  • 自動滾動:確保最新消息始終可見
  • 調用時機:發送消息后、顯示 / 隱藏加載指示器后

7. 事件綁定

// 按鈕點擊觸發發送
sendButton.addEventListener('click', sendMessage);// 回車鍵觸發發送
messageInput.addEventListener('keypress', function(e) {if (e.key === 'Enter') {sendMessage();}
});// 頁面加載后自動聚焦輸入框
messageInput.focus();
  • 雙觸發機制:支持鼠標點擊和鍵盤回車發送消息
  • 自動聚焦:用戶無需手動點擊輸入框

8. 消息 UI 設計

元素用戶消息AI 回復
氣泡顏色藍色 (bg-blue-600)白色 (bg-white)
對齊方式右對齊 (justify-end)左對齊(默認)
頭像藍色圓形 + 文字 "我"灰色圓形 +🤖圖標
時間戳淺藍色小字 (text-blue-200)淺灰色小字 (text-gray-500)
最大寬度70% (max-w-[70%])70% (max-w-[70%])

三、總結

整個交互邏輯的流程就是:當頁面加載完成后,通過ID綁定獲取輸入框、發送按鈕和消息容器元素,監聽按鈕點擊和回車事件觸發消息發送——用戶輸入經非空驗證后,以右側藍色氣泡形式顯示并附帶時間戳,隨后展示左側的"正在輸入"動畫,經過1-2秒模擬延遲后,根據消息關鍵詞(如Python/問候語/身份詢問)動態生成對應回復,以代碼塊或文本形式在左側灰色氣泡中呈現,整個過程通過DOM操作實時更新界面并保持自動滾動,形成完整的偽實時對話交互閉環。
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84752.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84752.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84752.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Conda:環境移植及更新1--使用conda-pack

更多內容&#xff1a;XiaoJ的知識星球 目錄 一、使用conda-pack1.安裝 conda-pack2.移植整個 Anaconda 環境3.移植單個虛擬環境4.驗證是否生效 在相同Linux設備上移植Miniconda3&#xff08;Anaconda3同理&#xff09;常用方法有。 使用conda-pack&#xff1a;使用conda-pack工…

樹莓派超全系列教程文檔--(50)如何查找樹莓派的IP地址

如何查找樹莓派的IP地址 找到您的Raspberry Pi的IP地址桌面命令行引導輸出網絡管理器使用mDNS解析 raspberrypi.local檢查路由器的設備列表使用 nmap 查找設備使用智能手機應用程序查找設備 文章來源&#xff1a; http://raspberry.dns8844.cn/documentation 原文網址 找到您…

如何優化 MySQL 存儲過程的性能?

文章目錄 1. 優化 SQL 語句避免全表掃描減少子查詢&#xff0c;改用 JOIN避免 SELECT 2. 合理使用索引3. 優化存儲過程結構減少循環和臨時變量避免重復計算 4. 使用臨時表和緩存5. 優化事務處理6. 分析和監控性能7. 優化數據庫配置8. 避免用戶自定義函數&#xff08;UDF&#…

尚硅谷redis7 47-48 redis事務之理論簡介

47 redis事務之理論簡介 什么是事務 可以一次執行多個命令,本質是一組命令的集合。一個事務中的所有命令都會序列化,按順序地串行化執行而不會被其它命令插入 能干什么&#xff1f; 一個隊列中&#xff0c;一次性、順序性、排他性的執行一系列操作 redis事務vs數據庫事務 …

Nginx 在四大核心場景中的應用實踐與優化

一、Nginx 核心應用場景深度解析 1. HTTP 服務器&#xff1a;靜態資源的高性能承載者 Nginx 作為 HTTP 服務器時&#xff0c;憑借輕量級架構和高效的事件驅動模型&#xff0c;成為靜態資源服務的首選方案。 核心能力與場景 靜態文件高效處理&#xff1a;直接響應 HTML、CSS…

亞當·斯密思想精髓的數學建模與形式化表征

亞當斯密思想精髓的數學建模與形式化表征 摘要&#xff1a;本文運用數學建模方法對亞當斯密的經濟與倫理思想進行形式化表征。通過分工的規模經濟模型和市場均衡條件展現《國富論》中"看不見的手"原理&#xff1b;采用擴展效用函數與合作博弈均衡解釋《道德情操論》…

FastDFS集群部署與性能優化實戰

目錄 一、介紹 二、FastDFS原理 三、FastDFS部署 1.資源清單 2.修改主機名 3.安裝libfastcommon&#xff08;tracker01、tracker02、storage1、storage2&#xff09; 4.安裝編譯FastDFS&#xff08;tracker01、tracker02、storage1、storage2&#xff09; 5.配置tracker…

學習心得(14--16)

模板&#xff1a; 前端的頁面單獨存在模板當中 jinja2 &#xff1a;模板語法 保持前端頁面不變的情況下&#xff0c;返回內容給前端做法&#xff1a; 寫一個data&#xff0c;并在return中的render_template中&#xff0c;寫上datadata 使用時&#xff0c;要將templa…

stm與51單片機哪個更適合新手學

一句話總結 51單片機&#xff1a;像學騎自行車&#xff0c;簡單便宜&#xff0c;但只能在小路上騎。 STM32&#xff1a;像學開汽車&#xff0c;復雜但功能強&#xff0c;能上高速公路&#xff0c;還能拉貨載人&#xff08;做復雜項目&#xff09;。 1. 為啥有人說“先學51單片…

Web安全測試-文件上傳繞過-DVWA

Web安全測試-文件上傳繞過-DVWA 很多網站都有上傳資源(圖片或者文件)的功能&#xff0c;資源上傳后一般會存儲在服務器的一個文件夾里面&#xff0c;如果攻擊者繞過了上傳時候的文件類型驗證&#xff0c;傳了木馬或者其他可執行的代碼上去&#xff0c;那服務器就危險了。 我用…

ant-design-vue中的分頁組件自定義

ant-design-vue中的分頁組件自定義 實現效果 實現代碼 需要自己創建一個分頁組件的代碼然后導入進去。 <template><div style"display: flex; justify-content: space-between; margin-bottom: 10px"><div><a-select v-model:value"pageS…

LabVIEW軟件開發過程中如何保證軟件的質量?

一、需求與架構設計階段 明確功能邊界與技術指標 在測試系統設計初期&#xff0c;圍繞比例閥性能測試核心需求&#xff08;如壓力 / 流量信號采集、特性曲線繪制、數據對比分析&#xff09;&#xff0c;定義軟件功能模塊&#xff08;數據采集、邏輯控制、界面顯示&#xff09;&…

Linux 527 重定向 2>1 rsync定時同步(未完)

rsync定時同步 配環境 關閉防火墻、selinux systemctl stop firewalld systemctl disable firewalld setenforce0 vim /etc/SELINUX/config SELINUXdisable515 設置主機名 systemctl set-hostname code systemctl set-hostname backup 配靜態ip rsync 需要穩定的路由表和端…

Vue 3.0 中狀態管理Vuex 與 Pinia 的區別

在 Vue.js 應用開發中&#xff0c;狀態管理是構建復雜應用的關鍵環節。隨著 Vue 3 的普及和 Composition API 的引入&#xff0c;開發者面臨著狀態管理庫的選擇問題&#xff1a;是繼續使用經典的 Vuex&#xff0c;還是轉向新興的 Pinia&#xff1f;本文將從設計理念、API 設計、…

分布式緩存:三萬字詳解Redis

文章目錄 緩存全景圖PreRedis 整體認知框架一、Redis 簡介二、核心特性三、性能模型四、持久化詳解五、復制與高可用六、集群與分片方案 Redis 核心數據類型概述1. String2. List3. Set4. Sorted Set&#xff08;有序集合&#xff09;5. Hash6. Bitmap7. Geo8. HyperLogLog Red…

React useEffect和useEffectLa

原理把對象以樹的形式存檔&#xff0c;根據URL進行匹配渲染對應組件 useEffect 和useLayoutEffect區別 useEffect中的回調函數放在異步任務隊列中&#xff0c;是異步的&#xff0c;會在React渲染&#xff0c; dom 元素更新&#xff0c;瀏覽器繪制完成之后才會執行 useLayout…

multiprocessing多進程使用案例

multiprocessing — 基于進程的并行&#xff1a;https://docs.python.org/zh-cn/3.11/library/multiprocessing.html import sys from fastchat.serve.controller import Controller from fastchat.serve.model_worker import ModelWorker from fastchat.serve.openai_api_ser…

鴻蒙OSUniApp 開發實時天氣查詢應用 —— 鴻蒙生態下的跨端實踐#三方框架 #Uniapp

使用 UniApp 開發實時天氣查詢應用 —— 鴻蒙生態下的跨端實踐 在移動互聯網時代&#xff0c;天氣應用幾乎是每個人手機中的"標配"。無論是出行、旅游還是日常生活&#xff0c;實時獲取天氣信息都極為重要。本文將以"實時天氣查詢應用"為例&#xff0c;詳…

藍橋杯178 全球變暖

題目描述 你有一張某海域 NxN 像素的照片&#xff0c;"."表示海洋、"#"表示陸地&#xff0c;如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上…

第五十二節:增強現實基礎-簡單 AR 應用實現

引言 增強現實(Augmented Reality, AR)是一種將虛擬信息疊加到真實世界的技術,廣泛應用于游戲、教育、工業維護等領域。與傳統虛擬現實(VR)不同,AR強調虛實結合,用戶無需完全沉浸到虛擬環境中。本文將通過Python和OpenCV庫,從零開始實現一個基礎的AR應用:在檢測到特定…