前端实现聊天对话框页面

HTML部分 

<!dtype html>
<html>
<head>
<meta charset="utf-8">
<title>与客服1聊天中</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="format-detection" content="telephone=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" href="chat.css">
<script src="jquery.js"></script>
</head>
<body>
<div class="chat-wrapper">
    <div id="btn_open" class="chat-support-btn" draggable="true"><!-- 聊天窗口缩小后的头像图标 -->
       <img src='images/h.jpg'></img>
    </div> 
    <div class="chat-main" draggable="true">
		<div class='chat-simulator'>
			<p id="chat_hint" class="chat-hint"><span class="chat-hint-icon">!</span><span class="chat-hint-text" style='color:black'>发送内容不能为空</span></p>
			<textarea class='simulator-text' autofocus placeholder='请写下你希望我对你说的话,按enter键提交(shift+enter键换行)。'></textarea>
			<div class='simulator-btn'>
			<button class='simulator-submmit'>提交</button>
			<button class='simulator-close'>关闭</button>
			</div>
		</div>
        <div class="chat-header">
            <i id="btn_close" class="chat-close">></i>
            <div class="chat-service-info">
                <a class="chat-service-img"></a>
                <div class="chat-service-title">
                    <p class="chat-service-name">客服1</p>
                    <p class="chat-service-detail">我是您的专属客服</p>
                </div>
            </div>
        </div>
        <div id="chat_contain" class="chat-contain">
            <!-- <p class="chat-service-contain">
            				<span class="chat-text chat-service-text">您好</span>
            			</p> -->
        </div>
        <div class="chat-submit">
            <p id='chatHint' class="chat-hint"><span class="chat-hint-icon">!</span><span class="chat-hint-text">发送内容不能为空</span></p>
            <textarea id="chat_input" class="chat-input-text" autofocus placeholder="请输入您想对我说的话,按Enter键发送(shift+Enter换行)。"></textarea>
            <div class="chat-input-tools">
                <button class="chat-input-button">发送</button>
				<button class="chat-service-simulator">模拟</button>
				<button class="chat-close-button">关闭</button>
            </div>
        </div>
		<div class="header-info-div">
			<h2 class="header-info-h2">客服1</h2>
			<span class="header-info-span">我是您的专属客服</span>
		</div>
    </div>
