仿ChatGPT对话前端页面(内含源码)

news2024/9/23 3:30:36

仿ChatGPT对话前端页面(内含源码)

  • 前言
  • 布局
  • 样式和Js部分关键点
  • 全部源码

前言

本文主要讲解如何做出类似ChatGPT的前端页面。具体我们的效果图是长这样,其中除了时间是动态的之外,其他都是假数据。接下来让我们从布局和样式的角度分析,如何做出来这样的页面,同时文末有全部源码,需要自取。
在这里插入图片描述
在这里插入图片描述

布局

  • 主要利用flexposition定位进行布局。
  • 首先是用左右布局作为大的布局分工,而最大的布局方式用的是Flex弹性盒子布局,并且用justify-content: center;align-content: center;对盒子进行水平垂直居中。接下来讲解左右两边布局。
  • 左侧布局占据flex:1,我们发现这里有个按钮来控制视图显示隐藏,这个按钮用的是定位中的父元素relative和子元素absolute控制垂直居中,然后用点击事件click来分别让左侧CSS的display变成none或者block进行显示隐藏。
  • 左侧 上面布局:着重讲一下前端性能优化那里,那里用了一个flex布局,那个边框里…,占据了flex:1,而右侧文字占据flex:8
  • 左侧 下面布局:也是flex布局,左侧头像布局为flex:1,而右侧占据的是3,同时头像颜色是通过linear-gradient进行设置,原角度是利用border-radius:50%进行圆的绘制。
  • 右侧布局:右侧布局又分为上下两部分,上部分是通过position定位中的绝对定位absolute,top,right属性来实现布局。
  • 下部分是通过定位position:absolute;bottom:0;right来实现布局的
  • 比较有意思的是,我在JavaScript中把时间变成了动态的,是通过new一个Date对象,然后把值赋给时间样式id的innerHTML实现的。

样式和Js部分关键点

  • input点击不出现黑色边框: outline: none;
  • 计算盒子宽高时候不计算它的边框和内边距:box-sizing: border-box;
  • 日期是Date日期对象自带的方法调用,创建了一个函数用于判断时间是否需要补0操作
  • 在这里插入图片描述

用的是三目表达式作为返回值。

