|
@@ -4,11 +4,10 @@
|
|
|
* @Date:2024年10月14日10:03:11
|
|
|
-->
|
|
|
<template>
|
|
|
- <div class="globalTools" :class="isPlay ? 'isPlay' : ''">
|
|
|
+ <div class="globalTools" :class="[isPlay ? 'isPlay' : '', isHidden ? 'isHidden' : '']">
|
|
|
<div :class="['iconTools', toolOpen ? 'hideTools' : '']" ref="iconToolsDom">
|
|
|
<img @click="openTool" src="@/img/layout/icon-tool.png" />
|
|
|
</div>
|
|
|
-
|
|
|
<div :class="['expendTools', toolOpen ? 'showTools' : '']" ref="expendToolsDom">
|
|
|
<img @click="openType('note')" src="@/img/layout/icon-note.png" />
|
|
|
<img @click="openType('whiteboard')" class="iconWhiteboard" src="@/img/layout/icon-whiteboard.png" />
|
|
@@ -19,6 +18,7 @@
|
|
|
:close="
|
|
|
() => {
|
|
|
penShow = false
|
|
|
+ isHidden = false
|
|
|
}
|
|
|
"
|
|
|
v-model="penShow"
|
|
@@ -28,6 +28,7 @@
|
|
|
:close="
|
|
|
() => {
|
|
|
whitePenShow = false
|
|
|
+ isHidden = false
|
|
|
}
|
|
|
"
|
|
|
v-model="whitePenShow"
|
|
@@ -37,9 +38,17 @@
|
|
|
<script setup lang="ts">
|
|
|
import { baseSize, baseWidth, size } from "@/libs/rem"
|
|
|
import pen from "@/views/coursewarePlay/components/pen"
|
|
|
-import { toolOpen, whitePenShow, penShow, isPlay } from "./globalTools"
|
|
|
-import { onMounted, ref } from "vue"
|
|
|
+import { toolOpen, whitePenShow, penShow, isPlay, isHidden } from "./globalTools"
|
|
|
+import { onMounted, onUnmounted, ref, watch } from "vue"
|
|
|
+import { useRoute } from "vue-router"
|
|
|
|
|
|
+const route = useRoute()
|
|
|
+watch(
|
|
|
+ () => route.path,
|
|
|
+ () => {
|
|
|
+ handleStatus()
|
|
|
+ }
|
|
|
+)
|
|
|
const iconToolsDom = ref<HTMLDivElement>()
|
|
|
const expendToolsDom = ref<HTMLDivElement>()
|
|
|
|
|
@@ -49,15 +58,21 @@ function openTool() {
|
|
|
}
|
|
|
|
|
|
function openType(type: "note" | "whiteboard") {
|
|
|
- console.log(type, "type")
|
|
|
if (isLock) return
|
|
|
if (type === "note") {
|
|
|
penShow.value = true
|
|
|
+
|
|
|
+ isHidden.value = true
|
|
|
} else if (type === "whiteboard") {
|
|
|
whitePenShow.value = true
|
|
|
+ isHidden.value = true
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+function handleStatus() {
|
|
|
+ isHidden.value = route.path === "/login" ? true : false
|
|
|
+}
|
|
|
+
|
|
|
function computePos(type: "width" | "height", value: number | string) {
|
|
|
const clientNum = type == "width" ? baseWidth : document.documentElement.clientHeight
|
|
|
return typeof value === "string"
|
|
@@ -76,6 +91,7 @@ function computePos(type: "width" | "height", value: number | string) {
|
|
|
|
|
|
/* 拖拽还没有兼容rem */
|
|
|
let isLock = false
|
|
|
+let toolMoveY = 0 // 移动的距离
|
|
|
function drag(el: HTMLElement) {
|
|
|
function mousedown(e: MouseEvent) {
|
|
|
e.stopPropagation()
|
|
@@ -83,7 +99,7 @@ function drag(el: HTMLElement) {
|
|
|
isLock = false
|
|
|
const parentElement = el
|
|
|
const parentElementRect = parentElement.getBoundingClientRect()
|
|
|
- // const downX = e.clientX
|
|
|
+ const downX = e.clientX
|
|
|
const downY = e.clientY
|
|
|
// const clientWidth = document.documentElement.clientWidth
|
|
|
const clientHeight = document.documentElement.clientHeight
|
|
@@ -97,8 +113,17 @@ function drag(el: HTMLElement) {
|
|
|
// let moveY = e.clientY - downY
|
|
|
// moveX = moveX < minLeft ? minLeft : moveX > maxLeft ? maxLeft : moveX
|
|
|
moveY = moveY < minTop ? minTop : moveY > maxTop ? maxTop : moveY
|
|
|
+ toolMoveY = moveY
|
|
|
document.documentElement.style.setProperty("--toolTranslateY", `${moveY}px`)
|
|
|
- isLock = true
|
|
|
+
|
|
|
+ // 计算移动的距离
|
|
|
+ const cX = e.clientX - downX
|
|
|
+ const cY = e.clientY - downY
|
|
|
+
|
|
|
+ // 如果移动距离超过一定阈值,则认为是拖动
|
|
|
+ if (Math.abs(cX) > 3 || Math.abs(cY) > 3) {
|
|
|
+ isLock = true // 设置为拖动状态
|
|
|
+ }
|
|
|
}
|
|
|
function onMouseup() {
|
|
|
document.removeEventListener("mousemove", onMousemove)
|
|
@@ -116,7 +141,15 @@ function refreshPos() {
|
|
|
document.documentElement.style.setProperty("--toolTranslateY", `${posHeight.pos}px`)
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+let rect: any
|
|
|
+function onResize() {
|
|
|
+ rect = rect ? rect : iconToolsDom.value?.getBoundingClientRect()
|
|
|
+ const clientHeight = document.documentElement.clientHeight
|
|
|
+ const maxTop = clientHeight - rect.height
|
|
|
+ if (toolMoveY >= maxTop) {
|
|
|
+ document.documentElement.style.setProperty("--toolTranslateY", `${maxTop}px`)
|
|
|
+ }
|
|
|
+}
|
|
|
onMounted(() => {
|
|
|
drag(iconToolsDom.value!)
|
|
|
drag(expendToolsDom.value!)
|
|
@@ -125,6 +158,11 @@ onMounted(() => {
|
|
|
iconToolsDom.value!.onclick = (e: any) => {
|
|
|
e.stopPropagation()
|
|
|
}
|
|
|
+ window.addEventListener("resize", onResize)
|
|
|
+})
|
|
|
+
|
|
|
+onUnmounted(() => {
|
|
|
+ window.removeEventListener("resize", onResize)
|
|
|
})
|
|
|
</script>
|
|
|
|
|
@@ -136,6 +174,13 @@ onMounted(() => {
|
|
|
opacity: $opacity-disabled;
|
|
|
}
|
|
|
}
|
|
|
+ &.isHidden {
|
|
|
+ .iconTools,
|
|
|
+ .expendTools {
|
|
|
+ opacity: 0;
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
.iconTools,
|
|
|
.expendTools {
|
|
|
position: fixed;
|
|
@@ -144,16 +189,19 @@ onMounted(() => {
|
|
|
transform: translateY(var(--toolTranslateY));
|
|
|
// margin-top: -29px;
|
|
|
z-index: 2999;
|
|
|
- padding: 8px 14px 8px 16px;
|
|
|
+ padding: 0 5px;
|
|
|
background: rgba(0, 0, 0, 0.4);
|
|
|
border-radius: 200px 0px 0px 200px;
|
|
|
border: 2px solid rgba(255, 255, 255, 0.3);
|
|
|
border-right-width: 0;
|
|
|
cursor: pointer;
|
|
|
+ font-size: 0;
|
|
|
// transition: transform 0.2s ease;
|
|
|
img {
|
|
|
- width: 34px;
|
|
|
- height: 34px;
|
|
|
+ padding: 8px 15px;
|
|
|
+ width: 36px;
|
|
|
+ height: 36px;
|
|
|
+ box-sizing: content-box;
|
|
|
-moz-user-select: none;
|
|
|
/* 火狐浏览器 */
|
|
|
-webkit-user-drag: none;
|
|
@@ -166,6 +214,10 @@ onMounted(() => {
|
|
|
/* 通用 */
|
|
|
-webkit-touch-callout: none;
|
|
|
/* iOS Safari */
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ opacity: $opacity-hover;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -180,9 +232,10 @@ onMounted(() => {
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
.iconWhiteboard {
|
|
|
- margin: 0 30px;
|
|
|
+ // margin: 0 30px;
|
|
|
}
|
|
|
.iconArrow {
|
|
|
+ padding: 12px 15px;
|
|
|
width: 28px;
|
|
|
height: 28px;
|
|
|
}
|