uniapp聊天系统源码,

  uniapp聊天系统源码,

  这篇文章主要介绍了如何利用uniapp模仿微信,实现一个聊天界面。文中的示例代码讲解详细,对我们学习某视频剪辑软件有一定的帮助,感兴趣的可以了解一下

  

目录

   项目演示前言主界面聊天。某视频剪辑软件中引入的射流研究…文件聊天。某视频剪辑软件中引入的组件提交。某视频剪辑软件中引入的组件最后

  

项目演示

  

前言

  我是看B站的视频一个一个敲的,讲的还不错。可以去看看某视频剪辑软件节点。射流研究…即时通讯聊天室应用开发前端篇

  

主界面

  聊天。某视频剪辑软件

  模板

  !-聊天界面展示https://www.bilibili.com/video/BV1hT4y1P75N?p=22搭建一和2 -

  view class=content

  !-聊天内容-

  scroll-view class= chat scroll-y= true scroll-with-animation= true :scroll-into-view= scroll to view

  view class= chat-main :style= { padding bottom:inputh px }

   view class= chat-ls v-for=(item,index)in unshiftmsg :key= index :id= msg index

  查看聊天时间项目。创造时间!=“”{ {更改时间(项。创建时间)} }/查看

  view class= msg-m msg-left v-if= item。发送名称==朋友名称

  image class=user-img src=./././static/logo.png/image

  查看 message v-if=item . TextType==0

  !-文字-

  view class= msg-text { item。发送文本} }/查看

  /查看

  查看message v-if=item .text type==1 @ tap=预览img(item。发送文本)

  !-图像-

  image:src= item。发送文本 class= msg-img mode=宽度固定/图像

  /查看

  查看message v-if=item .text type==2 @ tap=播放语音(item。发送文本。声音)’

  !-音频-

  view class= msg-text voice :style= { width:item。发送文本。时间* 4 rpx }

  图像src=./././静态/图标/热线。png class= voice-img /image

  {{item.sendText.time}} "

  /查看

  /查看

  查看message v-if=item .text type==3 @ tap=打开位置(项目。发送文本)

  !-位置-

  view class=msg-map

  view class= map-name"{ item。发送文本。名称} }/查看

  view class= map-address { item。发送文本。地址} }/查看

  !-如果地图不起作用,就可以直接用一张图片去替代-

  map class= map :经度= item。发送文本。经度:纬度=项。发送文本。“纬度”

  :markers= covers(item。发送文本)/地图

  /查看

  /查看

  /查看

  view class= msg-m msg-right v-if= item。发送姓名!=朋友名

  image class=user-img src=./././static/logo.png/image

  查看 message v-if=item . TextType==0

  view class= msg-text { item。发送文本} }/查看

  /查看

  查看message v-if=item .text type==1 @ tap=预览img(item。发送文本)

  image:src= item。发送文本 class= msg-img mode=宽度固定/图像

  /查看

  查看message v-if=item .text type==2 @ tap=播放语音(item。发送文本。声音)’

  !-音频-

  view class= msg-text voice :style= { width:item。发送文本。时间* 4 rpx }

  {{item.sendText.time}} "

  图像src=./././静态/图标/热线。png class= voice-img /image

  /查看

  /查看

  查看message v-if=item .text type==3 @ tap=打开位置(项目。发送文本)

  !-位置-

  view class=msg-map

  view class= map-name"{ item。发送文本。名称} }/查看

  view class= map-address { item。发送文本。地址} }/查看

  map class= map :经度= item。发送文本。经度:纬度=项。发送文本。“纬度”

  :markers= covers(item。发送文本)/地图

  /查看

  /查看

  /查看

  /查看

  /查看

  /滚动视图

  提交@ inputs= inputs @ heights= heights /提交

  /查看

  /模板

  脚本

  导入日期时间自./././common/datetimejs’;

  导入提交自./././组件/提交/提交。vue ;

  //音频播放

  const innerAudioContext=uni。createinneraudiocontext();

  导出默认值{

  data() {

  返回{

  朋友名称: xpq ,

  消息:[{

  sendName: xpq ,

  收件人姓名:时光,

  发送文本:{

  地址: 湖南省岳阳市湘阴县新世纪大道,

  纬度:28.68925,

  经度:112.90917,

  姓名: 湘阴县政府(新世纪大道北),

  },

  创建时间: 2022-01-06 12:40:12 ,

   updateTime: null,

   chatmState: 1,

  【文本类型】:3

  }, {

  发送名:时光,

  接收名称: xpq ,

  发送文本:{

  声音: 时光匆匆流过,

  时间:2 //秒

  },

  创建时间: 2022-01-06 12:22:12 ,

   updateTime: null,

   chatmState: 1,

   TextType: 2

  }, {

  sendName: xpq ,

  收件人姓名:时光,

  发送文本:{

  声音: 谢谢你,

  时间:60 //秒

  },

  创建时间: 2022-01-06 12:00:12 ,

   updateTime: null,

   chatmState: 1,

   TextType: 2

  }, {

  发送名:时光,

  接收名称: xpq ,

  发送文本: 这是第九条未读消息,

  创建时间: 2022-01-03 12:22:12 ,

   updateTime: null,

   chatmState: 1,

  "文本类型":0

  },

  {

  发送名:时光,

  接收名称: xpq ,

  发送文本: 这是第八条未读消息,

  创建时间: 2022-01-02 12:22:07 ,

   updateTime: null,

   chatmState: 1,

  "文本类型":0

  },

  {

  sendName: xpq ,

  接收名称: xpq ,

  发送文本: 这是第七条未读消息,

  创建时间: 2021-12-19 12:22:03 ,

   updateTime: null,

   chatmState: 1,

  "文本类型":0

  },

  {

  发送名:时光,

  接收名称: xpq ,

  发送文本: 这是第六条未读消息,

  创建时间: 2021-12-19 12:21:58 ,

   updateTime: null,

   chatmState: 1,

  "文本类型":0

  },

  {

  发送名:时光,

  接收名称: xpq ,

  发送文本: http://演示。愤怒框架。com/attachment/images/2021/11/18/image _ 1637224530 _ diilzlmm。JPEG ,

  创建时间: 2021-12-19 12:21:54 ,

   updateTime: null,

   chatmState: 1,

  【文本类型】:1

  },

  {

  sendName: xpq ,

  收件人姓名:时光,

  发送文本: http://演示2。愤怒框架。com/attachment/images/2021/09/01/image _ 1630483477 _ n 03 w37zs。 jpg ,

  创建时间: 2021-12-19 12:21:48 ,

   updateTime: null,

   chatmState: 1,

  "文本类型":1

  },

  {

  发送名:时光,

  接收名称: xpq ,

  发送文本: 这是第三条未读消息,

  创建时间: 2021-12-19 12:21:42 ,

   updateTime: null,

   chatmState: 1,

  "文本类型":0

  },

  {

  发送名:时光,

  接收名称: xpq ,

  发送文本: 这是第二条未读消息,

  创建时间: 2021-12-19 12:21:33 ,

   updateTime: null,

   chatmState: 1,

  "文本类型":0

  },

  {

  发送名:时光,

  接收名称: xpq ,

  发送文本: http://演示2。愤怒框架。com/attachment/images/2021/09/01/image _ 1630483477 _ n 03 w37zs。 jpg ,

  创建时间: 2021-12-19 11:02:18 ,

   updateTime: null,

   chatmState: 1,

  【文本类型】:1

  },

  {

  发送名:时光,

  接收名称: xpq ,

  发送文本: 爱你啊,

  创建时间: 2021-12-18 20:37:03 ,

   updateTime: null,

  “chatmState”:0,

  "文本类型":0

  }

  ],

  //反转数据接收

  unshiftmsg: [],

  imgMsg: [],

  scrollToView:" ",

  oldTime: new Date(),

  输入:"60"

  }

  },

  昂秀(){

  //数组倒叙主要是应对后端传过来的数据

  for(var I=0;我这个。味精。长度;i ) {

  //时间间隔处理

  if (i this.msg.length - 1) { //这里表示头部时间还是显示一下

  设t=日期时间。时空(这个。旧时光,this.msg[i].创造时间);

  如果(t) {

  这个。旧时光=t;

  }

  this.msg[i].创建时间=t;

  }

  //获取图片,为下面的预览做准备

  if (this.msg[i].TextType==1) {

  这个。imgmsg。un shift(这个。味精[I]。发送文本)

  }

  这个。unshiftmsg。un shift(这个。msg[I]);

  }

  //跳转到最后一条数据与前面的:id进行对照

  这个. nextTick(function() {

  这个。scrolltoview= msg (这个。unshiftmsg。长度-1)

  })

  },

  组件:{

  提交,

  },

  方法:{

  更改时间(日期){

  返回日期时间.日期时间1(日期);

  },

  //进行图片的预览

  预览(e) {

  设索引=0;

  对于(设I=0;我这个。img消息。长度;i ) {

  if (this.imgMsg[i]==e) {

  index=I;

  }

  }

  console.log(index ,index)

  //预览图片

  uni.previewImage({

  当前:索引,

  网址:这个。img消息,

  longPressActions: {

  项目列表:[发送给朋友, 保存图片, 收藏],

  成功:函数(数据){

  console.log(选中了第data.tapIndex 1 个按钮,第数据索引1 张图片);

  },

  失败:函数(错误){

  控制台。日志(错误。errmsg);

  }

  }

  });

  },

  //音频播放

  playVoice(e) {

  inneraudiocontext。src=e;

  innerAudioContext.onPlay(()={

  console.log(开始播放);

  });

  },

  //地图定位

  封面(e) {

  让map=[{

  纬度:东经,

  经度:东经,

  图标路径: ./././static/logo.png

  }]

  返回(地图);

  },

  //跳转地图信息

  openLocation(e) {

  uni.openLocation({

  纬度:东经,

  经度:东经,

  名称:艺名,

  地址:电子邮件地址

  成功:函数(){

  console.log("成功");

  }

  });

  },

  //接受输入内容

  输入(e) {

  //时间间隔处理

  let data={

  发送名:时光,

  接收名称: xpq ,

  “发送文本”:电子邮件,

  “创建时间”:新日期(),

  “更新时间”:新日期(),

   chatmState: 1,

  文本类型:电子类型

  };

  //发送给服务器消息

  //onSendWS(JSON。string ify(数据));

  this.unshiftmsg.push(数据);

  //跳转到最后一条数据与前面的:id进行对照

  这个. nextTick(function() {

  这个。scrolltoview= msg (这个。unshiftmsg。长度-1)

  })

  if (e.type==1) {

  这个。imgmsg。推送(e . message);

  }

  console.log(e)

  },

  //输入框高度

  高度(e) {

  console.log(高度:,e)

  这个。inputh=e;

  这个。gobottom();

  },

  //滚动到底部

  goBottom() {

  这个。scrolltoview=

  这个. nextTick(function() {

  这个。scrolltoview= msg (这个。unshiftmsg。长度-1)

  })

  }

  }

  }

  /脚本

  样式lang=scss

  页面{

  身高:100%;

  }。内容{

  身高:100%;

  背景色:rgba(244,244,244,1);

  }。聊天{

  身高:100%;聊天主页{

  左填充:32rpx

  填充-右:32rpx

  垫顶:20rpx

  //padding-bottom:120 rpx;//获取动态高度

  显示器:flex

  伸缩方向:列;

  }。聊天-ls {。聊天时间{

  字体大小:24r像素;

  颜色:rgba(39,40,50,0.3);

  行高:34像素

  填充:10rpx 0rpx

  文本对齐:居中;

  }。消息-m {

  显示器:flex

  填充:20 rpx 0;用户-img {

  弹性:无;

  宽度:80rpx

  身高:80rpx

  边框半径:20rpx

  }。消息{

  弹性:无;

  最大宽度:480rpx

  }。消息-文本{

  字体大小:32 rpx

  颜色:rgba(39,40,50,1);

  行高:44像素

  填充:18rpx 24rpx

  }。msg-img {

  最大宽度:400rpx

  边框半径:20rpx

  }。消息-地图{

  背景:# fff

  宽度:464像素

  身高:284像素

  溢出:隐藏;地图名称{

  字体大小:32 rpx

  颜色:rgba(39,40,50,1);

  行高:44像素

  填充:18rpx 24rpx 0 24rpx

  //下面四行是单行文字的样式

  显示:-WebKit-box;

  -webkit-box-orient:垂直;

  -WebKit-line-clamp:1;

  溢出:隐藏;

  }。地图地址{

  字体大小:24r像素;

  颜色:rgba(39,40,50,0.4);

  填充:0 24像素

  //下面四行是单行文字的样式

  显示:-WebKit-box;

  -webkit-box-orient:垂直;

  -WebKit-line-clamp:1;

  溢出:隐藏;

  }。地图{

  衬垫-顶部:8 rpx

  宽度:464像素

  身高:190rpx

  }

  }。声音{

  //宽度:200rpx

  最小宽度:100rpx

  最大宽度:400rpx

  }。语音-图像{

  宽度:28rpx

  高度:36rpx

  }

  }。消息-左侧{

  弯曲方向:行;消息-文本{

  左边距:16rpx

  背景色:# fff

  边框-半径:0 rpx 20 rpx 20 rpx 20 rpx 20 rpx;

  }。ms-img {

  左边距:16rpx

  }。msh-map {

  左边距:16rpx

  边框-半径:0 rpx 20 rpx 20 rpx 20 rpx 20 rpx;

  }。声音{

  文本对齐:右对齐;

  }。语音-图像{

  浮动:左;

  变换:旋转(180度);

  宽度:28rpx

  高度:36rpx

  垫底:4r px

  }

  }。消息-右侧{

  弹性-方向:行-反向;消息-文本{

  右边距:16rpx

  背景色:rgba(255,228,49,0.8);

  边框-半径:20 rpx 0 rpx 20 rpx 20 rpx

  }。ms-img {

  右边距:16rpx

  }。msh-map {

  左边距:16rpx

  边框-半径:20 rpx 0 rpx 20 rpx 20 rpx

  }。声音{

  文本对齐:左对齐;

  }。语音-图像{

  浮动:对;

  填充:4rpx

  宽度:28rpx

  高度:36rpx

  }

  }

  }

  }

  /风格

  

