From 50ee7232f3c98fe24a1f2e31dba9508cfec14887 Mon Sep 17 00:00:00 2001 From: gjj <Ganjj@probim.com.cn> Date: Fri, 21 Feb 2025 17:35:39 +0800 Subject: [PATCH] 模型预览 --- src/components/Collapse.vue | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 154 insertions(+), 0 deletions(-) diff --git a/src/components/Collapse.vue b/src/components/Collapse.vue new file mode 100644 index 0000000..d67f576 --- /dev/null +++ b/src/components/Collapse.vue @@ -0,0 +1,154 @@ +<template> + <div class="inline-block outerWrapper" ref="outerWrapper" :style="outerWrapperStyle"> + <div class="relative collapseWrapper" ref="collapseWrapper"> + <slot ref="content"></slot> + <div class="absolute flex justify-center items-center cursor-pointer" :class="collapseBarClass" ref="bar" @click="toggleCollapsed"> + <img ref="triangleIcon" class="triangleIcon w-1.5 h-1.5" :class="triangleClass" src="../assets/images/triangle.png" alt="方向三角" /> + </div> + </div> + </div> +</template> + +<script> + const DirectionsMap = { + left: "cleft", + right: "cright", + top: "ctop", + bottom: "cbottom", + }; + export default { + name: "Collapse", + props: { + direction: { + type: String, + default: DirectionsMap.left, + validator(v) { + return Object.keys(DirectionsMap).includes(v); + }, + }, + bgc: { + type: String, + default: "#334CAF", + }, + }, + data() { + return { + isCollapsed: false, + width: "", + height: "", + }; + }, + computed: { + triangleClass() { + switch (this.direction) { + case "left": + return "rotate-0"; + case "right": + return "rotate-180"; + case "top": + return "rotate-90"; + case "bottom": + return "-rotate-90"; + default: + break; + } + return ""; + }, + collapseBarClass() { + switch (this.direction) { + case "left": + return "top-[50%] right-0 translate-x-full -translate-y-[50%] w-3 h-16 triangleLeftBg"; + case "right": + return "top-[50%] left-0 -translate-x-full -translate-y-[50%] w-3 h-16 triangleRightBg"; + case "top": + return "bottom-0 left-[50%] -translate-x-[50%] translate-y-full w-16 h-3"; + case "bottom": + return "top-0 left-[50%] -translate-x-[50%] -translate-y-full w-16 h-3"; + default: + break; + } + return ""; + }, + outerWrapperStyle() { + return { + width: this.width, + height: this.height, + }; + }, + }, + mounted() { + // console.log("Collapsed-mounted"); + this.setSizeInfo(); + }, + methods: { + setSizeInfo() { + const elm = this.$scopedSlots.default()[0].elm; + if (elm) { + const { width, height } = window.getComputedStyle(elm); + this.width = width; + this.height = height; + } + }, + toggleCollapsed() { + this.isCollapsed = !this.isCollapsed; + const outerWrapperClasslist = this.$refs.outerWrapper.classList; + if (this.isCollapsed) { + outerWrapperClasslist.add("collapsed"); + outerWrapperClasslist.add(this.direction); + this.$emit(`collapse${this.direction}`); + } else { + outerWrapperClasslist.remove("collapsed"); + outerWrapperClasslist.remove(this.direction); + this.$emit(`uncollapse${this.direction}`); + } + }, + }, + }; +</script> + +<style lang="scss" scoped> + .outerWrapper { + transition: all 0.3s linear; + .triangleLeftBg { + background-image: url("../assets/images/triangle-left.png"); + background-repeat: no-repeat; + background-size: cover; + background-position: center center; + } + .triangleRightBg { + background-image: url("../assets/images/triangle-right.png"); + background-repeat: no-repeat; + background-size: cover; + background-position: center center; + } + &.collapsed { + &.right { + // width: 0px !important; + transform: translate3d(100%, 0, 0); + .triangleIcon { + transform: rotate3d(0, 0, 1, 0deg); + } + } + &.left { + transform: translate3d(-100%, 0, 0); + .triangleIcon { + transform: rotate3d(0, 0, 1, 180deg); + } + } + &.bottom { + height: 0 !important; + bottom: 0 !important; + .triangleIcon { + transform: rotate3d(0, 0, 1, 90deg); + } + } + &.top { + height: 0 !important; + top: 0 !important; + .triangleIcon { + transform: rotate3d(0, 0, 1, 270deg); + } + } + } + } +</style> -- Gitblit v1.9.3