1453 lines
36 KiB
Vue
1453 lines
36 KiB
Vue
![]() |
<template>
|
|||
|
<view>
|
|||
|
<!-- 底部输入栏 -->
|
|||
|
<view class="input-box" :style="{bottom: keyboardHeight+'px'}" :class="popupLayerClass" @touchmove.stop.prevent="discard">
|
|||
|
<view class="send-box">
|
|||
|
<!-- <view>
|
|||
|
<u-icon name="outline-voice-cricle" custom-prefix="iconfont" color="#333" :size="60" @tap="switchVoice" />
|
|||
|
</view> -->
|
|||
|
<view class="textbox">
|
|||
|
<view class="text-mode">
|
|||
|
<view class="box">
|
|||
|
<textarea style="font-size: 12px;" placeholder="输入聊天内容" :adjust-position="false" :show-confirm-bar="false" auto-height="true" v-model="textMsg" @focus="textareaFocus"/>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="icon" v-if="hideEmoji">
|
|||
|
<u-icon name="vuesax-outline-happyemoji" custom-prefix="iconfont" color="#333" :size="60" @tap="chooseEmoji" />
|
|||
|
</view>
|
|||
|
<view class="icon" v-else>
|
|||
|
<u-icon name="outline-keyboard" custom-prefix="iconfont" color="#333" :size="60" @tap="chooseEmoji" />
|
|||
|
</view>
|
|||
|
<view class="icon" :class="textMsg?'hidden':''">
|
|||
|
<u-icon name="vuesax-outline-add-circle" custom-prefix="iconfont" color="#333" :size="60" @tap="showMore" />
|
|||
|
</view>
|
|||
|
<view class="send" :class="!textMsg?'hidden':''" @tap="sendText">
|
|||
|
<view class="btn">{{btnText}}</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="send-tool">
|
|||
|
<view @tap="switchVoice">
|
|||
|
<u-icon name="outline-microphone" custom-prefix="iconfont" color="#333" :size="60"/>
|
|||
|
</view>
|
|||
|
<view v-if="user.hasQrcode" @tap="getWeixin">
|
|||
|
<u-icon name="weixin" custom-prefix="iconfont" color="#19be6b" :size="60" />
|
|||
|
</view>
|
|||
|
<view @tap="openGift">
|
|||
|
<u-icon color="#f880ab" name="presentfill" :size="64" custom-prefix="iconfont"></u-icon>
|
|||
|
</view>
|
|||
|
<view @tap="chooseImage">
|
|||
|
<u-icon name="outline-image" custom-prefix="iconfont" color="#333" :size="60" />
|
|||
|
</view>
|
|||
|
<view @tap="camera">
|
|||
|
<u-icon name="outline-camera" custom-prefix="iconfont" color="#333" :size="60" />
|
|||
|
</view>
|
|||
|
<!-- <u-icon name="outline-map" custom-prefix="iconfont" color="#333" :size="60" />
|
|||
|
<view @tap="openGift">
|
|||
|
<u-icon name="outline-gift" custom-prefix="iconfont" color="#333" :size="60"/>
|
|||
|
</view> -->
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<!-- 抽屉栏 -->
|
|||
|
<view class="popup-layer" :class="popupLayerClass" @touchmove.stop.prevent="discard">
|
|||
|
<view class="emoji-view" :class="{hidden:hideEmoji}">
|
|||
|
<!-- 表情 -->
|
|||
|
<scroll-view scroll-y="true">
|
|||
|
<view v-if="emojiScene == 'emoji'">
|
|||
|
<view class="emoji-swiper" v-if="timeEmojiList.length > 0">
|
|||
|
<view class="title">最近使用</view>
|
|||
|
<view class="emoji-list">
|
|||
|
<view class="emoji_tools1" v-for="(em,pid) in timeEmojiList" :key="pid" @tap="addEmoji(em, emojiScene)">
|
|||
|
<text>{{em}}</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="title">全部表情</view>
|
|||
|
<view class="emoji-list">
|
|||
|
<view class="emoji_tools1" v-for="(em,pid) in emojiList" :key="pid" @tap="addEmoji(em, emojiScene)">
|
|||
|
<text>{{em}}</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="del-btn" @tap="delBtn">
|
|||
|
<u-icon name="backspace" color="#333" :size="40"/>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="emoji-swiper" v-else>
|
|||
|
<view class="emoji-list">
|
|||
|
<view class="emoji_tools1" v-for="(em,pid) in emojiList" :key="pid" @tap="addEmoji(em, emojiScene)">
|
|||
|
<text>{{em}}</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="del-btn" @tap="delBtn">
|
|||
|
<u-icon name="backspace" color="#333" :size="40"/>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view v-if="emojiScene == 'like'">
|
|||
|
<view class="emoji-swiper">
|
|||
|
<view class="title">添加的单个表情</view>
|
|||
|
<view class="emoji-list">
|
|||
|
<view class="emoji_image">
|
|||
|
<view class="emoji-add">
|
|||
|
<u-icon name="plus" color="#333" :size="60"/>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view class="emoji_image" v-for="(emoji,pid) in shopEmojiList" :key="pid" @tap="addEmoji(emoji, emojiScene)">
|
|||
|
<image class="image" :src="emoji.src"></image>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
<view v-if="emojiScene == 'shop'">
|
|||
|
<view class="emoji-swiper">
|
|||
|
<view class="title">一只小老虎</view>
|
|||
|
<view class="emoji-list">
|
|||
|
<view class="emoji_image" v-for="(emoji,pid) in shopEmojiList" :key="pid" @tap="addEmoji(emoji, emojiScene)">
|
|||
|
<image class="image" :src="emoji.src"></image>
|
|||
|
<text>{{emoji.name}}</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</scroll-view>
|
|||
|
|
|||
|
<!--选择表情类型栏-->
|
|||
|
<scroll-view class="emoji-tools-scroll-view" scroll-x>
|
|||
|
<view class="emoji-tool-box">
|
|||
|
<view class="emoji-tools-item" :class="tindex == pid ? 'select' : ''" :data-i="pid" v-for="(tool,pid) in emojiTools" :key="pid" @tap="changeTool(pid)">
|
|||
|
<u-icon v-if="tool.type == 'icon'" :name="tool.icon" custom-prefix="iconfont" :size="45"/>
|
|||
|
<image class="img" mode="aspectFill" v-if="tool.type == 'image'" :src="tool.icon"/>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</scroll-view>
|
|||
|
</view>
|
|||
|
|
|||
|
<!-- 更多功能 相册-拍照-红包 -->
|
|||
|
|
|||
|
<swiper class="tool-swiper" :class="{hidden:hideMore}" indicator-dots="true" duration="150">
|
|||
|
<swiper-item class="tool-swiper-box">
|
|||
|
<view class="tool-btn" v-if="user.hasQrcode" @tap="getWeixin">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="weixin" custom-prefix="iconfont" color="#19be6b" :size="55" />
|
|||
|
</view>
|
|||
|
<view class="btn-text">交换名片</view>
|
|||
|
</view>
|
|||
|
<view class="tool-btn" @tap="openGift">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon color="#f880ab" name="presentfill" :size="55" custom-prefix="iconfont"></u-icon>
|
|||
|
</view>
|
|||
|
<view class="btn-text">赠送礼物</view>
|
|||
|
</view>
|
|||
|
<view class="tool-btn" @tap="chooseImage">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="photo-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">发送照片</view>
|
|||
|
</view>
|
|||
|
<!--
|
|||
|
<view class="tool-btn">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="creative-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">添加回复</view>
|
|||
|
</view>
|
|||
|
<view class="tool-btn">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="time-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">聊天记录</view>
|
|||
|
</view>
|
|||
|
<view class="tool-btn">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="image-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">发送照片</view>
|
|||
|
</view>
|
|||
|
<view class="tool-btn">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="service-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">快捷回复</view>
|
|||
|
</view>
|
|||
|
<view class="tool-btn">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="creative-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">添加回复</view>
|
|||
|
</view>
|
|||
|
<view class="tool-btn">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="time-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">聊天记录</view>
|
|||
|
</view> -->
|
|||
|
</swiper-item>
|
|||
|
<!-- <swiper-item class="tool-swiper-box">
|
|||
|
<view class="tool-btn">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="location-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">发送位置</view>
|
|||
|
</view>
|
|||
|
<view class="tool-btn">
|
|||
|
<view class="btn-card">
|
|||
|
<u-icon name="warning-fill" color="#333" :size="55"/>
|
|||
|
</view>
|
|||
|
<view class="btn-text">举报拉黑</view>
|
|||
|
</view>
|
|||
|
</swiper-item> -->
|
|||
|
</swiper>
|
|||
|
|
|||
|
|
|||
|
<!-- 录音功能 -->
|
|||
|
|
|||
|
<view class="voice-center" :class="{hidden:isVoice}">
|
|||
|
<all-speech ref="speech" @okClick="voiceOk"></all-speech>
|
|||
|
</view>
|
|||
|
|
|||
|
</view>
|
|||
|
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import emoji from '@/pages/im/util/emoji';
|
|||
|
//聊天栏 回复栏
|
|||
|
export default {
|
|||
|
components: {
|
|||
|
|
|||
|
},
|
|||
|
props: {
|
|||
|
//禁用聊天栏
|
|||
|
isLocked: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
//是否显示遮罩
|
|||
|
mask: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
//true表示遮罩透明
|
|||
|
maskOpacity: {
|
|||
|
type: Boolean,
|
|||
|
default: true
|
|||
|
},
|
|||
|
keyboardHeight: {
|
|||
|
type: Number,
|
|||
|
default: -1
|
|||
|
},
|
|||
|
btnText: {
|
|||
|
type: String,
|
|||
|
default: '发送'
|
|||
|
},
|
|||
|
color: {
|
|||
|
type: String,
|
|||
|
default: '#5677fc'
|
|||
|
},
|
|||
|
user: {
|
|||
|
type: Object,
|
|||
|
default: {}
|
|||
|
},
|
|||
|
},
|
|||
|
data() {
|
|||
|
return {
|
|||
|
// more参数
|
|||
|
hideMore:true,
|
|||
|
//表情定义
|
|||
|
hideEmoji:true,
|
|||
|
tindex: 0,
|
|||
|
emojiScene: 'emoji',
|
|||
|
timeEmojiList: ["😀", "😁", "😃", "😄"],
|
|||
|
emojiList:[],
|
|||
|
shopEmojiList: [
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水1',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水2',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如水',
|
|||
|
},
|
|||
|
{
|
|||
|
src: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
name: '心静如',
|
|||
|
},
|
|||
|
],
|
|||
|
//表情图片图床名称 ,由于我上传的第三方图床名称会有改变,所以有此数据来做对应,您实际应用中应该不需要
|
|||
|
onlineEmoji:{"100.gif":"AbNQgA.gif","101.gif":"AbN3ut.gif","102.gif":"AbNM3d.gif","103.gif":"AbN8DP.gif","104.gif":"AbNljI.gif","105.gif":"AbNtUS.gif","106.gif":"AbNGHf.gif","107.gif":"AbNYE8.gif","108.gif":"AbNaCQ.gif","109.gif":"AbNN4g.gif","110.gif":"AbN0vn.gif","111.gif":"AbNd3j.gif","112.gif":"AbNsbV.gif","113.gif":"AbNwgs.gif","114.gif":"AbNrD0.gif","115.gif":"AbNDuq.gif","116.gif":"AbNg5F.gif","117.gif":"AbN6ET.gif","118.gif":"AbNcUU.gif","119.gif":"AbNRC4.gif","120.gif":"AbNhvR.gif","121.gif":"AbNf29.gif","122.gif":"AbNW8J.gif","123.gif":"AbNob6.gif","124.gif":"AbN5K1.gif","125.gif":"AbNHUO.gif","126.gif":"AbNIDx.gif","127.gif":"AbN7VK.gif","128.gif":"AbNb5D.gif","129.gif":"AbNX2d.gif","130.gif":"AbNLPe.gif","131.gif":"AbNjxA.gif","132.gif":"AbNO8H.gif","133.gif":"AbNxKI.gif","134.gif":"AbNzrt.gif","135.gif":"AbU9Vf.gif","136.gif":"AbUSqP.gif","137.gif":"AbUCa8.gif","138.gif":"AbUkGQ.gif","139.gif":"AbUFPg.gif","140.gif":"AbUPIS.gif","141.gif":"AbUZMn.gif","142.gif":"AbUExs.gif","143.gif":"AbUA2j.gif","144.gif":"AbUMIU.gif","145.gif":"AbUerq.gif","146.gif":"AbUKaT.gif","147.gif":"AbUmq0.gif","148.gif":"AbUuZV.gif","149.gif":"AbUliF.gif","150.gif":"AbU1G4.gif","151.gif":"AbU8z9.gif","152.gif":"AbU3RJ.gif","153.gif":"AbUYs1.gif","154.gif":"AbUJMR.gif","155.gif":"AbUadK.gif","156.gif":"AbUtqx.gif","157.gif":"AbUUZ6.gif","158.gif":"AbUBJe.gif","159.gif":"AbUdIO.gif","160.gif":"AbU0iD.gif","161.gif":"AbUrzd.gif","162.gif":"AbUDRH.gif","163.gif":"AbUyQA.gif","164.gif":"AbUWo8.gif","165.gif":"AbU6sI.gif","166.gif":"AbU2eP.gif","167.gif":"AbUcLt.gif","168.gif":"AbU4Jg.gif","169.gif":"AbURdf.gif","170.gif":"AbUhFS.gif","171.gif":"AbU5WQ.gif","172.gif":"AbULwV.gif","173.gif":"AbUIzj.gif","174.gif":"AbUTQs.gif","175.gif":"AbU7yn.gif","176.gif":"AbUqe0.gif","177.gif":"AbUHLq.gif","178.gif":"AbUOoT.gif","179.gif":"AbUvYF.gif","180.gif":"AbUjFU.gif","181.gif":"AbaSSJ.gif","182.gif":"AbUxW4.gif","183.gif":"AbaCO1.gif","184.gif":"Abapl9.gif","185.gif":"Aba9yR.gif","186.gif":"AbaFw6.gif","187.gif":"Abaiex.gif","188.gif":"AbakTK.gif","189.gif":"AbaZfe.png","190.gif":"AbaEFO.gif","191.gif":"AbaVYD.gif","192.gif":"AbamSH.gif","193.gif":"AbaKOI.gif","194.gif":"Abanld.gif","195.gif":"Abau6A.gif","196.gif":"AbaQmt.gif","197.gif":"Abal0P.gif","198.gif":"AbatpQ.gif","199.gif":"Aba1Tf.gif","200.png":"Aba8k8.png","201.png":"AbaGtS.png","202.png":"AbaJfg.png","203.png":"AbaNlj.png","204.png":"Abawmq.png","205.png":"AbaU6s.png","206.png":"AbaaXn.png","207.png":"Aba000.png","208.png":"AbarkT.png","209.png":"AbastU.png","210.png":"AbaB7V.png","211.png":"Abafn1.png","212.png":"Abacp4.png","213.png":"AbayhF.png","214.png":"Abag1J.png","215.png":"Aba2c9.png","216.png":"AbaRXR.png","217.png":"Aba476.png","218.png":"Abah0x.png","219.png":"Abdg58.png"},
|
|||
|
emojiTools: [{
|
|||
|
icon: 'emoji-good',
|
|||
|
type: 'icon',
|
|||
|
scene: 'emoji',
|
|||
|
}/* ,{
|
|||
|
icon: 'outline-heart',
|
|||
|
type: 'icon',
|
|||
|
scene: 'like',
|
|||
|
},{
|
|||
|
icon: 'https://rbtnet.oss-cn-hangzhou.aliyuncs.com/laohu.png',
|
|||
|
type: 'image',
|
|||
|
scene: 'shop',
|
|||
|
} */],
|
|||
|
//文字消息
|
|||
|
textMsg:'',
|
|||
|
// 抽屉参数
|
|||
|
popupLayerClass:'',
|
|||
|
//录音相关参数
|
|||
|
timeOutEvent: 0,
|
|||
|
// #ifndef H5
|
|||
|
//H5不能录音
|
|||
|
RECORDER:uni.getRecorderManager(),
|
|||
|
// #endif
|
|||
|
initPoint:{identifier:0,Y:0},
|
|||
|
voiceTis:'按住 说话',
|
|||
|
recordTis:"手指上滑 取消发送",
|
|||
|
recordLength:0,
|
|||
|
recordTimer:null,
|
|||
|
isVoice:true,
|
|||
|
willStop:false,
|
|||
|
recording:false,
|
|||
|
};
|
|||
|
},
|
|||
|
created() {
|
|||
|
//键盘高度监听
|
|||
|
let safeH = this.isPhoneX() ? 34 : 0;
|
|||
|
/* uni.onKeyboardHeightChange(res => {
|
|||
|
let h = res.height - safeH - 1;
|
|||
|
this.keyboardHeight = h > 0 ? h : 0;
|
|||
|
}); */
|
|||
|
|
|||
|
// #ifndef H5
|
|||
|
//录音开始事件
|
|||
|
this.RECORDER.onStart((e)=>{
|
|||
|
this.recordBegin(e);
|
|||
|
})
|
|||
|
//录音结束事件
|
|||
|
this.RECORDER.onStop((e)=>{
|
|||
|
this.recordEnd(e);
|
|||
|
})
|
|||
|
// #endif
|
|||
|
},
|
|||
|
methods: {
|
|||
|
//添加表情
|
|||
|
addEmoji(em, scene){
|
|||
|
if('emoji' == scene){
|
|||
|
this.textMsg+=em;
|
|||
|
}else{
|
|||
|
this.$emit('sendEmoji', em);
|
|||
|
}
|
|||
|
},
|
|||
|
openGift() {
|
|||
|
this.hideDrawer();
|
|||
|
this.$emit('openGift');
|
|||
|
},
|
|||
|
//获取焦点,则关闭抽屉
|
|||
|
textareaFocus(){
|
|||
|
this.hideDrawer();
|
|||
|
},
|
|||
|
changeTool(i) {
|
|||
|
this.tindex = i;
|
|||
|
this.emojiScene = this.emojiTools[i].scene;
|
|||
|
if('shop' == this.emojiScene){
|
|||
|
|
|||
|
}
|
|||
|
},
|
|||
|
delBtn() {
|
|||
|
var length = this.textMsg.length;
|
|||
|
var str = this.textMsg.slice(length-2, length);
|
|||
|
if(this.emojiList.includes(str)){
|
|||
|
this.textMsg = this.textMsg.slice(0, length-2);
|
|||
|
}else{
|
|||
|
this.textMsg = this.textMsg.slice(0, length-1);
|
|||
|
}
|
|||
|
},
|
|||
|
// 发送文字消息
|
|||
|
sendText(){
|
|||
|
this.hideDrawer();//隐藏抽屉
|
|||
|
if(!this.textMsg){
|
|||
|
return;
|
|||
|
}
|
|||
|
let msg = {
|
|||
|
contentType: 1,
|
|||
|
content: this.textMsg,
|
|||
|
};
|
|||
|
this.$emit('send', msg);
|
|||
|
this.textMsg = '';//清空输入框
|
|||
|
},
|
|||
|
//替换表情符号为图片
|
|||
|
replaceEmoji(str){
|
|||
|
let replacedStr = str.replace(/\[([^(\]|\[)]*)\]/g,(item, index)=>{
|
|||
|
console.log("item: " + item);
|
|||
|
for(let i=0;i<this.emojiList.length;i++){
|
|||
|
let row = this.emojiList[i];
|
|||
|
for(let j=0;j<row.length;j++){
|
|||
|
let EM = row[j];
|
|||
|
if(EM.alt==item){
|
|||
|
//在线表情路径,图文混排必须使用网络路径,请上传一份表情到你的服务器后再替换此路径
|
|||
|
//比如你上传服务器后,你的100.gif路径为https://www.xxx.com/emoji/100.gif 则替换onlinePath填写为https://www.xxx.com/emoji/
|
|||
|
let onlinePath = 'https://s2.ax1x.com/2019/04/12/'
|
|||
|
let imgstr = '<img src="'+onlinePath+this.onlineEmoji[EM.url]+'">';
|
|||
|
console.log("imgstr: " + imgstr);
|
|||
|
return imgstr;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
return '<div style="display: flex;align-items: center;word-wrap:break-word;">'+replacedStr+'</div>';
|
|||
|
},
|
|||
|
voiceOk(e) {
|
|||
|
this.$emit('voiceOk', e);
|
|||
|
},
|
|||
|
// 打开抽屉
|
|||
|
openDrawer(){
|
|||
|
this.popupLayerClass = 'showLayer';
|
|||
|
},
|
|||
|
//更多功能(点击+弹出)
|
|||
|
showMore(){
|
|||
|
this.isVoice = true;
|
|||
|
this.hideEmoji = true;
|
|||
|
if(this.hideMore){
|
|||
|
this.hideMore = false;
|
|||
|
this.openDrawer();
|
|||
|
}else{
|
|||
|
this.hideDrawer();
|
|||
|
}
|
|||
|
},
|
|||
|
// 隐藏抽屉
|
|||
|
hideDrawer(){
|
|||
|
this.popupLayerClass = '';
|
|||
|
this.hideMore = true;
|
|||
|
this.hideEmoji = true;
|
|||
|
this.isVoice = true;
|
|||
|
},
|
|||
|
// 选择表情
|
|||
|
chooseEmoji(){
|
|||
|
this.emojiList = emoji;
|
|||
|
this.isVoice = true;
|
|||
|
this.hideMore = true;
|
|||
|
if(this.hideEmoji){
|
|||
|
this.hideEmoji = false;
|
|||
|
this.openDrawer();
|
|||
|
}else{
|
|||
|
this.hideDrawer();
|
|||
|
}
|
|||
|
},
|
|||
|
// 切换语音/文字输入
|
|||
|
switchVoice(){
|
|||
|
this.hideEmoji = true;
|
|||
|
this.hideMore = true;
|
|||
|
if(this.isVoice){
|
|||
|
this.isVoice = false;
|
|||
|
this.openDrawer();
|
|||
|
}else{
|
|||
|
this.hideDrawer();
|
|||
|
}
|
|||
|
},
|
|||
|
// 录音开始
|
|||
|
voiceBegin(e){
|
|||
|
this.timeOutEvent = setTimeout(() => {
|
|||
|
this.longPress(e); //长按方法
|
|||
|
}, 500); //这里设置定时器,定义长按500毫秒触发长按事件
|
|||
|
return false;
|
|||
|
},
|
|||
|
longPress(e) {
|
|||
|
if(e.touches.length>1){
|
|||
|
return ;
|
|||
|
}
|
|||
|
this.initPoint.Y = e.touches[0].clientY;
|
|||
|
this.initPoint.identifier = e.touches[0].identifier;
|
|||
|
this.RECORDER.start({format:"mp3"});//录音开始,
|
|||
|
},
|
|||
|
//录音开始UI效果
|
|||
|
recordBegin(e){
|
|||
|
this.recording = true;
|
|||
|
this.voiceTis='松开 结束';
|
|||
|
this.recordLength = 0;
|
|||
|
this.recordTimer = setInterval(()=>{
|
|||
|
this.recordLength++;
|
|||
|
},1000)
|
|||
|
},
|
|||
|
// 录音被打断
|
|||
|
voiceCancel(){
|
|||
|
clearTimeout(this.timeOutEvent); //清除定时器
|
|||
|
this.timeOutEvent = 0;
|
|||
|
|
|||
|
this.recording = false;
|
|||
|
this.voiceTis='按住 说话';
|
|||
|
this.recordTis = '手指上滑 取消发送'
|
|||
|
this.willStop = true;//不发送录音
|
|||
|
this.RECORDER.stop();//录音结束
|
|||
|
},
|
|||
|
// 录音中(判断是否触发上滑取消发送)
|
|||
|
voiceIng(e){
|
|||
|
clearTimeout(this.timeOutEvent); //清除定时器
|
|||
|
this.timeOutEvent = 0;
|
|||
|
|
|||
|
if(!this.recording){
|
|||
|
return;
|
|||
|
}
|
|||
|
let touche = e.touches[0];
|
|||
|
//上滑一个导航栏的高度触发上滑取消发送
|
|||
|
if(this.initPoint.Y - touche.clientY>=uni.upx2px(100)){
|
|||
|
this.willStop = true;
|
|||
|
this.recordTis = '松开手指 取消发送'
|
|||
|
}else{
|
|||
|
this.willStop = false;
|
|||
|
this.recordTis = '手指上滑 取消发送'
|
|||
|
}
|
|||
|
},
|
|||
|
// 结束录音
|
|||
|
voiceEnd(e){
|
|||
|
clearTimeout(this.timeOutEvent); //清除定时器
|
|||
|
|
|||
|
if(!this.recording){
|
|||
|
return;
|
|||
|
}
|
|||
|
this.recording = false;
|
|||
|
this.voiceTis='按住 说话';
|
|||
|
this.recordTis = '手指上滑 取消发送'
|
|||
|
this.RECORDER.stop();//录音结束
|
|||
|
},
|
|||
|
//录音结束(回调文件)
|
|||
|
recordEnd(e){
|
|||
|
clearInterval(this.recordTimer);
|
|||
|
if(!this.willStop){
|
|||
|
console.log("e: " + JSON.stringify(e));
|
|||
|
let msg = {
|
|||
|
length:0,
|
|||
|
url:e.tempFilePath
|
|||
|
}
|
|||
|
let min = parseInt(this.recordLength/60);
|
|||
|
let sec = this.recordLength%60;
|
|||
|
min = min<10?'0'+min:min;
|
|||
|
sec = sec<10?'0'+sec:sec;
|
|||
|
msg.length = min+':'+sec;
|
|||
|
this.$emit('send', msg, 'voice');
|
|||
|
}else{
|
|||
|
console.log('取消发送录音');
|
|||
|
}
|
|||
|
this.willStop = false;
|
|||
|
},
|
|||
|
isPhoneX() {
|
|||
|
const res = uni.getSystemInfoSync();
|
|||
|
let iphonex = false;
|
|||
|
let models = ['iphonex', 'iphonexr', 'iphonexsmax', 'iphone11', 'iphone11pro', 'iphone11promax']
|
|||
|
const model = res.model.replace(/\s/g, "").toLowerCase()
|
|||
|
if (models.includes(model)) {
|
|||
|
iphonex = true;
|
|||
|
}
|
|||
|
return iphonex;
|
|||
|
},
|
|||
|
// 选择图片发送
|
|||
|
chooseImage() {
|
|||
|
this.getImage('album');
|
|||
|
},
|
|||
|
//拍照发送
|
|||
|
camera() {
|
|||
|
this.getImage('camera');
|
|||
|
},
|
|||
|
getWeixin() {
|
|||
|
var that = this;
|
|||
|
uni.showModal({
|
|||
|
title: '交换名片',
|
|||
|
content: '确认交换名片吗?',
|
|||
|
success: function (res) {
|
|||
|
if (res.confirm) {
|
|||
|
that.$emit('getWeixin');
|
|||
|
}
|
|||
|
},
|
|||
|
});
|
|||
|
},
|
|||
|
//选照片 or 拍照
|
|||
|
getImage(type) {
|
|||
|
this.hideDrawer();
|
|||
|
uni.chooseImage({
|
|||
|
count: 9,
|
|||
|
sourceType: [type],
|
|||
|
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
|
|||
|
success: (res) => {
|
|||
|
for (let i = 0; i < res.tempFilePaths.length; i++) {
|
|||
|
uni.getImageInfo({
|
|||
|
src: res.tempFilePaths[i],
|
|||
|
success: (image) => {
|
|||
|
let msg = {
|
|||
|
path: res.tempFilePaths[i],
|
|||
|
imgWidth: image.width,
|
|||
|
imgHeight: image.height
|
|||
|
};
|
|||
|
this.$emit('imageOk', msg);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
discard(){
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss" scoped>
|
|||
|
.voice-center {
|
|||
|
position: absolute;
|
|||
|
left: 0;
|
|||
|
right: 0;
|
|||
|
top: 0;
|
|||
|
bottom: 0;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.hidden{
|
|||
|
display: none !important;
|
|||
|
}
|
|||
|
.popup-layer{
|
|||
|
position: relative;
|
|||
|
&.showLayer{height: 570rpx;}
|
|||
|
transition: all .15s linear;
|
|||
|
width: 100%;
|
|||
|
height: 0rpx;
|
|||
|
background-color: #fff;
|
|||
|
//position: fixed;
|
|||
|
z-index: 20;
|
|||
|
top: 100%;
|
|||
|
|
|||
|
.emoji-tools-scroll-view {
|
|||
|
height: 110rpx;
|
|||
|
|
|||
|
.emoji-tool-box {
|
|||
|
display: flex;
|
|||
|
height: 100%;
|
|||
|
padding: 0 10px;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.emoji-tools-item {
|
|||
|
height: 80rpx;
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
width: 80rpx;
|
|||
|
padding: 0 10px;
|
|||
|
border-radius: 10px;
|
|||
|
margin-right: 10px;
|
|||
|
|
|||
|
.img {
|
|||
|
height: 50rpx;
|
|||
|
width: 50rpx;
|
|||
|
position: absolute;
|
|||
|
border-radius: 0;
|
|||
|
}
|
|||
|
|
|||
|
.emoji {
|
|||
|
width: 36.36rpx;
|
|||
|
height: 36.36rpx !important;
|
|||
|
margin: 5.45rpx 18.18rpx;
|
|||
|
position: relative;
|
|||
|
top: 3.63rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.emoji-tools-item.select {
|
|||
|
background: #eaeaea;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.del-btn {
|
|||
|
position: fixed;
|
|||
|
right: 10px;
|
|||
|
bottom: 136rpx;
|
|||
|
background-color: #fff;
|
|||
|
border-radius: 6px;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
padding: 14rpx 20rpx;
|
|||
|
box-shadow: 1px 1px 1px 1px #ddd;
|
|||
|
}
|
|||
|
|
|||
|
.emoji-swiper{
|
|||
|
height: 460rpx;
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
|
|||
|
.title {
|
|||
|
margin-left: 30rpx;
|
|||
|
font-size: 22rpx;
|
|||
|
color: #333;
|
|||
|
margin-bottom: 30rpx;
|
|||
|
}
|
|||
|
|
|||
|
.emoji-list {
|
|||
|
transform: translate(1%, -5px) translateZ(0px);
|
|||
|
display: flex;
|
|||
|
flex-wrap: wrap;
|
|||
|
}
|
|||
|
|
|||
|
.emoji_tools1{
|
|||
|
width: 14%;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
padding-bottom: 10px;
|
|||
|
text{
|
|||
|
height: 100%;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
font-size: 44rpx;
|
|||
|
}
|
|||
|
.icon{
|
|||
|
width: 8.4vw;
|
|||
|
height: 8.4vw;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
.emoji_image{
|
|||
|
width: 20%;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
flex-direction: column;
|
|||
|
align-items: center;
|
|||
|
margin-bottom: 20rpx;
|
|||
|
|
|||
|
.emoji-add {
|
|||
|
border: 1px dashed #333;
|
|||
|
height: 100rpx;
|
|||
|
width: 100rpx;
|
|||
|
border-radius: 20rpx;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.image {
|
|||
|
height: 100rpx;
|
|||
|
width: 100rpx;
|
|||
|
margin-bottom: 10rpx;
|
|||
|
}
|
|||
|
|
|||
|
text {
|
|||
|
font-size: 22rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.tool-swiper{
|
|||
|
height: 570rpx;
|
|||
|
padding: 0px 40rpx;
|
|||
|
|
|||
|
.tool-swiper-box {
|
|||
|
display: flex;
|
|||
|
padding-top: 30rpx;
|
|||
|
}
|
|||
|
|
|||
|
swiper-item{
|
|||
|
display: flex;
|
|||
|
align-content: flex-start;
|
|||
|
flex-wrap: wrap;
|
|||
|
|
|||
|
.tool-btn {
|
|||
|
padding-top: 10px;
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
align-items: center;
|
|||
|
width: 25%;
|
|||
|
margin-bottom: 40rpx;
|
|||
|
.btn-card {
|
|||
|
background-color: #f5f5f5;
|
|||
|
width: 110rpx;
|
|||
|
height: 110rpx;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
border-radius: 10px;
|
|||
|
margin-bottom: 20rpx;
|
|||
|
}
|
|||
|
.btn-text {
|
|||
|
font-size: 22rpx;
|
|||
|
color: #333;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.more-layer{
|
|||
|
width: 100%;
|
|||
|
height: 42vw;
|
|||
|
.list{
|
|||
|
width: 100%;
|
|||
|
display: flex;
|
|||
|
flex-wrap: wrap;
|
|||
|
.box{
|
|||
|
width: 18vw;
|
|||
|
height: 18vw;
|
|||
|
border-radius: 20upx;
|
|||
|
background-color: #fff;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
margin: 0 3vw 2vw 3vw;
|
|||
|
.icon{
|
|||
|
font-size: 70upx;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.input-box{
|
|||
|
min-height: 100upx;
|
|||
|
left: 0;
|
|||
|
right: 0;
|
|||
|
background-color: #fff;
|
|||
|
display: flex;
|
|||
|
z-index: 20;
|
|||
|
bottom:-2upx;
|
|||
|
&.showLayer{}
|
|||
|
transition: all .15s linear;
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
padding: 0 5px;
|
|||
|
.voice,.more{
|
|||
|
flex-shrink: 0;
|
|||
|
width: 90upx;
|
|||
|
height: 100upx;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.send{
|
|||
|
//H5发送按钮左边距
|
|||
|
margin-left: 20upx;
|
|||
|
flex-shrink: 0;
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
.btn{
|
|||
|
width: 90upx;
|
|||
|
height: 56upx;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
background-color: #e54d42;
|
|||
|
color: #fff;
|
|||
|
border-radius: 3px;
|
|||
|
font-size: 24rpx;
|
|||
|
}
|
|||
|
}
|
|||
|
.textbox{
|
|||
|
width: 100%;
|
|||
|
min-height: 70upx;
|
|||
|
//margin-left: 8px;
|
|||
|
|
|||
|
.voice-mode{
|
|||
|
width: calc(100% - 2upx);
|
|||
|
height: 68upx;
|
|||
|
border-radius: 6px;
|
|||
|
border:solid 1upx #cdcdcd;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
font-size: 28upx;
|
|||
|
background-color: #fff;
|
|||
|
font-weight: bold;
|
|||
|
color: #555;
|
|||
|
&.recording{
|
|||
|
background-color: #e5e5e5;
|
|||
|
}
|
|||
|
}
|
|||
|
.text-mode{
|
|||
|
width: 100%;
|
|||
|
min-height: 70upx;
|
|||
|
display: flex;
|
|||
|
background-color: #F8F8F8;
|
|||
|
border-radius: 45px;
|
|||
|
color: #666666;
|
|||
|
font-size: 12px;
|
|||
|
.box{
|
|||
|
width: 100%;
|
|||
|
padding-left: 30upx;
|
|||
|
min-height: 70upx;
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
padding: 5px 10px;
|
|||
|
textarea{
|
|||
|
width: 100%;
|
|||
|
}
|
|||
|
}
|
|||
|
.em{
|
|||
|
flex-shrink: 0;
|
|||
|
width: 80upx;
|
|||
|
padding-left: 10upx;
|
|||
|
height: 70upx;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
|
|||
|
.input-placeholder {
|
|||
|
color: #bfbfbf;
|
|||
|
font-size: 12px;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.record{
|
|||
|
width: 40vw;
|
|||
|
height: 40vw;
|
|||
|
position: fixed;
|
|||
|
top: 55%;
|
|||
|
left: 30%;
|
|||
|
background-color: rgba(0,0,0,.6);
|
|||
|
border-radius: 20upx;
|
|||
|
.ing{
|
|||
|
width: 100%;
|
|||
|
height: 30vw;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
// 模拟录音音效动画
|
|||
|
@keyframes volatility {
|
|||
|
0% {background-position: 0% 130%;}
|
|||
|
20% {background-position: 0% 150%;}
|
|||
|
30% {background-position: 0% 155%;}
|
|||
|
40% {background-position: 0% 150%;}
|
|||
|
50% {background-position: 0% 145%;}
|
|||
|
70% {background-position: 0% 150%;}
|
|||
|
80% {background-position: 0% 155%;}
|
|||
|
90% {background-position: 0% 140%;}
|
|||
|
100% {background-position: 0% 135%;}
|
|||
|
}
|
|||
|
.icon{
|
|||
|
background-image:linear-gradient(to bottom,#f09b37,#fff 50%);
|
|||
|
background-size:100% 200%;
|
|||
|
animation: volatility 1.5s ease-in-out -1.5s infinite alternate;
|
|||
|
-webkit-background-clip:text;
|
|||
|
-webkit-text-fill-color:transparent;
|
|||
|
font-size: 150upx;
|
|||
|
color: #f09b37;
|
|||
|
}
|
|||
|
}
|
|||
|
.cancel{
|
|||
|
width: 100%;
|
|||
|
height: 30vw;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
.icon{
|
|||
|
color: #fff;
|
|||
|
font-size: 150upx;
|
|||
|
}
|
|||
|
}
|
|||
|
.tis{
|
|||
|
width: 100%;
|
|||
|
height: 10vw;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
font-size: 28upx;
|
|||
|
color: #fff;
|
|||
|
&.change{
|
|||
|
color: #f09b37;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.content{
|
|||
|
width: 100%;
|
|||
|
.msg-list{
|
|||
|
width: 96%;
|
|||
|
padding: 0 2%;
|
|||
|
position: absolute;
|
|||
|
top: 0;
|
|||
|
bottom: 100upx;
|
|||
|
.loading{
|
|||
|
//loading动画
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
@keyframes stretchdelay {
|
|||
|
0%, 40%, 100% {
|
|||
|
transform: scaleY(0.6);
|
|||
|
}
|
|||
|
20% {
|
|||
|
transform: scaleY(1.0);
|
|||
|
}
|
|||
|
}
|
|||
|
.spinner {
|
|||
|
margin: 20upx 0;
|
|||
|
width: 60upx;
|
|||
|
height: 100upx;
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
justify-content: space-between;
|
|||
|
view {
|
|||
|
background-color: #f06c7a;
|
|||
|
height: 50upx;
|
|||
|
width: 6upx;
|
|||
|
border-radius: 6upx;
|
|||
|
animation: stretchdelay 1.2s infinite ease-in-out;
|
|||
|
}
|
|||
|
.rect2 {
|
|||
|
animation-delay: -1.1s;
|
|||
|
}
|
|||
|
.rect3 {
|
|||
|
animation-delay: -1.0s;
|
|||
|
}
|
|||
|
.rect4 {
|
|||
|
animation-delay: -0.9s;
|
|||
|
}
|
|||
|
.rect5 {
|
|||
|
animation-delay: -0.8s;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.row{
|
|||
|
.system{
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
view{
|
|||
|
padding: 0 30upx;
|
|||
|
height: 50upx;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
background-color: #c9c9c9;
|
|||
|
color: #fff;
|
|||
|
font-size: 24upx;
|
|||
|
border-radius: 40upx;
|
|||
|
}
|
|||
|
.red-envelope{
|
|||
|
image{
|
|||
|
margin-right: 5upx;
|
|||
|
width: 30upx;
|
|||
|
height: 30upx;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
&:first-child{
|
|||
|
margin-top: 20upx;
|
|||
|
}
|
|||
|
padding: 20upx 0;
|
|||
|
.my .left,.other .right{
|
|||
|
width: 100%;
|
|||
|
display: flex;
|
|||
|
.bubble{
|
|||
|
max-width: 70%;
|
|||
|
min-height: 50upx;
|
|||
|
border-radius: 10upx;
|
|||
|
padding: 15upx 20upx;
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
font-size: 32upx;
|
|||
|
word-break: break-word;
|
|||
|
&.img{
|
|||
|
background-color: transparent;
|
|||
|
padding:0;
|
|||
|
overflow: hidden;
|
|||
|
image{
|
|||
|
max-width: 350upx;
|
|||
|
max-height: 350upx;
|
|||
|
}
|
|||
|
}
|
|||
|
&.red-envelope{
|
|||
|
background-color: transparent;
|
|||
|
padding:0;
|
|||
|
overflow: hidden;
|
|||
|
position: relative;
|
|||
|
justify-content: center;
|
|||
|
align-items: flex-start;
|
|||
|
image{
|
|||
|
width: 250upx;
|
|||
|
height: 313upx;
|
|||
|
}
|
|||
|
.tis{
|
|||
|
position: absolute;
|
|||
|
top: 6%;
|
|||
|
font-size: 26upx;
|
|||
|
color: #9c1712;
|
|||
|
}
|
|||
|
.blessing{
|
|||
|
position: absolute;
|
|||
|
bottom: 14%;
|
|||
|
color: #e9b874;
|
|||
|
width: 80%;
|
|||
|
text-align: center;
|
|||
|
overflow: hidden;
|
|||
|
// 最多两行
|
|||
|
display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;
|
|||
|
}
|
|||
|
}
|
|||
|
&.voice{
|
|||
|
.icon{
|
|||
|
font-size: 40upx;
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
.icon:after
|
|||
|
{
|
|||
|
content:" ";
|
|||
|
width: 53upx;
|
|||
|
height: 53upx;
|
|||
|
border-radius: 100%;
|
|||
|
position: absolute;
|
|||
|
box-sizing: border-box;
|
|||
|
}
|
|||
|
.length{
|
|||
|
font-size: 28upx;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.my .right,.other .left{
|
|||
|
flex-shrink: 0;
|
|||
|
width: 80upx;
|
|||
|
height: 80upx;
|
|||
|
image{
|
|||
|
width: 80upx;
|
|||
|
height: 80upx;
|
|||
|
border-radius: 10upx;
|
|||
|
}
|
|||
|
}
|
|||
|
.my{
|
|||
|
width: 100%;
|
|||
|
display: flex;
|
|||
|
justify-content: flex-end;
|
|||
|
.left{
|
|||
|
min-height: 80upx;
|
|||
|
|
|||
|
align-items: center;
|
|||
|
justify-content: flex-end;
|
|||
|
.bubble{
|
|||
|
background-color: #f06c7a;
|
|||
|
color: #fff;
|
|||
|
|
|||
|
&.voice{
|
|||
|
.icon{
|
|||
|
color: #fff;
|
|||
|
}
|
|||
|
.length{
|
|||
|
margin-right: 20upx;
|
|||
|
}
|
|||
|
}
|
|||
|
&.play{
|
|||
|
@keyframes my-play {
|
|||
|
0% {
|
|||
|
transform: translateX(80%);
|
|||
|
}
|
|||
|
100% {
|
|||
|
transform: translateX(0%);
|
|||
|
}
|
|||
|
}
|
|||
|
.icon:after
|
|||
|
{
|
|||
|
border-left: solid 10upx rgba(240,108,122,.5);
|
|||
|
animation: my-play 1s linear infinite;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.right{
|
|||
|
margin-left: 15upx;
|
|||
|
}
|
|||
|
}
|
|||
|
.other{
|
|||
|
width: 100%;
|
|||
|
display: flex;
|
|||
|
.left{
|
|||
|
margin-right: 15upx;
|
|||
|
}
|
|||
|
.right{
|
|||
|
flex-wrap: wrap;
|
|||
|
.username{
|
|||
|
width: 100%;
|
|||
|
height: 45upx;
|
|||
|
font-size: 24upx;
|
|||
|
color: #999;
|
|||
|
display: flex;
|
|||
|
.name{
|
|||
|
margin-right: 50upx;
|
|||
|
}
|
|||
|
}
|
|||
|
.bubble{
|
|||
|
background-color: #fff;
|
|||
|
color: #333;
|
|||
|
&.voice{
|
|||
|
.icon{
|
|||
|
color: #333;
|
|||
|
|
|||
|
}
|
|||
|
.length{
|
|||
|
margin-left: 20upx;
|
|||
|
}
|
|||
|
}
|
|||
|
&.play{
|
|||
|
@keyframes other-play {
|
|||
|
0% {
|
|||
|
transform: translateX(-80%);
|
|||
|
}
|
|||
|
100% {
|
|||
|
transform: translateX(0%);
|
|||
|
}
|
|||
|
}
|
|||
|
.icon:after
|
|||
|
{
|
|||
|
border-right: solid 10upx rgba(255,255,255,.8);
|
|||
|
|
|||
|
animation: other-play 1s linear infinite;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.windows{
|
|||
|
|
|||
|
.mask{
|
|||
|
position: fixed;
|
|||
|
top: 100%;
|
|||
|
width: 100%;
|
|||
|
height: 100%;
|
|||
|
z-index: 1000;
|
|||
|
background-color: rgba(0,0,0,.6);
|
|||
|
opacity: 0;
|
|||
|
transition: opacity .2s ease-out;
|
|||
|
}
|
|||
|
.layer{
|
|||
|
position: fixed;
|
|||
|
width: 80%;
|
|||
|
height: 70%;
|
|||
|
left: 10%;
|
|||
|
z-index: 1001;
|
|||
|
border-radius: 20upx;
|
|||
|
overflow: hidden;
|
|||
|
top:100%;
|
|||
|
transform: scale3d(.5,.5,1);
|
|||
|
transition: all .2s ease-out;
|
|||
|
}
|
|||
|
&.show{
|
|||
|
display: block;
|
|||
|
.mask{
|
|||
|
top: 0;
|
|||
|
opacity: 1;
|
|||
|
}
|
|||
|
.layer{
|
|||
|
transform: translate3d(0,-85vh,0) scale3d(1,1,1);
|
|||
|
}
|
|||
|
}
|
|||
|
&.hide{
|
|||
|
display: block;
|
|||
|
.mask{
|
|||
|
top: 0;
|
|||
|
opacity: 0;
|
|||
|
}
|
|||
|
.layer{
|
|||
|
//transform: translate3d(0,-85vh,0) scale3d(.5,.5,1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.open-redenvelope{
|
|||
|
width: 100%;
|
|||
|
height: 70vh;
|
|||
|
background-color: #cf3c35;
|
|||
|
position: relative;
|
|||
|
.top{
|
|||
|
width: 100%;
|
|||
|
background-color: #fe5454;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
flex-wrap: wrap;
|
|||
|
border-radius: 0 0 100% 100%;
|
|||
|
box-shadow: inset 0 -20upx 0 #9c1712;
|
|||
|
.close-btn{
|
|||
|
width: 100%;
|
|||
|
height: 80upx;
|
|||
|
display: flex;
|
|||
|
justify-content: flex-end;
|
|||
|
margin-bottom: 30upx;
|
|||
|
.icon{
|
|||
|
color: #9c1712;
|
|||
|
margin-top: 10upx;
|
|||
|
margin-right: 10upx;
|
|||
|
}
|
|||
|
}
|
|||
|
image{
|
|||
|
width: 130upx;
|
|||
|
height: 130upx;
|
|||
|
border: solid 12upx #cf3c35;
|
|||
|
border-radius: 100%;
|
|||
|
|
|||
|
margin-bottom: -65upx;
|
|||
|
}
|
|||
|
margin-bottom: 65upx;
|
|||
|
}
|
|||
|
.from,.blessing,.money,.showDetails{
|
|||
|
width: 90%;
|
|||
|
padding: 5upx 5%;
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
font-size: 32upx;
|
|||
|
color: #fff;
|
|||
|
}
|
|||
|
.money{
|
|||
|
font-size: 100upx;
|
|||
|
color: #f8d757;
|
|||
|
display: flex;
|
|||
|
padding-top: 20upx;
|
|||
|
}
|
|||
|
.showDetails{
|
|||
|
position: absolute;
|
|||
|
bottom: 20upx;
|
|||
|
align-items: center;
|
|||
|
font-size: 28upx;
|
|||
|
color: #f8d757;
|
|||
|
.icon{
|
|||
|
font-size: 26upx;
|
|||
|
color: #f8d757;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.send-box {
|
|||
|
display: flex;
|
|||
|
flex: 1;
|
|||
|
padding: 30rpx 20rpx;
|
|||
|
align-items: center;
|
|||
|
|
|||
|
.icon {
|
|||
|
padding-left: 8px;
|
|||
|
}
|
|||
|
}
|
|||
|
.tool-box {
|
|||
|
display: flex;
|
|||
|
justify-content: space-between;
|
|||
|
align-items: center;
|
|||
|
padding: 10px;
|
|||
|
}
|
|||
|
|
|||
|
.send-tool {
|
|||
|
display: flex;
|
|||
|
justify-content: space-between;
|
|||
|
padding: 15px;
|
|||
|
padding-top: 0px;
|
|||
|
}
|
|||
|
</style>
|