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

仿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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Co-DETR:DETRs与协同混分配训练论文学习笔记

论文地址&#xff1a;https://arxiv.org/pdf/2211.12860.pdf 代码地址&#xff1a; GitHub - Sense-X/Co-DETR: [ICCV 2023] DETRs with Collaborative Hybrid Assignments Training 摘要 作者提出了一种新的协同混合任务训练方案&#xff0c;即Co-DETR&#xff0c;以从多种标…

【漏洞复现】金蝶云星空管理中心 ScpSupRegHandler接口存在任意文件上传漏洞 附POC

漏洞描述 金蝶云星空是一款云端企业资源管理(ERP)软件,为企业提供财务管理、供应链管理以及业务流程管理等一体化解决方案。金蝶云星空聚焦多组织,多利润中心的大中型企业,以 “开放、标准、社交”三大特性为数字经济时代的企业提供开放的 ERP 云平台。服务涵盖:财务、供…

【每日一题】1410. HTML实体解析器-2023.11.23

题目&#xff1a; 1410. HTML 实体解析器 「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括&#xff1a; 双引号&#xff1a;字符实体为 &…

设计山寨枚举

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 一个需求 在Employee类…

2000-2022年上市公司全要素生产率LP方法(含原始数据+测算代码do文档+计算结果)

2000-2022年上市公司全要素生产率测算LP法&#xff08;含原始数据测算代码do文档计算结果&#xff09; 1、时间&#xff1a;2000-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、统计截止日期、固定资产净额、year、股票简称、报表类型编码、折…

shell 条件语句 if case

目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 &#xff08;全真才为真&#xff09; 或 &#xff08;一真即为真&#xff09; 常见条件 双中括号 [[ expression ]] 用法 &…

【Git】git 更换远程仓库地址三种方法总结分享

因为公司更改了 gitlab 的网段地址&#xff0c;发现全部项目都需要重新更改远程仓库的地址了&#xff0c;所以做了个记录&#xff0c;说不定以后还会用到呢。 一、不删除远程仓库修改&#xff08;最方便&#xff09; # 查看远端地址 git remote -v # 查看远端仓库名 git rem…

【Web题】狼追兔问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Visual Studio 2019 C# System.BadImageFormatException 解决方法

文章目录 1.DLL文件缺失或不匹配原因解决方法 2.系统环境变量Path下内容过多原因解决方法 3.位数错误原因解决方法 分析几种可能因素 1.DLL文件缺失或不匹配 原因 检查对应Debug路径下的DLL文件是否有缺失 解决方法 将对应的DLL文件放到Debug文件夹里面&#xff0c;检查冗余…

浅谈JDK动态代理(下)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 动态代理的使命有两个&…

【开源】基于Vue.js的用户画像活动推荐系统

项目编号&#xff1a; S 061 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S061&#xff0c;文末获取源码。} 项目编号&#xff1a;S061&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活…

visionOS空间计算实战开发教程Day 6 拖拽和点击

在之前的学习中我们在空间中添加了3D模型&#xff0c;但在初始摆放后就无法再对其进行移动或做出修改。本节我们在​​Day 5​​显示和隐藏的基础上让我们模型可以实现拖拽效果&#xff0c;同时对纯色的立方体实现点击随机换色的功能。 首先是入口文件&#xff0c;无需做出改变…

leedcode 刷题 - 除自身以外数组的乘积 - 和为 K 的子数组

I238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在…

『Linux升级路』基础开发工具——gcc/g++篇

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、快速认识gcc/g 二、预处理 &#x1f4d2;1.1头文件展开 &#x1f4d2;1…

qgis添加postgis数据

左侧浏览器-PostGIS-右键-新建连接 展开-双击即可呈现 可以点击编辑按钮对矢量数据编辑后是直接入库的&#xff0c;因此谨慎使用。

Rust语言入门教程(一) - 简介及Cargo使用

Rust编程入门 为什么学习Rust 我本人是一个DevOps工程师&#xff0c;并不是专职的开发人员&#xff0c;但需要了解各种各样的语言的基本知识和特性&#xff0c;以便在不同的项目中帮助开发人员设计软件架构&#xff0c;部署流程以及进行错误排查和调试。但是对任何新生的优秀…

Linux常用命令——blkid命令

在线Linux命令查询工具 blkid 查看块设备的文件系统类型、LABEL、UUID等信息 补充说明 在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备&#xff08;包括交换分区&#xff09;所使用的文件系统类型、LABEL、UUID等信息进行…

JavaScript异步编程

同步与异步 #先看 2 段代码 <span style"background-color:#282c34"><span style"color:#2c3e50"><span style"color:#cccccc"><code><span style"color:#999999">//代码1</span> <span styl…

C++学习之路(一)什么是C++?如何循序渐进的学习C++?【纯干货】

C是一种高级编程语言&#xff0c;是对C语言的扩展和增强。它在C语言的基础上添加了面向对象编程&#xff08;OOP&#xff09;的特性&#xff0c;使得开发者能够更加灵活和高效地编写代码。 C的名字中的“”符号表示在C语言的基础上向前发展一步&#xff0c;即“加加”&#x…

多功能回馈式交流电子负载的应用

多功能回馈式交流电子负载是用于模拟和测试电源、电池等电子设备的负载工具。它具有多种应用&#xff0c;可以用于测试和评估各种类型的电源&#xff0c;包括直流电源和交流电源。它可以模拟各种负载条件&#xff0c;如恒定电流、恒定电压和恒定功率&#xff0c;以验证电源的性…