全部源码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			* {
				margin: 0;
				padding: 0;
				outline: none;
				box-sizing: border-box;
			}

			body {
				margin: 1vh 20px;
				min-height: 98vh;
				display: flex;
				justify-content: center;
				align-content: center;
				/* border: 1px solid lightgray; */
				box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px;
			}

			.left_layout {
				flex: 1;
				border-right: 1px solid lightgray;
			}

			.right_layout {
				flex: 6;
			}

			.father_icon {
				position: relative;
			}

			.son_icon {
				background-color: white;
				z-index: 99;
				position: absolute;
				font-size: 20px;
				border-radius: 50%;
				border: 1px solid lightgray;
				padding: 0px 5px;
				box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px;
				color: gray;
			}

			.son_icon_display {
				top: 48vh;
				right: -15px;
			}

			.son_icon_hideen {
				top: 48vh;
				left: 10px;
				display: none;
			}

			.new_chat {
				border: 1px solid lightgray;
				padding: 10px 20px;
				margin: 20px 10px;
				text-align: center;
			}

			.new_chat_text {
				border: 1px solid green;
				display: flex;
			}

			.left_person {
				width: 100%;
				padding: 1vh 20px;
				/* margin:20px 10px; */
				position: absolute;
				top: 90vh;
				border-top: 1px solid lightgray;
			}

			.false_img {
				/* background:linear-gradient(-135deg,#0c80cc,#009dff); */
				flex: 1;
			}

			.false_img_right {
				flex: 3;
			}

			.flase_img_son {
				width: 50px;
				height: 50px;
				background: linear-gradient(-135deg, #0000cc, #009dff);
				border: 1px solid lightblue;
				border-radius: 50%;
			}
		
			.right_layout_flex{
				display:flex;
				justify-content: center;
				align-items: center;
			}
			.right_layout_son{
				margin:0 auto 0 auto;
				width:100vh;
				height:98vh;
				/* border:1px solid gray; */
				position: relative;
			}
			.right_layout_son_ipt{
				position: absolute;
				bottom:0;
			}
			.btn{
				border:none;
				padding:10px 15px;
				background-color: #18a058;
				border-radius: 1px;
				color:white;
			}
			.ipt{
				width:85vh;
				margin:10px 20px;
				padding:10px 20px;
				border:1px solid lightgray;
			}
			.right_layout_myselfChat{
				width:200px;
				position: absolute;
				top:5px;
				right:0;
				display:flex;
			}
			.myself_chat{
				position: absolute;
				top:30px;
				right:80px;
				padding:10px 20px;
				border-radius: 10px;
				background-color: #7ae1b6;
				opacity: 0.8;
			}
		</style>
	</head>
	<body>
		<div id="sonHiddenIcon" class="son_icon son_icon_hideen" onclick="btn_display_icon()"></div>
		<div class="left_layout" id="left_layout_id">
			<div class="father_icon">
				<div id="sonIcon" class="son_icon son_icon_display" onclick="btn_icon()"></div>
				<div id="left_person" class="left_person">
					<div style="display:flex;justify-content: center;align-items:center">
						<div class="false_img">
							<div class="flase_img_son"></div>
						</div>
						<div class="false_img_right">
							<strong>Michael Jackson</strong>
						</div>
					</div>
				</div>
			</div>
			<div class="new_chat">新建聊天</div>
			<div class="new_chat new_chat_text">
				<div class="false_img" style="border:1px solid lightgray;border-radius:20%;color:green;">...</div>
				<div style="flex:8;color:green;">前端有哪些性能优化?</div>
			</div>
		</div>
		<div class="right_layout">
			<!-- <div class="right_layout_flex"> -->
				<div class="right_layout_son">
					<div class="right_layout_myselfChat">
						<div id="datatime" style="flex:2;font-size:13px;color:lightgray"></div>
						<div style="flex:1">
							<div class="flase_img_son" style="width:40px;height:40px;"></div>
						</div>
					</div>
					<div class="myself_chat">
						前端有哪些性能优化?
					</div>
					<div class="right_layout_son_ipt">
						<input class="ipt" type="text" placeholder="来说点什么吧...">
						<button class="btn">发送</button>
					</div>
				</div>
			<!-- </div> -->
		</div>
		<script>
			let display_sonIcon = document.getElementById('sonIcon')
			let hidden_sonIcon = document.getElementById('sonHiddenIcon')
			let left_layout_id = document.getElementById('left_layout_id')
			let myself_datetime=document.getElementById('datatime')
			display_sonIcon.innerHTML = '<'
			hidden_sonIcon.innerHTML = '>'

			function btn_icon() {
				left_layout_id.style.display = 'none'
				hidden_sonIcon.style.display = 'block'
			}

			function btn_display_icon() {
				left_layout_id.style.display = 'block'
				hidden_sonIcon.style.display = 'none'
			}
			function isZero(num){
				return (num < 10 ? '0' : '') + num;
			}
			function getDateTime(DOM){
				let datetime=new Date;
				let year=datetime.getFullYear();
				let month=isZero(datetime.getMonth()+1);
				let day=isZero(datetime.getDate());
				let hour=isZero(datetime.getHours());
				let minute=isZero(datetime.getMinutes());
				let seconds=isZero(datetime.getSeconds());
				let date=year+'/'+month+'/'+day+' '+hour+':'+minute+":"+seconds;
				DOM.innerHTML=date
			}
			getDateTime(myself_datetime)
		</script>
	</body>
</html>

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

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

相关文章

Redis打包事务,分批提交

一、需求背景 接手一个老项目&#xff0c;在项目启动的时候&#xff0c;需要将xxx省整个省的所有区域数据数据、以及系统字典配置逐条保存在Redis缓存里面&#xff0c;这样查询的时候会更快; 区域数据字典数据一共大概20000多条,&#xff0c;前同事直接使用 list.forEach…

Django框架之中间件

目录 一、引入 二、Django中间件介绍 【1】什么是Django中间件 【2】Django中间件的作用 【3】示例 三、Django请求生命周期流程图 四、Django中间件是Django的门户 五、Django中间件详解 六、中间件必须要掌握的两个方法 (1) process_request (2) process_respon…

支持对协议和会话分享动作进行授权,新增API Key白名单功能,JumpServer堡垒机v3.9.0发布

2023年11月20日&#xff0c;JumpServer开源堡垒机正式发布v3.9.0版本。在这一版本中&#xff0c;JumpServer对授权功能进行了优化&#xff0c;增加了对“会话分享”及“资产协议”的配置&#xff0c;方便管理员以更细的颗粒度对各种资源进行控制&#xff1b;针对使用API Key与J…

教你看现货黄金实时报价

现货黄金投资市场上的交易软件众多&#xff0c;很多人不知道选择什么软件好&#xff0c;但选择主流软件MT4&#xff0c;基本就可以满足投资者不同的需求。本文为大家讲讲&#xff0c;为什么有那么多的投资者&#xff0c;都选择通过MT4获取实时的行情报价。 现货黄金市场波动激烈…

Linux中flask项目开启https访问

1.下载阿里云免费证书 2.项目添加https配置 3.服务器开启https访问 3.1 重新安装OpenSSL 3.2.重新安装Python 上一次已经讲过Linux安装部署Python: Linux安装Python3.10与部署flask项目实战详细记录,今天记录一下Python项目如何支持https访问…

免费开源 GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台)全套源码

GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台) 讨论群v:&#x1f680;18601938676 一、AI人工智能开发-------------面临的问题和挑战 1. GPU管理难题 1.1 资源管理难&#xff1a;算力资源昂贵&#xff0c;但是缺乏有效管理&#xff0c;闲置情况严重。 1.2 用户…

RabbitMQ快速学习之WorkQueues模型、三种交换机、消息转换器(SpringBoot整合)

文章目录 前言一、WorkQueues模型消息发送消息接收能者多劳 二、交换机类型1.Fanout交换机消息发送消息接收 2.Direct交换机消息接收消息发送 3.Topic交换机消息发送消息接收 三、编程式声明队列和交换机fanout示例direct示例基于注解 四、消息转换器总结 前言 WorkQueues模型…

【2023-11-23】生成A~Z编号

生成A~Z编号 需要生成 A~Z的编号&#xff0c;当新的编号超过Z时&#xff0c;从A1开始&#xff0c;依次为B1 C1一直至Z1,如此循环。 最大支持字母为Z&#xff0c;超过后以添加数字后缀的形式标记 简单代码 默认从A开始循环 function getLimitNumber(_total) {var num 0var …

轻松管理文件名:文件批量重命名的技巧与操作

在日常工作中&#xff0c;文件管理是一项至关重要的任务。其中&#xff0c;文件名的管理更是关键。文件名是在查找文件时最直观的线索。一个好的文件名简短而准确地反映文件的内容或用途。然而&#xff0c;随着时间的推移&#xff0c;可能会发现文件名变得冗长、混乱甚至无法反…

壳牌——利用人工智能应对新能源转型

荷兰皇家壳牌(Shell)最初是一家卖贝壳的商店&#xff0c;截至 2018 年&#xff0c;它是全球收入排名第五的公司。它的业务范围涵盖从勘探和钻探到提炼和零售的整个燃料供应链。壳牌在石油、天然气、生物燃料、风能和太阳能等端到端燃料生产领域处于世界领先地位。 当前&#x…

【算法】缓存淘汰算法

