|
@@ -0,0 +1,928 @@
|
|
|
+<template>
|
|
|
+ <div id="PageRtcLive">
|
|
|
+ <div class="member_number">
|
|
|
+ <div class="members"></div>
|
|
|
+ <span>2观看</span>
|
|
|
+ </div>
|
|
|
+ <!-- <chat ref="chat" v-show="chatShow" :chatList="chatList" :user_info="user_info"></chat> -->
|
|
|
+ <div class="videoBox userVideo" id="userVideo" v-show="!hideVideoTop">
|
|
|
+ <img v-if="!userVideoShow" :src="require('@/assets/images/rtcLive/avatar_small@2x.png')" alt="" />
|
|
|
+ <img v-if="!userVideoShow" class="loadingTip" :src="require('@/assets/images/rtcLive/loading@2x.png')" alt="" />
|
|
|
+ <div class="micBox">
|
|
|
+ <i v-if="hideMicTop" class="iconfont iconscene_mic_off1"></i>
|
|
|
+ <i v-else class="speak_mic"></i>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-show="mode == '1' && !hideVideoBottom" class="videoBox myVideo" id="myVideo">
|
|
|
+ <img v-if="!myVideoShow" :src="require('@/assets/images/rtcLive/avatar_small@2x.png')" alt="" />
|
|
|
+ <img v-if="!myVideoShow" class="loadingTip" :src="require('@/assets/images/rtcLive/loading@2x.png')" alt="" />
|
|
|
+ <div class="micBox">
|
|
|
+ <i v-if="hideMic" class="iconfont iconscene_mic_off1"></i>
|
|
|
+ <i v-else class="speak_mic"></i>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- </div> -->
|
|
|
+ <!-- <input type="text" autocomplete="off"> -->
|
|
|
+ <div class="contorlBar" v-if="!showInput">
|
|
|
+ <div v-if="connectStatus == 1" :class="{ disable: !user_info.isWords }" class="saySomething" @click="onFocus">
|
|
|
+ <!-- <i class="speakIcon"
|
|
|
+ :class="{'dis':!user_info.isWords}"></i> -->
|
|
|
+ <span v-if="user_info.isWords"> 说点什么 </span>
|
|
|
+ <span v-if="!user_info.isWords">已被禁言</span>
|
|
|
+
|
|
|
+ <div class="disSpeakBtn" @click.stop="chatShow = !chatShow" :class="{ dis: !chatShow }"></div>
|
|
|
+ </div>
|
|
|
+ <div style="text-align: right; width: 100%" v-if="connectStatus == 0">连接中...</div>
|
|
|
+ <div v-if="connectStatus == 1" class="contorl_btn">
|
|
|
+ <div v-if="isBrushes" @click="onDrawUndo" class="brushesBack" :class="{ disable: !canUndo }"></div>
|
|
|
+ <div v-if="user_info.Role == 'leader'" @click="onDraw" :class="{ brushesed: isBrushes }" class="brushes"></div>
|
|
|
+
|
|
|
+ <div
|
|
|
+ v-if="(user_list.length < 2 && mode == '1') || (mode == '2' && user_list.length < 30)"
|
|
|
+ class="invitation"
|
|
|
+ @click="openDialog('dialogShare', shareLink)"
|
|
|
+ ></div>
|
|
|
+ <div v-if="mode == '2' && role == 'leader'" class="members" @click="openMember"></div>
|
|
|
+ <div v-if="audioDevices.length != 0 && !disableMic" @click="changeMedia('audio', hideMic)" :class="{ mic_off: hideMic }" class="mic_on"></div>
|
|
|
+ <div v-if="audioDevices.length == 0 || disableMic" class="mic_no"></div>
|
|
|
+ <div
|
|
|
+ v-if="(role == 'leader' && videoDevices.length != 0) || (mode == '1' && videoDevices.length != 0)"
|
|
|
+ @click="changeMedia('video', hideVideo)"
|
|
|
+ :class="{ video_off: hideVideo }"
|
|
|
+ class="video_on"
|
|
|
+ ></div>
|
|
|
+ <div v-if="(videoDevices.length == 0 && mode == '1') || (role == 'leader' && videoDevices.length == 0)" class="video_no"></div>
|
|
|
+ <div class="exit" @click="openDialog('dialogIndex')"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="layer" v-if="showInput" @click="closeInput">
|
|
|
+ <div class="inputBox" @click.stop>
|
|
|
+ <div class="msgBox">
|
|
|
+ <input id="input_msg" type="text" maxlength="200" v-model.trim="text" :placeholder="`说点什么~`" />
|
|
|
+ <span class="iconsend_icon" :class="{ disable: text == '' }" @click.stop="sendText">发送</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 成员 -->
|
|
|
+ <div class="layer" v-if="showMember" @click.self="closeMember">
|
|
|
+ <div class="memberContent animated" :class="animateActive ? 'fadeInUpBig' : 'fadeOutDownBig'">
|
|
|
+ <div class="blurBox"></div>
|
|
|
+ <div class="content">
|
|
|
+ <div class="memberHeader">
|
|
|
+ <span> 成员管理({{ user_list.length }})</span>
|
|
|
+ <i class="iconfont"></i>
|
|
|
+ </div>
|
|
|
+ <div class="memberList">
|
|
|
+ <div class="memberItem">
|
|
|
+ <div class="userMsg">
|
|
|
+ <div class="avatar">
|
|
|
+ <img :src="require('@/assets/images/rtcLive/avatar_small@2x.png')" alt="" />
|
|
|
+ </div>
|
|
|
+ <div class="name" v-if="user_info.Role == 'leader'">{{ user_info.Nickname }} (主持人,我)</div>
|
|
|
+ <div class="name" v-else>{{ user_info.Nickname }} (我)</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="button" v-if="user_info.Role == 'leader'">
|
|
|
+ <!-- <div class="outBtn iconfont iconremove"></div> -->
|
|
|
+ <!-- <div v-if="audioDevices.length>0" class="micBtn iconfont" @click="changeMedia('audio',hideMic)" :class="user_info.muted ?'iconmic_off':'iconmic_on'"></div>
|
|
|
+ <div v-else class="micBtn iconfont iconmic_off"></div> -->
|
|
|
+ <div class="micBtn mute_all_mic" :class="{ open_all_mic: !all_mute_mic }" @click="onMemberMuted(all_mute_mic)"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-show="user_info.UserId != i.UserId && i.role != 'leader'" class="memberItem" v-for="i in user_list" :key="i.UserId">
|
|
|
+ <div class="userMsg">
|
|
|
+ <div class="avatar">
|
|
|
+ <img :src="require('@/assets/images/rtcLive/avatar_small@2x.png')" alt="" />
|
|
|
+ </div>
|
|
|
+ <div class="name">{{ i.userName }}</div>
|
|
|
+ </div>
|
|
|
+ <div class="button" v-if="user_info.Role == 'leader'">
|
|
|
+ <div class="micBtn" :class="i.isWords ? 'ban_speak_on' : 'ban_speak_off'" @click="userCanSpeak(i)"></div>
|
|
|
+
|
|
|
+ <div class="outBtn icon_remove" @click="userGetOut(i.UserId)"></div>
|
|
|
+ <div class="micBtn" :class="i.isMuted ? 'mute_one_mic_off' : 'mute_one_mic_on'" @click="onMemberMuted(!i.isMuted, i.UserId)"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <Draw ref="draw" @sendCanUndo="sendCanUndo" :show-paint="showPaint" />
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { onMounted, watch, defineEmits, ref, nextTick } from "vue";
|
|
|
+import { useApp, getApp } from "@/app";
|
|
|
+import { useStore } from "vuex";
|
|
|
+import { Scrollbar, Dialog } from "@/global_components/";
|
|
|
+
|
|
|
+// import Draw from './paint/Draw';
|
|
|
+import { mapGetters } from "vuex";
|
|
|
+// import chat from './chat/chat.vue';
|
|
|
+import browser from "@/utils/browser";
|
|
|
+
|
|
|
+const emit = defineEmits(["openDialog"]);
|
|
|
+
|
|
|
+const store = useStore();
|
|
|
+
|
|
|
+let createSocket = (config) => {
|
|
|
+ var socket = io("https://vr-admin.cdfmembers.com/", {
|
|
|
+ path: "/ws-sync",
|
|
|
+ transports: ["websocket"],
|
|
|
+ });
|
|
|
+ return socket;
|
|
|
+};
|
|
|
+
|
|
|
+let getUrl = (href, queryArr) => {
|
|
|
+ queryArr.forEach((item) => {
|
|
|
+ if (!browser.hasURLParam(item.key)) {
|
|
|
+ href += `&${item.key}=${item.val}`;
|
|
|
+ } else {
|
|
|
+ href = browser.replaceQueryString(href, item.key, item.val);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return href;
|
|
|
+};
|
|
|
+
|
|
|
+const connectStatus = ref(0);
|
|
|
+const showPaint = ref(true);
|
|
|
+const isBrushes = ref(false);
|
|
|
+const hideVideo = ref(false);
|
|
|
+const hideVideoBottom = ref(false);
|
|
|
+const hideVideoTop = ref(true);
|
|
|
+const hideMic = ref(false);
|
|
|
+const hideMicTop = ref(false);
|
|
|
+const showInput = ref(false);
|
|
|
+const showMember = ref(false);
|
|
|
+const animateActive = ref(false);
|
|
|
+const socket = ref(createSocket());
|
|
|
+const myVideoShow = ref(false);
|
|
|
+const userVideoShow = ref(false);
|
|
|
+const user_info = ref({});
|
|
|
+const user_list = ref([]);
|
|
|
+const mode = ref(browser.getURLParam("mode"));
|
|
|
+const role = ref(browser.getURLParam("role"));
|
|
|
+const chatList = ref([]);
|
|
|
+const text = ref("");
|
|
|
+
|
|
|
+const shareLink = ref("");
|
|
|
+const canUndo = ref(false);
|
|
|
+const audioDevices = ref([1]);
|
|
|
+const videoDevices = ref([1]);
|
|
|
+const disableMic = ref(false);
|
|
|
+const leaderInfo = ref(null);
|
|
|
+const chatShow = ref(true);
|
|
|
+const all_mute_mic = ref(true);
|
|
|
+
|
|
|
+const onDrawUndo = () => {};
|
|
|
+
|
|
|
+const setRtc = (res) => {
|
|
|
+ console.log("成功进入", res);
|
|
|
+ self.connectStatus = 1;
|
|
|
+
|
|
|
+ self.user_info = res.user;
|
|
|
+ self.user_list = res.users;
|
|
|
+ //分享链接
|
|
|
+ if (!(window.self === window.top)) {
|
|
|
+ // console.log(document.referrer)
|
|
|
+ var origin = "";
|
|
|
+ if (parent != window) {
|
|
|
+ try {
|
|
|
+ origin = parent.location.href;
|
|
|
+ } catch (e) {
|
|
|
+ // origin = document.referrer;
|
|
|
+
|
|
|
+ origin = window.name;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ self.shareLink = origin + "#/sceneVisitor" + window.location.search + "#/?mode=" + self.mode + "&role=customer&roomId=" + self.user_info.RoomId;
|
|
|
+ } else {
|
|
|
+ self.shareLink =
|
|
|
+ window.location.origin + window.location.pathname + window.location.search + "#/?mode=" + self.mode + "&role=customer&roomId=" + self.user_info.RoomId;
|
|
|
+ }
|
|
|
+
|
|
|
+ let hash = "";
|
|
|
+
|
|
|
+ if (self.role == "leader") {
|
|
|
+ if (!browser.urlHashValue("roomId")) {
|
|
|
+ hash += "&roomId=" + self.user_info.RoomId;
|
|
|
+ }
|
|
|
+ if (!browser.urlHashValue("userId")) {
|
|
|
+ hash += "&userId=" + self.user_info.UserId;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (!browser.urlHashValue("userId")) {
|
|
|
+ hash += "&userId=" + self.user_info.UserId;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //重定向hash
|
|
|
+ window.location.replace(window.location.href + hash);
|
|
|
+ if (!(window.self === window.top)) {
|
|
|
+ //判断在iframe内 需要告知外层
|
|
|
+ window.parent.postMessage({ type: "msg", url: window.location.href + hash }, "*");
|
|
|
+ }
|
|
|
+ //创建通话
|
|
|
+ if (!checkBrowserSupport()) {
|
|
|
+ self.$parent.showCheckBrowser = true;
|
|
|
+ } else {
|
|
|
+ checkDevices()
|
|
|
+ .then((res) => {
|
|
|
+ self.audioDevices = res.filter(function (device) {
|
|
|
+ return device.kind === "audioinput";
|
|
|
+ });
|
|
|
+ self.videoDevices = res.filter(function (device) {
|
|
|
+ return device.kind === "videoinput";
|
|
|
+ });
|
|
|
+ console.log("audioDevices", self.audioDevices);
|
|
|
+ console.log("videoDevices", self.videoDevices);
|
|
|
+ initRtc(self.user_info.RoomId, {
|
|
|
+ videoDevices: self.videoDevices,
|
|
|
+ audioDevices: self.audioDevices,
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ console.log(err);
|
|
|
+ initRtc(self.user_info.RoomId, {
|
|
|
+ videoDevices: self.videoDevices,
|
|
|
+ audioDevices: self.audioDevices,
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const onFocus = () => {
|
|
|
+ showInput.value = true;
|
|
|
+ nextTick(() => {
|
|
|
+ let input_msg = document.getElementById("input_msg");
|
|
|
+ input_msg.focus();
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+// 关闭输入框
|
|
|
+const closeInput = () => {
|
|
|
+ showInput.value = false;
|
|
|
+ text.value = "";
|
|
|
+};
|
|
|
+
|
|
|
+// 开启成员
|
|
|
+const openMember = () => {
|
|
|
+ showMember.value = true;
|
|
|
+ animateActive.value = true;
|
|
|
+};
|
|
|
+// 关闭成员
|
|
|
+const closeMember = () => {
|
|
|
+ animateActive.value = false;
|
|
|
+ let t = setTimeout(() => {
|
|
|
+ clearTimeout(t);
|
|
|
+ showMember.value = false;
|
|
|
+ }, 200);
|
|
|
+};
|
|
|
+
|
|
|
+const openDialog = (str, link) => {
|
|
|
+ // getApp().Connect.follow.start();
|
|
|
+ emit("openDialog", str, link);
|
|
|
+};
|
|
|
+
|
|
|
+const onMemberMuted = (muted, userId) => {
|
|
|
+ if (user_list.value.length > 1) {
|
|
|
+ Dialog.toast({ content: `操作成功`, type: "success" });
|
|
|
+ socket.value && socket.value.send("Muted", muted, userId);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const userCanSpeak = (item) => {
|
|
|
+ item.isWords = !item.isWords;
|
|
|
+ socket.value && socket.value.invoke("Words", isWords, userId);
|
|
|
+};
|
|
|
+
|
|
|
+const startFollow = (app) => {
|
|
|
+ var isJoined = false;
|
|
|
+
|
|
|
+ socket.value.on("connect", () => {
|
|
|
+ console.log(socket.value, "socket");
|
|
|
+ socket.value.emit("join", {
|
|
|
+ userId: Date.now().toString(),
|
|
|
+ roomId: "test-room",
|
|
|
+ role: "leader",
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ socket.value.on("action", (data) => {
|
|
|
+ if (data.type == "error") {
|
|
|
+ } else if (data.type == "user-join") {
|
|
|
+
|
|
|
+ connectStatus.value = 1
|
|
|
+ user_info.value = data.user;
|
|
|
+ user_list.value = data.members;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ console.log(user_info.value, "user_info");
|
|
|
+
|
|
|
+ shareLink.value = getUrl(window.location.href, [
|
|
|
+ {
|
|
|
+ key: "mode",
|
|
|
+ val: mode.value,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: "name",
|
|
|
+ val: "",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: "role",
|
|
|
+ val: "customer",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ key: "roomId",
|
|
|
+ val: user_info.value.RoomId,
|
|
|
+ },
|
|
|
+ ]);
|
|
|
+
|
|
|
+ isJoined = true;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ socket.value.on("sync", (data) => {
|
|
|
+ app.Connect.sync.receive(data);
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ useApp().then((app) => {
|
|
|
+ startFollow(app);
|
|
|
+ });
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped lang="scss">
|
|
|
+#PageRtcLive {
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ bottom: 0;
|
|
|
+ // height: 7.31rem;
|
|
|
+ width: 100%;
|
|
|
+ z-index: 999;
|
|
|
+ // background: rgba(0, 0, 0, 0.1);
|
|
|
+ padding: 0 0.44rem;
|
|
|
+ box-sizing: border-box;
|
|
|
+ // pointer-events: none;
|
|
|
+ .member_number {
|
|
|
+ // width: 1.67rem;
|
|
|
+ height: 0.5rem;
|
|
|
+ background: rgba(0, 0, 0, 0.3);
|
|
|
+ border-radius: 0.25rem;
|
|
|
+ position: fixed;
|
|
|
+ top: 0.56rem;
|
|
|
+ right: 0.44rem;
|
|
|
+ padding: 0.07rem 0.17rem;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ .members {
|
|
|
+ width: 0.42rem;
|
|
|
+ height: 0.42rem;
|
|
|
+ background: url(~@/assets/images/rtcLive/members@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ margin-right: 0.07rem;
|
|
|
+ }
|
|
|
+ span {
|
|
|
+ font-size: 0.24rem;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .videoBox {
|
|
|
+ width: 1.94rem;
|
|
|
+ height: 1.94rem;
|
|
|
+ border-radius: 50%;
|
|
|
+ overflow: hidden;
|
|
|
+ position: fixed;
|
|
|
+ .loadingTip {
|
|
|
+ position: absolute;
|
|
|
+ z-index: 101;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ animation: Rotate 1.5s infinite;
|
|
|
+ @keyframes Rotate {
|
|
|
+ 0% {
|
|
|
+ transform: rotate(0deg);
|
|
|
+ }
|
|
|
+ 100% {
|
|
|
+ transform: rotate(360deg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ > img {
|
|
|
+ width: 1.94rem;
|
|
|
+ height: 1.94rem;
|
|
|
+ }
|
|
|
+ .videoPlayer {
|
|
|
+ width: 1.94rem;
|
|
|
+ height: 1.94rem;
|
|
|
+ position: relative;
|
|
|
+ z-index: 2;
|
|
|
+ }
|
|
|
+ &.userVideo {
|
|
|
+ top: 0.69rem;
|
|
|
+ left: 0.53rem;
|
|
|
+ // background-size: ;
|
|
|
+ }
|
|
|
+ &.myVideo {
|
|
|
+ bottom: 2.72rem;
|
|
|
+ right: 0.69rem;
|
|
|
+ }
|
|
|
+
|
|
|
+ .micBox {
|
|
|
+ width: 100%;
|
|
|
+ height: 0.44rem;
|
|
|
+ background: rgba(0, 0, 0, 0.3);
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ bottom: 0;
|
|
|
+ z-index: 100;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ .speak_mic {
|
|
|
+ display: block;
|
|
|
+ background-size: 13.3344rem auto;
|
|
|
+ width: 0.22rem;
|
|
|
+ height: 0.22rem;
|
|
|
+ background-image: url(~@/assets/images/rtcLive/speed.png);
|
|
|
+ // width: 0.69rem;
|
|
|
+ // height: 0.69rem;
|
|
|
+ animation: myAnimation 3s steps(59) infinite;
|
|
|
+ }
|
|
|
+ .iconscene_mic_off1 {
|
|
|
+ font-size: 0.22rem;
|
|
|
+ color: #f56c6c;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .contorlBar {
|
|
|
+ width: 9.51rem;
|
|
|
+ height: 1.173333rem;
|
|
|
+ background: rgba(0, 0, 0, 0.5);
|
|
|
+ border-radius: 0.67rem;
|
|
|
+ border: 0.03rem solid rgba(255, 255, 255, 0.1);
|
|
|
+ margin: 0.67rem auto 0;
|
|
|
+ // position: absolute;
|
|
|
+ position: fixed;
|
|
|
+ z-index: 9999;
|
|
|
+ left: 50%;
|
|
|
+ transform: translateX(-50%);
|
|
|
+ padding: 0 0.266667rem;
|
|
|
+ box-sizing: border-box;
|
|
|
+ bottom: 0.94rem;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ .saySomething {
|
|
|
+ color: #fff;
|
|
|
+ // font-size: 0.42rem;
|
|
|
+ height: 0.8rem;
|
|
|
+ position: relative;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ background: rgba(0, 0, 0, 0.5);
|
|
|
+ padding: 0 0.2rem 0 0.2rem;
|
|
|
+ border-radius: 0.64rem;
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ .disSpeakBtn {
|
|
|
+ width: 0.533333rem;
|
|
|
+ height: 0.533333rem;
|
|
|
+ background: url(~@/assets/images/rtcLive/pop-up_screen_on@2x.png) no-repeat;
|
|
|
+ background-size: 100% 100%;
|
|
|
+ cursor: pointer;
|
|
|
+ &.dis {
|
|
|
+ background: url(~@/assets/images/rtcLive/pop-up_screen_off@2x.png) no-repeat;
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .speakIcon {
|
|
|
+ width: 0.32rem;
|
|
|
+ height: 0.32rem;
|
|
|
+ background: url(~@/assets/images/rtcLive/Input_norma@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ display: block;
|
|
|
+ margin-right: 0.1rem;
|
|
|
+ &.dis {
|
|
|
+ background: url(~@/assets/images/rtcLive/Input_disabled@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ span {
|
|
|
+ font-size: 0.266667rem;
|
|
|
+ }
|
|
|
+ // &::after {
|
|
|
+ // content: "";
|
|
|
+ // position: absolute;
|
|
|
+ // width: 0.04rem;
|
|
|
+ // height: 0.44rem;
|
|
|
+ // background: #ffffff;
|
|
|
+ // border-radius: 0.03rem;
|
|
|
+ // top: 50%;
|
|
|
+ // transform: translateY(-50%);
|
|
|
+ // right: -0.28rem;
|
|
|
+ // }
|
|
|
+ }
|
|
|
+ .contorl_btn {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ margin-left: 0.2rem;
|
|
|
+ > div {
|
|
|
+ // width: 0.56rem;
|
|
|
+ // height: 0.56rem;
|
|
|
+ width: 0.65rem;
|
|
|
+ height: 0.65rem;
|
|
|
+ // font-size: 0.56rem;
|
|
|
+ // background: #FD5151;
|
|
|
+ margin-right: 0.33rem;
|
|
|
+ // &.iconexit {
|
|
|
+ // // width: 0.56rem;
|
|
|
+ // // height: 0.56rem;
|
|
|
+ // color: #fd5151;
|
|
|
+ // // background: #fff;
|
|
|
+ // // border-radius: 50%;
|
|
|
+ // // overflow: hidden;
|
|
|
+ // }
|
|
|
+ &.brushesBack {
|
|
|
+ background: url(~@/assets/images/rtcLive/revocation@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.brushes {
|
|
|
+ // background: url(~@/assets/images/rtcLive/brushes@2x.png);
|
|
|
+ background: url(~@/assets/images/rtcLive/brushes@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.brushesed {
|
|
|
+ background: url(~@/assets/images/rtcLive/brushes_selected@2_1.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.invitation {
|
|
|
+ background: url(~@/assets/images/rtcLive/invitation@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.members {
|
|
|
+ background: url(~@/assets/images/rtcLive/members@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.mic_on {
|
|
|
+ background: url(~@/assets/images/rtcLive/mic_on@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.mic_no {
|
|
|
+ background: url(~@/assets/images/rtcLive/mic_off_50@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.mic_off {
|
|
|
+ background: url(~@/assets/images/rtcLive/mic_off@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.video_on {
|
|
|
+ background: url(~@/assets/images/rtcLive/video_on@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.video_no {
|
|
|
+ background: url(~@/assets/images/rtcLive/video_off_50@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.video_off {
|
|
|
+ background: url(~@/assets/images/rtcLive/video_off@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.exit {
|
|
|
+ background: url(~@/assets/images/rtcLive/exit@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &:last-child {
|
|
|
+ margin-right: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .layer {
|
|
|
+ width: 100vw;
|
|
|
+ height: 100vh;
|
|
|
+ background: rgba(0, 0, 0, 0.1);
|
|
|
+ z-index: 10000;
|
|
|
+
|
|
|
+ position: fixed;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ // right: unset;
|
|
|
+ // top: unset;
|
|
|
+ .inputBox {
|
|
|
+ width: 100vw;
|
|
|
+ height: 1.39rem;
|
|
|
+ // background: #f2f2f2;
|
|
|
+ border: 1px solid rgba(255, 255, 255, 0.1);
|
|
|
+ background: rgba(0, 0, 0, 0.5);
|
|
|
+
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ padding: 0 0.44rem;
|
|
|
+ box-sizing: border-box;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ .msgBox {
|
|
|
+ width: 9.53rem;
|
|
|
+ height: 0.94rem;
|
|
|
+ position: absolute;
|
|
|
+ > input {
|
|
|
+ width: 9.53rem;
|
|
|
+ height: 0.94rem;
|
|
|
+ background: rgba(0, 0, 0, 0.5);
|
|
|
+ border-radius: 0.56rem;
|
|
|
+ font-size: 0.42rem;
|
|
|
+ padding: 0 1.6rem 0 0.44rem;
|
|
|
+ box-sizing: border-box;
|
|
|
+ border: none;
|
|
|
+ outline: none;
|
|
|
+ color: #fff;
|
|
|
+ resize: none;
|
|
|
+ line &::placeholder {
|
|
|
+ color: rgba(255, 255, 255, 0.5);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .iconfont {
|
|
|
+ // width: 0.56rem;
|
|
|
+ // height: 0.56rem;
|
|
|
+ // background: #ed5d18;
|
|
|
+ font-size: 0.56rem;
|
|
|
+ position: absolute;
|
|
|
+ top: 50%;
|
|
|
+ transform: translateY(-50%);
|
|
|
+ right: 0.78rem;
|
|
|
+ color: #fff;
|
|
|
+ &.active {
|
|
|
+ color: #ed5d18;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .iconsend_icon {
|
|
|
+ position: absolute;
|
|
|
+ top: 50%;
|
|
|
+ transform: translateY(-50%);
|
|
|
+ // right: 0.78rem;
|
|
|
+ right: 0.106667rem;
|
|
|
+ width: 1.28rem;
|
|
|
+ height: 0.693333rem;
|
|
|
+ background: #ed5d18;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 0.32rem;
|
|
|
+ text-align: center;
|
|
|
+ line-height: 0.693333rem;
|
|
|
+ border-radius: 0.533333rem;
|
|
|
+ // width: 0.67rem;
|
|
|
+ // height: 0.67rem;
|
|
|
+ // background-image: url(~@/assets/images/rtcLive/send_selected@2x.png);
|
|
|
+ // background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .memberContent {
|
|
|
+ height: auto;
|
|
|
+ width: 100%;
|
|
|
+ // background: #ffffff;
|
|
|
+ border-radius: 0.28rem 0.28rem 0px 0px;
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ bottom: 0;
|
|
|
+ &.animated {
|
|
|
+ animation-duration: 0.3s;
|
|
|
+ }
|
|
|
+ .blurBox {
|
|
|
+ background: rgba(0, 0, 0, 0.9);
|
|
|
+ border-radius: 0.14rem 0.14rem 0px 0px;
|
|
|
+ filter: blur(1px);
|
|
|
+ position: absolute;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ z-index: 1;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ }
|
|
|
+ .content {
|
|
|
+ position: relative;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ z-index: 2;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ }
|
|
|
+ .memberHeader {
|
|
|
+ width: 100%;
|
|
|
+ height: 1.28rem;
|
|
|
+ text-align: center;
|
|
|
+ line-height: 1.28rem;
|
|
|
+ > span {
|
|
|
+ font-size: 0.42rem;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .memberList {
|
|
|
+ width: 100%;
|
|
|
+ height: 8.33rem;
|
|
|
+ border-top-style: solid;
|
|
|
+ border-top-color: rgba(0, 0, 0, 0.1);
|
|
|
+ border-top-width: 1px;
|
|
|
+ border-bottom-style: solid;
|
|
|
+ border-bottom-color: rgba(0, 0, 0, 0.1);
|
|
|
+ border-bottom-width: 1px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ overflow-y: auto;
|
|
|
+ &::-webkit-scrollbar {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ .memberItem {
|
|
|
+ width: 100%;
|
|
|
+ height: 1.39rem;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 0.19rem 0.44rem;
|
|
|
+
|
|
|
+ .userMsg {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+
|
|
|
+ .avatar {
|
|
|
+ width: 1rem;
|
|
|
+ height: 1rem;
|
|
|
+ border-radius: 50%;
|
|
|
+ // overflow: hidden;
|
|
|
+ margin-right: 0.28rem;
|
|
|
+ > img {
|
|
|
+ // width: 100%;
|
|
|
+ // height: 100%;
|
|
|
+ width: 1rem;
|
|
|
+ height: 1rem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .name {
|
|
|
+ font-size: 0.39rem;
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .button {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ > div {
|
|
|
+ // width: 0.56rem;
|
|
|
+ // height: 0.56rem;
|
|
|
+ // background: #fc6970;
|
|
|
+ font-size: 0.65rem;
|
|
|
+ color: #fff;
|
|
|
+ &.micBtn {
|
|
|
+ width: 0.65rem;
|
|
|
+ height: 0.65rem;
|
|
|
+ margin-right: 0.3rem;
|
|
|
+ &.mute_all_mic {
|
|
|
+ background-image: url(~@/assets/images/rtcLive/mic_all_on@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.open_all_mic {
|
|
|
+ background-image: url(~@/assets/images/rtcLive/mic_all_off@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.mute_one_mic_on {
|
|
|
+ background-image: url(~@/assets/images/rtcLive/mic_on@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.mute_one_mic_off {
|
|
|
+ background-image: url(~@/assets/images/rtcLive/mic_off@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.ban_speak_on {
|
|
|
+ background-image: url(~@/assets/images/rtcLive/chat_on@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ &.ban_speak_off {
|
|
|
+ background-image: url(~@/assets/images/rtcLive/chat_off@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ &.outBtn {
|
|
|
+ margin-right: 0.3rem;
|
|
|
+ width: 0.65rem;
|
|
|
+ height: 0.65rem;
|
|
|
+ &.icon_remove {
|
|
|
+ background-image: url(~@/assets/images/rtcLive/remove@2x.png);
|
|
|
+ background-size: 100% 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .memberBottom {
|
|
|
+ width: 100%;
|
|
|
+ padding: 0 0.44rem;
|
|
|
+ box-sizing: border-box;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ padding: 0.28rem 0;
|
|
|
+ box-sizing: border-box;
|
|
|
+ > div {
|
|
|
+ width: 4.61rem;
|
|
|
+ height: 1.11rem;
|
|
|
+ color: #ed5d18;
|
|
|
+ border-radius: 0.11rem;
|
|
|
+ border: 0.03rem solid #ed5d18;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ font-size: 0.39rem;
|
|
|
+ &.mute_all {
|
|
|
+ margin-right: 0.31rem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .chat__area-layoutBox {
|
|
|
+ display: block;
|
|
|
+ width: 100%;
|
|
|
+ height: auto;
|
|
|
+ position: fixed;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ right: unset;
|
|
|
+ top: unset;
|
|
|
+ background: #fff;
|
|
|
+ // padding-bottom: 0.821256rem;
|
|
|
+ .chat__area-layoutBox_bg {
|
|
|
+ width: 100vw;
|
|
|
+ height: 100vh;
|
|
|
+ position: fixed;
|
|
|
+ z-index: 1;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ }
|
|
|
+ .chat__area-l-content {
|
|
|
+ display: -webkit-box;
|
|
|
+ display: -ms-flexbox;
|
|
|
+ display: flex;
|
|
|
+ -webkit-box-orient: horizontal;
|
|
|
+ -webkit-box-direction: normal;
|
|
|
+ -ms-flex-direction: row;
|
|
|
+ flex-direction: row;
|
|
|
+ -webkit-box-align: center;
|
|
|
+ -ms-flex-align: center;
|
|
|
+ align-items: center;
|
|
|
+ -webkit-box-pack: center;
|
|
|
+ -ms-flex-pack: center;
|
|
|
+ justify-content: center;
|
|
|
+ min-height: 0.821256rem;
|
|
|
+ padding: 0.241546rem 0;
|
|
|
+ width: 100%;
|
|
|
+ position: relative;
|
|
|
+ z-index: 100;
|
|
|
+ textarea {
|
|
|
+ width: calc(100% - 0.96618rem);
|
|
|
+ -ms-flex-preferred-size: calc(100% - 0.96618rem);
|
|
|
+ flex-basis: calc(100% - 0.96618rem);
|
|
|
+ background: none;
|
|
|
+ border: none;
|
|
|
+ border-radius: 0;
|
|
|
+ color: #000;
|
|
|
+ font-size: 0.386473rem;
|
|
|
+ line-height: 0.483092rem;
|
|
|
+ padding: 0 0.241546rem;
|
|
|
+ resize: none;
|
|
|
+ -webkit-user-select: text;
|
|
|
+ caret-color: #ff4500;
|
|
|
+ overflow: hidden !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @keyframes myAnimation {
|
|
|
+ 0% {
|
|
|
+ background-position: 0px 0px;
|
|
|
+ background-size: 13.3344rem auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ 100.00% {
|
|
|
+ background-position: -13.1104rem 0px;
|
|
|
+ background-size: 13.3344rem auto;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|