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

来源: GPT生成之后微调

效果图

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: absolutemargin-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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存图及其画法

所有的文件都存在硬盘上&#xff0c;首次使用的时候才会进入内存 进程&#xff1a;有自己的Main方法&#xff0c;并且依赖自己Main运行起来的程序。独占一块内存区域&#xff0c;互不干扰。内存中有一个一个的进程。 操作系统只认识c语言。操作系统调度驱动管理硬件&#xff0…

树与图深度优先遍历——acwing

题目一&#xff1a;树的重心 846. 树的重心 - AcWing题库 分析 采用暴力枚举&#xff0c;试探每个点&#xff0c;除去之后&#xff0c;连通分量最大值是多少&#xff0c; 各个点的最大值找最小的 因为可以通过 dfs 来得到 根u以下点数&#xff0c;以及可以求各分树的点数&am…

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…

Data Uncertainty Learning in Face Recognition 论文阅读

Data Uncertainty Learning in Face Recognition 论文阅读 Abstract1. Introduction2. Related Work3. Methodology3.1. Preliminaries3.2. Classification-based DUL for FR3.3. Regression-based DUL for FR3.4. Discussion of Related Works 4. Experiments4.1. Datasets an…

基础算法——搜索与图论

搜索与图论 图的存储方式2、最短路问题2.1、Dijkstra算法&#xff08;朴素版&#xff09;2.2、Dijkstra算法&#xff08;堆优化版&#xff09;2.3、Bellman-Ford算法2.4、SPFA求最短路2.5、SPFA判负环2.6、Floyd算法 图的存储方式 2、最短路问题 最短路问题可以分为单源最短路…

典型常见的知识蒸馏方法总结一

来源&#xff1a;https://github.com/HobbitLong/RepDistiller收录的方法 NeurIPS2015: Distilling the Knowledge in a Neural Network 知识蒸馏开山之作&#xff0c;从logits中蒸馏知识&#xff0c;KL散度损失 ICLR2015&#xff1a;FitNets: Hints for Thin Deep Nets A h…

十、软件设计架构-微服务-服务调用Feign

文章目录 前言一、Feign介绍1. 什么是Feign2. 什么是Http客户端3. Feign 和 OpenFeign 的区别 二、Feign底层原理三、Feign工作原理详解1. 动态代理机制2. 动态代理的创建过程3. 创建详细流程4. FeignClient属性 四、Feign使用1. 常规调用2.日志打印3. 添加Header 前言 服务调…

在 LS-DYNA 中将应力转换为用户定义的坐标系

介绍 通常&#xff0c;使用 LS-DYNA 或 Ansys Mechanical 等仿真工具解决工程问题需要将张量结果与解析解进行比较。一个这样的例子是加压圆柱体&#xff0c;其中圆周应力或环状应力是感兴趣的主要应力度量。例如&#xff0c;如果对具有复杂端部处理的几何结构进行此类仿真&am…

树莓集团是如何链接政、产、企、校四个板块的?

树莓集团作为数字影像行业的积极探索者与推动者&#xff0c;我们通过多维度、深层次的战略举措&#xff0c;将政、产、企、校四个关键板块紧密链接在一起&#xff0c;实现了资源的高效整合与协同发展&#xff0c;共同为数字影像产业的繁荣贡献力量。 与政府的深度合作政府在产业…

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…

debian ubuntu armbian部署asp.net core 项目 开机自启动

我本地的环境是 rk3399机器&#xff0c;安装armbian系统。 1.安装.net core 组件 sudo apt-get update && \sudo apt-get install -y dotnet-sdk-8.0或者安装运行库&#xff0c;但无法生成编译项目 sudo apt-get update && \sudo apt-get install -y aspnet…

qt QNetworkAccessManager详解

1、概述 QNetworkAccessManager是QtNetwork模块中的一个核心类&#xff0c;它允许应用程序发送网络请求并接收响应。该类是网络通信的基石&#xff0c;提供了一种方便的方式来处理常见的网络协议&#xff0c;如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用…

21、结构体成员分布

结构体中的成员并不是紧挨着分布的&#xff0c;内存分布遵循字节对齐的原则。 按照成员定义的顺序&#xff0c;遵循字节对齐的原则存储。 字节对齐的原则&#xff1a; 找成员中占据字节数最大的成员&#xff0c;以它为单位进行空间空配 --- 遇到数组看元素的类型 每一个成员距离…

前端基础——CSS

美化文档 HTML内部添加样式 本节我们来学习如何在标签中引入CSS样式。 1 在标签中添加声明 声明的关键字是style后接等号&#xff08;&#xff09;再接引号&#xff08;""&#xff09;&#xff0c;即style"" 具体声明如下&#xff1a; <input typ…

WPS解决Word文件引入excel对象文件无法打开提示“不能启动此对象...”的问题

一、问题现象 接收到了一份 Word文件&#xff0c;里面引入了一个Excel对象文件&#xff0c;双击时候&#xff0c;wps出现卡顿&#xff0c;过一会之后弹出错误提示&#xff1a;不能启动此对象... 二、解决方法 1.点击WPS左上角图标&#xff0c;并打开右上角设置&#xff0c;萱蕚…

spring下的beanutils.copyProperties实现深拷贝

spring下的beanutils.copyProperties方法是深拷贝还是浅拷贝&#xff1f;可以实现深拷贝吗&#xff1f; 答案&#xff1a;浅拷贝。 一、浅拷贝深拷贝的理解 简单说拷贝就是将一个类中的属性拷贝到另一个中&#xff0c;对于BeanUtils.copyProperties来说&#xff0c;你必须保…

3GPP R18 LTM(L1/L2 Triggered Mobility)是什么鬼?(三) RACH-less LTM cell switch

这篇看下RACH-less LTM cell switch。 相比于RACH-based LTM,RACH-less LTM在进行LTM cell switch之前就要先知道target cell的TA信息,进而才能进行RACH-less过程,这里一般可以通过UE自行测量或者通过RA过程获取,而这里的RA一般是通过PDCCH order过程触发。根据38.300中的描…

Ansible 运维工具

安装 apt install ansible /etc/ansible/hosts , 指定密码或密钥访问分组机器 [k8s_masters] master0.c0.k8s.sb[k8s_nodes] node0.c0.k8s.sb node1.c0.k8s.sb[k8s:children] k8s_masters k8s_nodes[k8s_masters:vars] ansible_ssh_usersbadmin ansible_ssh_pass"***&q…

三菱JET伺服CC-Link IE现场网络Basic链接软元件(RYn/RXn)(RWwn/RWrn)

链接软元件(RYn/RXn) 要点 在循环通信中对主站发送给伺服放大器的请求(RYn及RWwn)设定了范围外的值时&#xff0c;将无法反映设定内容。 循环通信的请求报文与响应报文的收发数据被换读为伺服放大器的对象数据(RYn、RXn)。 响应报文的设定值可进行变更。变更初始设定值时&…

WPF中的VisualState(视觉状态)

以前在设置控件样式或自定义控件时&#xff0c;都是使用触发器来进行样式更改。触发器可以在属性值发生更改时启动操作。 像这样&#xff1a; <Style TargetType"ListBoxItem"><Setter Property"Opacity" Value"0.5" /><Setter …