目录 1.概述2.代码实现2.1.FIFO2.2.LRU2.3.LFU2.4.Clock2.5.Random 3.应用 1.概述 缓存淘汰策略是指在缓存容量有限的情况下&#xff0c;当缓存空间不足时决定哪些缓存项应当被移除的策略。缓存淘汰策略的目标是尽可能地保持缓存命中率高&#xff0c;同时合理地利用有限的缓存…

【Linux系统编程二十】:(进程通信2)--命名管道/共享内存

【Linux系统编程二十】&#xff1a;命名管道/共享内存 一.命名管道1.创建管道2.打开管道3.进行通信(server/client) 二.共享内存1.实现原理2.申请内存3.挂接4.通信5.去关联6.释放共享内存7.特性&#xff1a; 一.命名管道 上一篇介绍的一个管道是没有名字的 因为你打开那个文件…

前端工程、静态代码、Html页面 打包成nginx 的 docker镜像

1. 创建一个 mynginx的目录 2. 将前端代码文件夹&#xff08;比如叫 front &#xff09;复制到 mynginx 目录下 3. 在mynginx 目录下创建一个名为Dockerfile 的文件&#xff08;文件名不要改&#xff09;&#xff0c;文件内容如下&#xff1a; # 使用官方的 Nginx 镜像作为基…

【C++】泛型编程 ⑭ ( 类模板示例 - 数组类模板 | 容器思想 | 自定义类可拷贝 - 深拷贝与浅拷贝 | 自定义类可打印 - 左移运算符重载 )

文章目录 一、容器思想1、自定义类可拷贝 - 深拷贝与浅拷贝2、自定义类可拷贝 - 代码示例3、自定义类可打印 - 左移运算符重载 二、代码示例1、Array.h 头文件2、Array.cpp 代码文件3、Test.cpp 主函数代码文件4、执行结果 一、容器思想 1、自定义类可拷贝 - 深拷贝与浅拷贝 上…

企业软件定制开发的优势|app小程序网站搭建

企业软件定制开发的优势|app小程序网站搭建 企业软件定制开发是一种根据企业特定需求开发定制化软件的服务。相比于购买现成的软件产品&#xff0c;企业软件定制开发具有许多优势。 1.企业软件定制开发可以满足企业独特需求。每个企业都有自己独特的业务流程和需求&#xff0c;…

为什么vue中数组和对象的props默认值要写成函数形式?

多个组件数据不相互干涉 假如在一个地方引用了同一个组件&#xff0c;并给他们都绑定了单独的值。如果只声明为一个对象或数组&#xff0c;可能会导致在某一个实例中修改数据&#xff0c;影响到其他实例中的数据&#xff0c;因为数组和对象是引用类型的数据。为了在多次引用组件…

揭秘:如何精准定位性能瓶颈,优化系统性能?

你好&#xff0c;我是静姐&#xff0c;目前在一家准一线互联网大厂做测试开发工程师。对于一般公司普通测试工程师来说&#xff0c;可能性能测试做的并不是很复杂&#xff0c;可能只是编写下脚本&#xff0c;做个压测&#xff0c;然后输出报告结果&#xff0c;瓶颈分析和调优的…

ubuntu安装cuda驱动报错及解决,屡试不爽

机器重启输入nvidia-smi提示如下错误,字面意思就是驱动和库不匹配 Failed to initialize NVML: Driver/library version mismatch 查看一下nvidia相关库 sudo dpkg --list | grep nvidia-* 将所有已安装库卸载 sudo apt purge nvidia-* 重新安装驱动 sudo ./NVIDIA-Linux-…

Java实现王者荣耀小游戏

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造成基础伤害。小…

redis的集群,主从复制,哨兵

redis的高可用 在Redis中&#xff0c;实现高可用的技术主要包括持久化、主从复制、哨兵和集群&#xff0c;下面分别说明它们的作用&#xff0c;以及解决了什么样的问题。 持久化&#xff1a; 持久化是最简单的高可用方法&#xff08;有时甚至不被归为高可用的手段&#xff09;…