前端技术(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>
相关推荐
ordinary9028 分钟前
指令-v-for的key
前端·javascript·vue.js
rpa_top31 分钟前
RPA 助力电商:自动化商品信息上传,节省人力资源 —— 以影刀 RPA 为例【rpa.top】
大数据·前端·人工智能·自动化·rpa
新时代农民工--小明32 分钟前
前端自动化部署更新,自动化打包部署
运维·前端·自动化
前端Hardy1 小时前
HTML&CSS:酷炫的3D开关控件
前端·javascript·css·3d·html
小马超会养兔子1 小时前
如何写一个数字老虎机滚轮
开发语言·前端·javascript·vue
m0_672449601 小时前
前端(组件传参案例)
前端
devotemyself1 小时前
vue的ElMessage的css样式不生效
前端·css·vue.js
Mr。轩。1 小时前
Vue 单表 CRUD模板 前端
前端·javascript·vue.js
irisMoon061 小时前
react项目框架了解
前端·javascript·react.js
Yvemil72 小时前
《开启微服务之旅:Spring Boot Web开发举例》(二)
前端·spring boot·微服务