前端技术(23) : 聊天页面

来源: GPT生成之后微调

效果图

HTML代码

html 复制代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>聊天</title>
		<style>
			body {
				font-family: Arial, sans-serif;
				margin: 0;
				padding: 0;
			}

			.container {
				display: flex;
				height: 100vh;
			}

			.contact-list {
				flex: 1;
				background-color: #f4f0ff;
				/* 浅紫色背景 */
				padding: 20px;
				max-width: 300px;
				border-right: 1px solid #DDD;
				box-sizing: border-box;
				display: flex;
				flex-direction: column;
				gap: 10px;
			}

			.contact {
				padding: 10px 20px;
				cursor: pointer;
				transition: background-color 0.3s;
				display: flex;
				justify-content: space-between;
				align-items: center;
			}

			.contact.active {
				background-color: #e6d5ff;
				/* 选中联系人更深的紫色背景 */
			}

			.contact-name {
				font-weight: bold;
			}

			.contact-status {
				width: 10px;
				height: 10px;
				border-radius: 50%;
			}

			.status-online {
				background-color: #0F0;
				/* 在线状态的颜色 */
			}

			.status-offline {
				background-color: #F00;
				/* 离线状态的颜色 */
			}

			.status-away {
				background-color: #FF0;
				/* 离开状态的颜色 */
			}

			.conversation {
				flex: 2;
				background-color: #f9f7ff;
				/* 淡紫色对话窗口 */
				padding: 20px;
				box-sizing: border-box;
				display: flex;
				flex-direction: column;
			}

			.message-container {
				flex: 1;
				overflow-y: auto;
				padding: 10px;
				display: flex;
				flex-direction: column;
			}

			.message {
				padding: 10px;
				margin: 20px;
				max-width: 70%;
				word-wrap: break-word;
				border-radius: 10px;
				box-shadow: 2px 2px 5px #ccc;
				display: inline-block;
				clear: both;
			}

			.message-time {
				font-size: 12px;
				color: #666;
				position: absolute
				margin-left: 10px;
				float: right;
			}

			.user-message {
				background-color: #baf2ff;
				/* 浅蓝色用户消息气泡 */
				align-self: flex-end;
			}

			.contact-message {
				background-color: #f7e7ff;
				/* 淡紫色联系人消息气泡 */
				align-self: flex-start;
			}

			.input-container {
				display: flex;
				align-items: center;
			}

			.message-input {
				flex: 1;
				padding: 10px;
				margin: 10px;
				box-sizing: border-box;
				border: 1px solid #DDD;
				border-radius: 5px;
				background-color: #f4f0ff;
				/* 浅紫色背景 */
				resize: none;
				/* 禁止用户调整文本域大小 */
				font-size: 18px;
			}

			.send-button {
				padding: 10px 20px;
				margin: 10px;
				border: none;
				background-color: #8a4d76;
				/* 深紫色按钮 */
				color: #FFF;
				border-radius: 5px;
				cursor: pointer;
			}

			h2 {
				margin-top: 0;
				padding-top: 10px;
				color: #8a4d76;
				/* 深紫色标题 */
			}

			h3 {
				margin-top: 0;
				padding-top: 10px;
				color: #8a4d76;
				/* 深紫色标题 */
			}
		</style>
	</head>
	<body>
		<div class="container">
			<div class="contact-list">
				<h2>联系人列表</h2>
				<div class="contact active" onclick="changeActive(this)">
					<span class="contact-name">联系人1</span>
					<div class="contact-status status-online"></div>
				</div>
				<div class="contact" onclick="changeActive(this)">
					<span class="contact-name">联系人2</span>
					<div class="contact-status status-offline"></div>
				</div>
				<div class="contact" onclick="changeActive(this)">
					<span class="contact-name">联系人3</span>
					<div class="contact-status status-away"></div>
				</div>
			</div>
			<div class="conversation" id="conversation">
				<h3 id="current-contact">联系人姓名</h3>
				<div class="message-container" id="message-container">
				</div>
				<div class="input-container">
					<textarea class="message-input" id="message-input" placeholder="Enter 发送, ALT+回车 换行"
						rows="8"></textarea>
					<!-- <button class="send-button" onclick="sendMessage()">发送</button> -->
				</div>
			</div>
		</div>

		<script>
			function changeActive(element) {
				var contactList = document.getElementsByClassName('contact');
				for (var i = 0; i < contactList.length; i++) {
					contactList[i].classList.remove('active');
				}
				element.classList.add('active');
				document.getElementById('current-contact').innerText = element.querySelector('.contact-name').innerText;
			}

			// 监听键盘事件
			document.getElementById('message-input').addEventListener('keydown', function(e) {
				if (e.key === 'Enter' && !e.altKey) { // 按下 Enter 键发送消息
					e.preventDefault(); // 阻止默认换行行为
					sendMessage();
				} else if (e.key === 'Enter' && e.altKey) { // 按下 Alt+Enter 换行
					this.value += '\n';
				}
			});

			function sendMessage() {
				var messageInput = document.getElementById('message-input').value;
				var messageContainer = document.getElementById('message-container');
				var div = document.createElement('div');
				div.className = 'message user-message';
				div.innerHTML =   messageInput+'</br></br><span class="message-time">12:35 PM</span>';
				div.style.whiteSpace = 'pre-wrap';
				messageContainer.appendChild(div);
				messageContainer.scrollTop = messageContainer.scrollHeight;
				document.getElementById('message-input').value = '';

				// 模拟对方回复消息
				setTimeout(function() {
					var replyDiv = document.createElement('div');
					replyDiv.className = 'message contact-message';
					replyDiv.innerHTML = messageInput+'</br></br><span class="message-time">12:35 PM</span>';
					replyDiv.style.whiteSpace = 'pre-wrap';
					messageContainer.appendChild(replyDiv);
					messageContainer.scrollTop = messageContainer.scrollHeight;
				}, 1000);
			}
		</script>
	</body>
</html>
相关推荐
C+++Python20 分钟前
如何使用CSS Grid?
css
speedoooo26 分钟前
在现有App里嵌入一个AI协作者
前端·ui·小程序·前端框架·web app
全栈胖叔叔-瓜州37 分钟前
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。
前端·人工智能
三七吃山漆1 小时前
攻防世界——wife_wife
前端·javascript·web安全·网络安全·ctf
用户47949283569151 小时前
面试官问"try-catch影响性能吗",我用数据打脸
前端·javascript·面试
GISer_Jing1 小时前
前端营销技术实战:数据+AI实战指南
前端·javascript·人工智能
GIS之路2 小时前
使用命令行工具 ogr2ogr 将 CSV 转换为 Shp 数据(二)
前端
嘉琪0012 小时前
Vue3+JS 高级前端面试题
开发语言·前端·javascript
vipbic3 小时前
用 Turborepo 打造 Strapi 插件开发的极速全栈体验
前端·javascript
天涯学馆3 小时前
为什么 JavaScript 可以单线程却能处理异步?
前端·javascript