</div>
<script>
    var d = document;
		/*显示对话窗口*/
		function openBody(){
		$('.chat-support-btn').css({'display': 'none'});
        $('.chat-main').css({'display': 'inline-block', 'height': '0'});
        $('.chat-main').animate({'height': '600px'})
		}
		openBody();
		// 模拟一些后端传输数据
    var serviceData = {
        'robot': {
            'chat': ['Google一下吗?www.google.com','这个网站您看一下www.baidu.com', '稍等哦~','嘿嘿','百度一下?www.baidu.com','嗯嗯嗯'],
        }
    };

	var chatMain=$('.chat-main'),
		chatHint = $('#chatHint'),
		chat_Hint = $('#chat_hint'),
		headerInfoDiv=$('.header-info-div');
		chat_main=d.querySelector('.chat-main');
		chatInput = d.querySelector('#chat_input'),
        chatContain = d.querySelector('#chat_contain'),
        btnOpen = d.querySelector('#btn_open'),
        btnClose =d.querySelector('#btn_close');

	
	/*拖动*/
	 
	document.ondragover=function(e){
  console.log("Firefox上此处不会执行,Chrome正常");
  e.preventDefault();
};
	function chatDrag(target){
	target.ondragstart=function(e)
	{
		e=e||window.event;
		e.dataTransfer.clearData();
		offsetX= e.offsetX;
        offsetY= e.offsetY;
		/*e.dataTransfer.setData("offsetX",String(offsetX));
		e.dataTransfer.setData("offsetY",String(offsetY));
		console.log(offsetX+' ..'+offsetY);
		console.log(e.dataTransfer.getData("offsetX")+'..'+e.dataTransfer.getData("offsetY"));*/
	}
	target.ondrag=function(e)
	{	
		e=e||window.event;
		var x= e.pageX;
        var y= e.pageY;
        if(x==0 && y==0){
            return; //不处理拖动最后一刻X和Y都为0的情形
        }
        x-=offsetX;
        y-=offsetY;
		/*x-=Number(e.dataTransfer.getData("offsetX"));
		y-=Number(e.dataTransfer.getData("offsetY"));*/
		target.style.left=x+'px';
        target.style.top=y+'px';
	}
	}
	chatDrag(chat_main);//拖动聊天窗口
	chatDrag(btnOpen);//拖动头像小图标
    
	
	/*头像信息*/

	/*鼠标在头像上*/
	 $('.chat-service-img').mouseenter(
		function(){
			headerInfoDiv.fadeIn(1000);
		}
	 )
	 $('.chat-service-img').mouseleave(
		function(){
			headerInfoDiv.fadeOut();
		}
	 )
	/*关闭对话框*/
	function closeChat(){
		$('.chat-main').animate({'height': '0'});
        $('.chat-main').css({'display': 'none'});
        $('.chat-support-btn').css({'display': 'inline-block'});
	}

     btnOpen.addEventListener('click', function(e) {/*点击头像打开聊天窗口*/
		e = e||window.event;
        openBody();
    }) 

    btnClose.addEventListener('click',closeChat)
	
	/*创建新消息框*/
	function createInfo(name,value)
	{
		var chatTime=new Date();
			chatTime=chatTime.toLocaleTimeString();
		var nodeP = d.createElement('p'),
                nodeSpan = d.createElement('span')
					nodeTime=d.createElement('p');
			value=value.replace(/(((ht|f)tps?):\/\/)?([A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*)/g,function(content){
			return "<a href='http://"+content+"' class='chat-address' target='view_window' style='color:#6666cc '>"+content+'</a>';;
		});	
            nodeP.classList.add('chat-'+name+'-contain');
            nodeSpan.classList.add('chat-'+name+'-text','chat-text');
			nodeTime.classList.add('chat-time');
            nodeSpan.innerHTML =value;
			nodeTime.innerHTML=chatTime;
			nodeP.appendChild(nodeTime);
            nodeP.appendChild(nodeSpan);
            chatContain.appendChild(nodeP);
            chatContain.scrollTop = chatContain.scrollHeight;
	}
	createInfo('service','您好'); /*发送第一句话*/   
	var timer,
        timerId,
		flagInput=false;
        shiftDown = false;  // 判断是否按住shift键
	
	function chatHintNull(chatHint){//空输入提示
		setTimeout(function(){
			                chatHint.fadeIn();
			                clearTimeout(timerId);
			                timer = setTimeout(function() {
			                chatHint.fadeOut();
			                }, 1000);
			            }, 10);
			            timerId = timer;
	};
	/*监控是否按下enter*/
	function isEnter(Input,Hint,type,e){
		e = e||window.event;
		 if (e.keyCode == 16) {//按住shift键
            shiftDown = true;
        }
		if(e.keyCode==13)
		{
			
			if(shiftDown==true)
			{ 
				shiftDown=false; 
				return true;
			}
			else if(shiftDown==false&&Input.value == '')
			{
				Hint();
				return true;
			}
			else 
			{
				e.preventDefault();
				createInfo(type,Input.value);
				submityouText(Input.value);
				Input.value = null;
				Input.focus();
				
			}
		}
	}

    chatInput.addEventListener('keydown', function(e) {/*输入框按enter*/
		e = e||window.event;
        isEnter(chatInput,chatHintNull,'you',e);
	})
	
	/*为按钮绑定事件*/
	$('.chat-input-button').click(function(){/*消息框发送*/

		if(chatInput.value!='')
		{
			createInfo('you',chatInput.value);
			submityouText(chatInput.value);
			chatInput.value = null;
			chatInput.focus();
			
		}
		else
		{
			chatHintNull(chatHint);
		}
	});
	/*模拟后台消息*/
	var chatSim=$('.chat-simulator'),
		sim_Text=d.querySelector('.simulator-text');
		simText=$('.simulator-text');
	$('.chat-service-simulator').click(
		function(){
			chatSim.fadeIn(500);
			simText.focus();
		}
	);
	$('.simulator-submmit').click(function(){
		if(simText.val()=='')
		{
			chatHintNull(chat_Hint);
		}
		else{
		createInfo('service',simText.val());
		simText.val('');
		simText.focus();
		}
	});
	/*模拟的输入框enter键判断*/
	sim_Text.addEventListener('keydown', function(e) {
		e = e||window.event;
        isEnter(sim_Text,chatHintNull,'service',e);
	})
	$('.simulator-close').click(function()
	{
		chatSim.fadeOut();
		simText.val('');
		simText.focus();
	});

	/*关闭按钮*/
	$('.chat-close-button').click(
		function()
		{
			if (confirm("不再聊会儿吗?")){
				window.close();
			}
			else{}
		}
	);
	/*按钮特效*/
	var buttons=$('button');
	buttons.each(function(i)
	{
		$(this).mouseenter(function(){
		buttons.eq(i).fadeTo('slow',0.8);
	});
	}
	)
	buttons.each(function(i)
	{
		$(this).mouseleave(function(){
		buttons.eq(i).fadeTo('slow',1);
	});
	}
	)
	
    function submityouText(text) {

        // 模拟后端回复
        var num = Math.random() * 10;
        if (num <= 7) {
            getServiceText(serviceData);
        }
    }

    function getServiceText(data) {/*已定义后台消息框*/
        var serviceText = data.robot.chat,
            i = Math.floor(Math.random() * serviceText.length);
		createInfo('service',serviceText[i]);
    }

</script>
</body>
</html>

css部分

@charset "utf-8";
/*公共样式*/
html{font-family:"Helvetica Neue",Helvetica,STHeiTi,sans-serif;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;}
body{-webkit-overflow-scrolling:touch;margin:0;}
ul{margin:0;padding:0;list-style:none;outline:none;}
dl,dd{margin:0;}
a{display:inline-block;margin:0;padding:0;text-decoration:none;background:transparent;outline:none;color:#000;}
a:link,a:visited,a:hover,a:active{text-decoration:none;color:currentColor;}
a,dt,dd{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;}
img{border:0;}
p{margin:0;}
input,button,select,textarea{margin:0;padding:0;border:0;outline:0;background-color:transparent;}
button:hover{
	cursor:pointer;
}
/*css reset*/
body {
    position: relative;
}

.chat-wrapper {
    font-size: 14px;
    color: #fff;
}
/*右侧按钮*/
 .chat-support-btn {
    position: fixed;
    display: inline-block;
    top: 50%;
    right: 0;
    margin-top: -70px;
    width: 40px;
    height: 40px;
	cursor:pointer;
	
}
.chat-support-btn img{
	position:absolute;
	border-radius:50%;
}
/* 对话框*/
.chat-main {
    position: fixed;
    display: none;
    right: 100px;
    bottom: 10px;
    width: 650px;
    height: 800px;
    border-radius: 4px; 
    box-shadow: 0 0 5px rgba(0, 0, 0, .4);
} 

/*对话框头部*/
.chat-header {
    position: relative;
    padding: 10px;
    height: 80px;
    border-top-left-radius: 4px;
    border-top-right-radius: 4px;
    box-shadow: 0 0 5px rgba(0, 0, 0, .2);
    background-color: #cc3333;
}
.chat-header a:hover{
	cursor:pointer;
}
/*个人信息框*/
.header-info-div{
	display:none;
	width:290px;
	height:150px;
	margin:-600px 0 0 -300px;
	border-radius:4px;
	background-image:url("images/bg.jpeg");
}
.header-info-h2{
	display:inline-block;
	margin:15px 0 0 25px;
}
.header-info-span{
	position:absolute;
	top:45px;
	left:-276px;
}
.chat-close {
    position: absolute;
    top: 10px;
    right: 20px;
    padding: 2px;
    font-size: 22px;
    transform: rotate(90deg);
    cursor: pointer;
}

.chat-service-info {
    position: relative;
    top: 50%;
    margin-top: -20px; 
    height: 40px;
}

.chat-service-img {
    display: inline-block;
    margin: 0 10px 0 20px;
    width: 40px;
    height: 40px;
    text-align: center;
    line-height: 40px;
    vertical-align: middle;
    color: #000;
    border-radius: 50%;
    box-shadow: 1px 1px 4px rgba(0, 0, 0, .2);
    background-image: url("images/h.jpg");
}

.chat-service-title {
    display: inline-block;
    vertical-align: middle;
}

.chat-service-detail {
    font-size: 12px;
}

/*对话框内容*/
.chat-contain {
    overflow-y: auto;
    padding: 10px;
    height: 380px;
    word-wrap: break-word;
    background-color: #f9f9f9;
}

.chat-text {
    display: inline-block;
    position: relative;
    padding: 10px;
    max-width: 120px;
	color:black;
    white-space: pre-wrap;
    border: 1px solid #ffff7d;
    border-radius: 4px;
    background-color: #ffff7d;
    box-sizing: border-box;
	
}
.chat-time{
	color:#939393;
	font-size:12px;
}
.chat-service-contain {
    margin-bottom: 10px;
    text-align: left;
}
.chat-service-contain .chat-time{
	margin:0 0 0 37px;
} 
.chat-address{
	display:inline-block;
	max-width:100px;
	white-space:pre-wrap;
}
.chat-service-text {
    margin-left:40px;
}
.chat-service-text:before {
    content: '';
    position: absolute;
	top: 50%;
    left:-48px;
	width:35px;
	height:36px;
	border:1px solid transparent;
	background-image:url('images/hs.jpg');
	border-radius:50%;
    -webkit-transform: translate(0, -50%);
    transform: translate(0, -50%);
}
.chat-you-contain {
    margin-bottom: 10px;
    text-align: right;
	/* float:right; */
}
.chat-you-contain .chat-time{
	margin:0 20px 0 0;
}
.chat-you-text {
    margin-right: 20px;
	text-align:left;
}

.chat-you-text:after {
    content: '';
    position: absolute;
    top: 50%;
    right: -10px;
    width: 0;
    height: 0;
    border-top: 6px solid transparent;
    border-bottom: 6px solid transparent;
    border-left: 10px solid #ffff7d;
    -webkit-transform: translate(0, -50%);
    transform: translate(0, -50%);
}
/*客服对话框底部与输入*/
.chat-submit {
    position: relative;
    padding: 10px;
    height: 100px;
    color: #000;
    word-wrap: break-word;
    border-top: 1px solid #ddd;
    box-sizing: border-box;
}

/*空输入提示*/
.chat-hint {
	display:none;
    position:absolute;
    top: -15px;
    left: 20px;
    padding: 2px;
    width: 140px;
    height: 18px;
    font-size: 12px;
    text-align: center;
    line-height: 18px;
    border: 1px solid #ddd;
    box-shadow: 1px 1px 4px rgba(0, 0, 0, .4);
    background-color: #fff;
}

.chat-hint-icon {
    display: inline-block;
    width: 18px;
    height: 18px;
    margin-right: 5px;
    font-size: 14px;
    font-style: italic;
    font-weight: 700;
    vertical-align: middle;
    line-height: 18px;
    color: #fff;
    border-radius: 50%;
    background-color: #5d94f3
}

.chat-hint-text {
    display: inline-block;
    vertical-align: middle;
}

/*输入框*/
.chat-input-text {
    overflow-y: auto;
    display: inline-block;
    padding: 5px 10px;
    width: 100%;
    height: 70px;
    vertical-align: middle;
    white-space: pre-wrap;
    word-wrap: break-word;
    resize: none;
    box-sizing: border-box;
}

.chat-input-tools {
	position:absolute;
    width: 100%;
    height:30px;
	margin:-25px 0 0 400px;
    vertical-align: middle;
}
button{
	width:62px;
	height:28px;
	border-radius:4px;
	background-color: #cc3333;
	margin:5px 0;
}
.chat-input-tools>button:hover{
	cursor:pointer;
}
.simulator-text{
	display: inline-block;
	width:200px;
	height:260px;
	overflow-y: auto;
    padding: 10px 10px;
    vertical-align: middle;
	color: #000;
    white-space: pre-wrap;
    word-wrap: break-word;
    resize: none;
    box-sizing: border-box;
	
}
.chat-simulator{
	display:none;
	position:absolute;
	left:-230px;
	top:200px;
	width:200px;
	height:300px;
	border:1px solid  #cc3333;
	border-radius:4px;
	background-color: #f9f9f9;
	box-shadow: 0 0 5px rgba(0, 0, 0, .4);
}
.simulator-btn{
	float:right;
	padding:0 10px;
}

 

  • 17
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一个简单的多人聊天对话框前端页面,使用Spring Boot + Thymeleaf + jQuery实现: ```html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>多人聊天对话框</title> <link rel="stylesheet" th:href="@{/static/css/chat.css}"> <script th:src="@{/static/js/jquery-3.4.1.min.js}"></script> <script th:src="@{/static/js/chat.js}"></script> </head> <body> <div class="chat-container"> <div class="chat-header"> <h2>多人聊天室</h2> </div> <div class="chat-body"> <div class="chat-messages"> <ul id="messages"></ul> </div> <div class="chat-input"> <form id="message-form"> <input type="text" id="message" placeholder="输入消息"> <button type="submit">发送</button> </form> </div> </div> </div> </body> </html> ``` 上面的代码中,我们使用了Thymeleaf模板引擎来渲染HTML页面,同时引入了jQuery库和chat.js文件。 接下来,我们需要编写chat.js文件来实现聊天功能。以下是一个简单的实现: ```javascript $(function() { var socket = new WebSocket('ws://' + window.location.host + '/chat'); var $messages = $('#messages'); var $messageForm = $('#message-form'); var $messageInput = $('#message'); socket.onmessage = function(event) { var message = JSON.parse(event.data); var $li = $('<li>').text(message.sender + ': ' + message.content); $messages.append($li); }; $messageForm.submit(function(event) { event.preventDefault(); var message = $messageInput.val(); if (message) { socket.send(message); $messageInput.val(''); } }); }); ``` 上面的代码中,我们使用WebSocket来实现实时通信,以便在多人聊天室中收发消息。在页面加载后,我们创建了一个WebSocket对象并连接到服务端,然后获取消息框、消息输入框、发送按钮等元素,并绑定发送消息的事件处理函数。 当有新的消息到来时,我们解析该消息数据并将其显示到页面上。当用户发送消息时,我们将该消息发送到服务端。 最后,我们需要编写后端代码来处理WebSocket连接和消息传递。下面是一个简单的实现: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(chatWebSocketHandler(), "/chat"); } @Bean public WebSocketHandler chatWebSocketHandler() { return new ChatWebSocketHandler(); } } @Component public class ChatWebSocketHandler extends TextWebSocketHandler { private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { for (WebSocketSession s : sessions) { if (s.isOpen() && !s.equals(session)) { s.sendMessage(message); } } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { sessions.remove(session); } } ``` 上面的代码中,我们首先创建了一个WebSocketConfig类,并使用@EnableWebSocket注解启用WebSocket支持。然后,我们在registerWebSocketHandlers方法中注册了一个ChatWebSocketHandler,并将其映射到/chat路径。 ChatWebSocketHandler类继承自TextWebSocketHandler,并实现了WebSocket连接建立、消息传递和连接关闭的处理方法。在连接建立时,我们将该连接添加到sessions列表中;在有消息到来时,我们将该消息广播给所有已连接的客户端;在连接关闭时,我们将该连接从sessions列表中移除。 至此,我们已经完成了一个简单的多人聊天对话框的前后端实现。你可以尝试运行该程序并在多个浏览器窗口中打开该页面来测试聊天功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值