chat.vue中引入的js文件

  dateTime.js

  导出默认值{

  //首页时间转化

  日期时间(秒){

  让旧的=新的日期(e)和:

  let now=new Date();

  //获取老的具体时间

  设d=旧。gettime();

  设h=旧。get hours();

  设m=老。get minutes();

  设Y=老。获取整年();

  设M=老。getmonth()1;

  设D=旧。getdate();

  //获取现在具体时间

  设nd=现在。gettime();

  让NH=现在。get hours();

  让n=现在。get minutes();

  让nY=现在。获取整年();

  设nM=现在。getmonth()1;

  设nD=现在。getdate();

  //当天的时间

  if(D===nD M===nM Y===nY){

  如果(h10){

  h= 0 h

  }

  if(m10){

  m= 0 m

  }

  返回h : m;

  }

  //昨天时间

  if(D 1===nD M===nM Y===nY){

  如果(h10){

  h= 0 h

  }

  if(m10){

  m= 0 m

  }

  返回昨天h : m;

  }否则{

  //大于两天

  返回y / M / D;

  }

  },

  //聊天时,发送时间处理

  日期时间1(e){

  让旧的=新的日期(e)和:

  let now=new Date();

  //获取老的具体时间

  设d=旧。gettime();

  设h=旧。get hours();

  设m=老。get minutes();

  设Y=老。获取整年();

  设M=老。getmonth()1;

  设D=旧。getdate();

  //获取现在具体时间

  设nd=现在。gettime();

  让NH=现在。get hours();

  让n=现在。get minutes();

  让nY=现在。获取整年();

  设nM=现在。getmonth()1;

  设nD=现在。getdate();

  //当天的时间

  if(D===nD M===nM Y===nY){

  如果(h10){

  h= 0 h

  }

  if(m10){

  m= 0 m

  }

  返回h : m;

  }

  //昨天时间

  if(D 1===nD M===nM Y===nY){

  如果(h10){

  h= 0 h

  }

  if(m10){

  m= 0 m

  }

  返回昨天h : m;

  }else if( Y==nY){

  //今年

  如果(h10){

  h= 0 h

  }

  if(m10){

  m= 0 m

  }

  返回 m 月迪日h : m

  }否则{

  //大于今年

  如果(h10){

  h= 0 h

  }

  if(m10){

  m= 0 m

  }

  返回你好年 m 月迪日h : m

  }

  },

  //间隔时间差

  时空(旧的,现在的){

  旧=新日期(旧);

  现在=新日期(现在);

  var tell=old。gettime();

  var tnow=现在。gettime();

  如果(告知(tnow 1000*60*5)){

  现在返回;

  }否则{

  返回"";

  }

  }

  }

  

