参考微信来写一个IM页面
因为项目需要IM客服功能,所以模仿微信的界面,绘制了一个IM页面,项目是基于ts+react。
页面如图:
下面是对接完成功能后的截图:
我自己感觉还可以,所以想分享出来,当然功能上需要自己去写,这里只是一个纯静态页,功能部分因为和项目业务耦合很紧密,所以不公开。
后面我会用这个页面写一个包含收发消息和群聊的小项目发布出来。
代码
index.tsx
import { Button, Input } from 'antd';
import React from 'react';
import styles from './im.css';
import IconFont from '@/components/IconFont';
const IM: React.FC = () => {
return (
<div className={styles.container}>
<div className={styles.chat_container}>
<div className={styles.room_list}>
<div className={styles.room_list_title}>
<Input.Search placeholder="搜索" />
</div>
<div className={styles.room}>
<img src="https://t14.baidu.com/it/u=3843289189,1985343162&fm=82&w=255&h=255&img.JPEG" />
<div className={styles.room_info}>
<div className={styles.room_info_name}>用户1</div>
<div className={styles.room_info_last_msg}>最后一条消息</div>
</div>
</div>
<div className={styles.room}>
<img src="https://t14.baidu.com/it/u=3843289189,1985343162&fm=82&w=255&h=255&img.JPEG" />
<div className={styles.room_info}>
<div className={styles.room_info_name}>用户2</div>
<div className={styles.room_info_last_msg}>最后一条消息</div>
</div>
</div>
<div className={styles.room}>
<img src="https://t14.baidu.com/it/u=3843289189,1985343162&fm=82&w=255&h=255&img.JPEG" />
<div className={styles.room_info}>
<div className={styles.room_info_name}>用户3</div>
<div className={styles.room_info_last_msg}>最后一条消息</div>
</div>
</div>
</div>
<div className={styles.chat_content_container}>
<div className={styles.chat_content_title}>用户1</div>
<div className={styles.chat_content}>
<div className={styles.bubble_left}>
<img src="https://t14.baidu.com/it/u=3843289189,1985343162&fm=82&w=255&h=255&img.JPEG" />
<div className={styles.bubble_content}>
<div className={styles.bubble_text}>你好</div>
</div>
</div>
<div className={styles.bubble_right}>
<img src="https://t14.baidu.com/it/u=3843289189,1985343162&fm=82&w=255&h=255&img.JPEG" />
<div className={styles.bubble_content}>
<div className={styles.bubble_text}>请问有什么能够帮到您?</div>
</div>
</div>
<div className={styles.bubble_left}>
<img src="https://t14.baidu.com/it/u=3843289189,1985343162&fm=82&w=255&h=255&img.JPEG" />
<div className={styles.bubble_content}>
<div className={styles.bubble_text}>来一则新闻</div>
</div>
</div>
<div className={styles.bubble_right}>
<img src="https://t14.baidu.com/it/u=3843289189,1985343162&fm=82&w=255&h=255&img.JPEG" />
<div className={styles.bubble_content}>
<div className={styles.bubble_text}>
近日,有消息称,湖人队在赢得总冠军后,将向每位球员发放一笔奖金,金额高达23.1万美元。这笔奖金的发放引起了球迷们的热议,有人认为这是对球员们辛苦付出的回报,也有人认为这笔奖金的金额并不足以满足球员们的期望。
湖人队在本赛季中赢得了总冠军,这是球队历史上第17次夺得总冠军,也是詹姆斯职业生涯中第四次获得总冠军。在这次夺冠之后,湖人队向每位参与比赛的球员发放了一笔奖金。据报道,这笔奖金的金额为23.1万美元,每位球员都会收到这笔钱。
</div>
</div>
</div>
</div>
<div className={styles.chat_input}>
<input></input>
<Button shape={"circle"} icon={<IconFont type={"icon-send"}/>} />
</div>
</div>
</div>
</div>
);
};
export default IM;
im.css
.container {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
box-sizing: border-box;
}
.chat_container {
display: flex;
background-color: #ffffff;
width: 80%;
max-height: 600px;
border-radius: 10px;
box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.2);
}
.room_list {
width: 280px;
height: 600px;
display: flex;
flex-direction: column;
border-top-left-radius: 10px;
border-bottom-left-radius: 10px;
border-right: 1px solid #f1f1f1;
}
.room_list_title {
width: 100%;
height: 50px;
display: flex;
justify-content: center;
align-items: center;
border-top-left-radius: 10px;
padding: 0 10px;
background-color: #f1f1f1;
}
.room {
width: 100%;
height: 60px;
display: flex;
justify-content: start;
align-items: center;
padding: 0 10px;
}
.room img {
width: 40px;
height: 40px;
border-radius: 4px;
background-color: #c5c5c5;
margin-right: 10px;
}
.room .room_info_name {
margin-bottom: 4px;
}
.room .room_info_last_msg {
color: #b6b5b5;
font-size: 12px;
}
.room:hover {
background-color: rgba(224, 224, 224, 0.4);
cursor: pointer;
}
.chat_content_container {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
}
.chat_content_title {
width: 100%;
height: 50px;
display: flex;
justify-content: center;
align-items: center;
font-size: 18px;
background-color: #f1f1f1;
border-top-right-radius: 10px;
}
.chat_content {
flex: 1;
width: 100%;
max-height: 100%;
padding: 0 20px;
overflow-y: scroll;
}
.chat_content .bubble_left {
display: flex;
justify-content: flex-start;
align-items: start;
margin: 10px 0;
}
.chat_content .bubble_right {
display: flex;
justify-content: flex-start;
flex-direction: row-reverse;
align-items: start;
margin: 10px 0;
}
.chat_content .bubble_left .bubble_content {
background-color: #f1f1f1;
padding: 10px 20px;
border-radius: 10px;
}
.chat_content .bubble_right .bubble_content {
background-color: #86ed56;
padding: 10px 20px;
border-radius: 10px;
}
.bubble_content {
display: flex;
flex-wrap: wrap;
max-width: 35%;
}
.chat_content img {
width: 40px;
height: 40px;
border-radius: 4px;
background-color: #c5c5c5;
margin: 0 10px;
}
.chat_input {
width: 100%;
height: 60px;
display: flex;
justify-content: start;
align-items: center;
background-color: white;
padding: 0 40px;
border-bottom-right-radius: 10px;
border-top: 1px solid #ebebeb;
}
.chat_input input {
height: 40px;
border-radius: 10px;
border: 1px solid #f4f4f4;
padding: 0 10px;
background-color: #f4f4f4;
margin-right: 20px;
flex: 1;
}
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-track {
background: white;
}
::-webkit-scrollbar-thumb {
background: #f1f1f1;
}
::-webkit-scrollbar-thumb:hover {
background: #dddddd;
}