chat.vue中引入的组件

  提交。某视频剪辑软件

  模板

  视角

  视图 class=提交

  查看 class=提交-聊天

  查看class=bt-img @tap=记录

  image :src=toc/image

  /查看

  !-文本框-

  textarea auto-height= true class= chat-send BTN :class= { display none:is record } @ input= inputs

  @ focus= focus v-model= msg /textarea

  view class= record BTN :class= display none:是记录} @ touch start= touch start @ touch end= touch end

  @touchmove=touchmove

  按住说话

  /查看

  view class=bt-img @tap=emoji

  图像src=././静态/图标/常见问题。png /图像

  /查看

  view class=bt-img @tap=more

  图像src=././static/icon/news.png/image

  /查看

  /查看

  !-表情-

  查看莫吉:class= { display none:isemoji}

  view class=emoji-send

  view class= e莫吉-发送-检测 @ tap= emojiBack

  图像src=././static/icon/左括号。png /图像

  /查看

  “查看莫吉-发送-Bt”@ tap=e莫吉发送”发送/查看

  /查看

  表情符号@ emotion= emotion :height= 260 /表情符号

  /查看

  !-更多-

  view class= more :class= { display none:ismore}

  view class= more-list @ tap= sendImg( album )

  图像src=././static/icon/无接收。png /图像

  view class=more-list-title 图片/查看

  /查看

   view class= more-list @ tap= sendImg( camera )

  图像src=././static/icon/无接收。png /图像

  view class=more-list-title 拍照/查看

  /查看

  view class= more-list @ tap= choose location

  图像src=././static/icon/无接收。png /图像

  view class=more-list-title 定位/查看

  /查看

  view class=more-list

  图像src=././static/icon/无接收。png /图像

  view class=more-list-title 视频/查看

  /查看

  view class=more-list

  图像src=././static/icon/无接收。png /图像

  view class=more-list-title 文件/查看

  /查看

  /查看

  /查看

  view class= voice-BG :class= { display none:voicebg}

  view class=voice-bg-len

  view class= voice-BG-time :style= { width:vlength/0.6 % }

  {{vlength}} "

  /查看

  view class=voice-del 上滑取消录音/查看

  /查看

  /查看

  /查看

  /模板

  脚本

  //引入组件

  从导入表情符号./emoji/emoji.vue

  //录音

  常量记录器管理器=uni。get recorder manager();

  导出默认值{

  data() {

  返回{

  isrecord: false,

  isemoji:假,

  更多信息:假的,

  语音bg:假的,

  佩吉:0,

  消息: ,

  //直接引用地址可能出不来,需要用需要

  目录:要求(././static/icon/allorder.png ),

  计时器: ,//计时器

  vlength: 0

  };

  },

  组件:{

  表情符号,

  },

  方法:{

  //获取高度方法

  getElementHeight() {

  const query=uni。createselectquery().在(这);

  query.select(.提交)。boundingClientRect(data={

  这个$emit(heights ,数据。身高);

  }).exec();

  },

  //切换音频

  记录(){

  //切换的时候关闭其他界面

  this.ismore=false

  this.isemoji=false

  //切换高度

  setTimeout(()={

  这个。getelementheight();

  }, 10)

  如果(this.isrecord) {

  this.isrecord=false

  this.toc=require(././static/icon/allorder。png’);

  }否则{

  this.isrecord=true

  this.toc=require(././静态/图标/我们聊天。png’);

  }

  },

  //表情

  表情符号(){

  this.isemoji=!这个。伊势莫吉;

  //切换的时候关闭其功能

  this.ismore=false

  this.isrecord=false

  this.toc=require(././static/icon/allorder。png’);

  //切换高度

  setTimeout(()={

  这个。getelementheight();

  }, 10)

  },

  //接收表情

  情感(e) {

  console.log(e),

  this .味精=this .味精

  },

  //文字发送

  输入(e) {

  var chatm=e . detail。价值;

  var pos=chatm。的索引( \ n );

  //检索字符串没有数据,返回-1

  //if (pos!=-1聊天长度1) {

  //这个. emit(inputs ,this。味精);

  //setTimeout(()={

  //这个。msg=

  //}, 0)

  //}

  如果(pos!=-1聊天长度1) {

  //0为表情和文字

  this.send(this.msg,0)

  }

  },

  //输入框聚焦

  焦点(){

  //关闭其他项

  这个。伊势莫吉=假;

  this.ismore=false

  setTimeout(()={

  this.getElementHeight()

  }, 10)

  },

  //表情内发送

  表情发送(){

  //if (this.msg.length 0) {

  //这个. emit(inputs ,this。味精);

  //setTimeout(()={

   // this.msg = ;

   // }, 0)

   // }

   if (this.msg.length > 0) {

   //0为表情和文字

   this.send(this.msg, 0)

   }

   },

   // 表格退格

   emojiBack() {

   if (this.msg.length > 0) {

   this.msg = this.msg.substring(0, this.msg.length - 1);

   }

   },

   //更多功能

   more() {

   this.ismore = !this.ismore;

   //切换的时候关闭其他界面

   this.isemoji = false

   this.isrecord = false;

   this.toc = require("../../static/icon/allorder.png");

   setTimeout(() => {

   this.getElementHeight();

   }, 10)

   },

   //图片发送

   sendImg(e) {

   let count = 9;

   if (e == album) {

   count = 9;

   } else {

   count = 1;

   }

   uni.chooseImage({

   count: count, //默认9

   sizeType: [original, compressed], //可以指定是原图还是压缩图,默认二者都有

   sourceType: [e], //从相册选择

   // success: function (res) { //用function的方式会找不到send方法

   success: (res) => {

   console.log(JSON.stringify(res.tempFilePaths));

   const filePaths = res.tempFilePaths;

   for (let i = 0; i < filePaths.length; i++) {

   this.send(filePaths[i], 1)

   }

   }

   });

   },

   //音频处理

   //开始录音

   touchstart(e) {

   console.log("开始录音")

   console.log("点击产生数据", e)

   this.pageY = e.changedTouches[0].pageY;

   this.voicebg = true;

   let i = 1;

   this.timer = setInterval(() => {

   this.vlength = i;

   i++;

   console.log("计时器开始工作,第几秒", i)

   //结束计时

   if (i > 60) {

   clearInterval(this.timer);

   this.touchend();

   }

   }, 1000)

   recorderManager.start();

   },

   //删除录音

   touchmove(e) {

   // console.log("滑动到的y轴高度:",e.changedTouches[0].pageY);

   if (this.pageY - e.changedTouches[0].pageY > 100) {

   // 关闭录音界面

   this.voicebg = false;

   }

   },

   // 结束录音

   touchend() {

   console.log("结束录音")

   clearInterval(this.timer);

   recorderManager.stop();

   // recorderManager.onStop(function(res) {

   recorderManager.onStop((res) => {

   let data = {

   voice: res.tempFilePath,

   time: this.vlength

   }

   if (this.voicebg) {

   this.send(data, 2);

   }

   // //时长归位

   this.vlength = 0;

   this.voicebg = false;

   console.log(recorder stop + JSON.stringify(res));

   // self.voicePath = res.tempFilePath;

   });

   },

   //获取位置

   choseLocation() {

   uni.chooseLocation({

   // success: function(res) {

   success: res => {

   let data = {

   name: res.name,

   address: res.address,

   latitude: res.latitude,

   longitude: res.longitude

   }

   this.send(data, 3);

   // console.log(位置名称: + res.name);

   // console.log(详细地址: + res.address);

   // console.log(纬度: + res.latitude);

   // console.log(经度: + res.longitude);

   }

   });

   },

   //发送

   send(msg, type) {

   let date = {

   message: msg,

   type: type

   }

   this.$emit(inputs, date);

   setTimeout(() => {

   this.msg = ;

   }, 0)

   }

   }

   };

  </script>

  <style lang="scss" scoped>

   .submit {

   background: rgba(244, 244, 244, 0.96);

   border-top: 1px solid rgba(39, 40, 50, 0.1);

   width: 100%;

   position: fixed;

   bottom: 0;

   z-index: 100;

   // padding-bottom: var(--status-bar-height);

   padding-bottom: env(safe-area-inset-bottom);

   }

   .displaynone {

   display: none;

   }

   .submit-chat {

   width: 100%;

   display: flex;

   align-items: flex-end;

   box-sizing: border-box;

   padding: 14rpx 14rpx;

   image {

   width: 56rpx;

   height: 56rpx;

   margin: 0 10rpx;

   flex: auto;

   }

   .btn {

   flex: auto;

   background-color: #fff;

   border-radius: 10rpx;

   padding: 20rpx;

   max-height: 160rpx;

   margin: 0 10rpx;

   }

   .chat-send {

   line-height: 44rpx;

   }

   .record {

   line-height: 44rpx;

   text-align: center;

   font-size: 20rpx;

   color: rgba(39, 40, 50, 0.6);

   }

   }

   .emoji {

   width: 100%;

   height: 460rpx;

   background: rgba(236, 237, 238, 1);

   box-shadow: 0px 11rpx 0px 0px rgba(0, 0, 0, 0.1);

   .emoji-send {

   width: 280rpx;

   height: 104rpx;

   padding-top: 24rpx;

   background-color: rgba(236, 237, 238, 0.8);

   position: fixed;

   // bottom: 0;

   bottom: env(safe-area-inset-bottom);

   right: 0;

   display: flex;

   .emoji-send-bt {

   flex: 1;

   margin: 0 32rpx 0 20rpx;

   height: 80rpx;

   background: rgba(255, 228, 49, 1);

   font-size: 32rpx;

   text-align: center;

   line-height: 80rpx;

   border-radius: 12rpx;

   }

   .emoji-send-det {

   flex: 1;

   margin-left: 24rpx;

   height: 80rpx;

   background: #fff;

   font-size: 32rpx;

   text-align: center;

   line-height: 80rpx;

   border-radius: 12rpx;

   image {

   width: 42rpx;

   height: 32rpx;

   }

   }

   }

   }

   .more {

   width: 100%;

   height: 436rpx;

   background: rgba(236, 237, 238, 1);

   box-shadow: 0px 11rpx 0px 0px rgba(0, 0, 0, 0.1);

   bottom: env(safe-area-inset-bottom);

   padding: 8rpx 20rpx;

   box-sizing: border-box;

   .more-list {

   width: 25%;

   text-align: center;

   float: left;

   padding-top: 32rpx;

   image {

   width: 72rpx;

   height: 72rpx;

   padding: 24rpx;

   background: rgba(255, 255, 255, 1);

   border-radius: 24rpx;

   }

   .more-list-title {

   font-size: 24rpx;

   color: rgba(39, 40, 50, 0.5);

   line-height: 34rpx;

   }

   }

   }

   .voice-bg {

   height: 100%;

   width: 100%;

   background-color: rgba(0, 0, 0, 0.3);

   position: fixed;

   top: 0;

   bottom: 0;

   z-index: 1001;

   .voice-bg-len {

   height: 84rpx;

   width: 600rpx;

   position: absolute;

   left: 0;

   right: 0;

   top: 0;

   bottom: 0;

   margin: auto;

   background-color: rgba(255, 255, 255, 0.2);

   border-radius: 42rpx;

   text-align: center;

   }

   .voice-bg-time {

   display: inline-block;

   min-width: 120rpx;

   line-height: 84rpx;

   background-color: rgba(255, 228, 49, 1);

   border-radius: 42rpx;

   }

   .voice-del {

   position: absolute;

   bottom: -480rpx;

   width: 100%;

   text-align: center;

   color: #fff;

   font-size: 28rpx;

   }

   }

  </style>

  

submit.vue中引入的组件

  emoji.vue

  <template>

   <view class="emoji" :style="{height:height+px}">

   <view class="emoji-line" v-for="(line,i) in emoji" :key="i">

   <view class="emoji-line-item" v-for="(item,index) in line" :key="index" @tap="clickEmoji(item)">{{item}}

   </view>

   </view>

   </view>

  </template>

  <script>

   export default {

   props:{

   height:{

   type:Number,

   default:260

   }

   },

   name: "emoji",

   data() {

   return {

   emoji: [

   [

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: