fix: 左树右表动画问题

This commit is contained in:
秋帆
2025-01-13 20:50:39 +08:00
parent 046f1f7492
commit 28ac501f4a

View File

@@ -1,33 +1,27 @@
<template> <template>
<div <div ref="rootRef" class="ca-split-panel" :class="{
ref="rootRef"
class="ca-split-panel"
:class="{
'is-vertical': vertical, 'is-vertical': vertical,
'is-resizing': resizing, 'is-resizing': resizing,
'is-collapse': isCollapse, 'is-collapse': isCollapse,
'is-responsive': isResponsive, 'is-responsive': isResponsive,
'is-mobile': isMobile, 'is-mobile': isMobile,
}" }" :style="customStyle">
:style="customStyle"
>
<div class="container" :style="sideStyle"> <div class="container" :style="sideStyle">
<div ref="sideRef" class="ca-split-panel__side" :class="{ clead_padding: isCollapse }"> <div ref="sideRef" class="ca-split-panel__side">
<div class="ca-split-panel__content"> <div class="ca-split-panel__content">
<slot name="left"></slot> <slot name="left"></slot>
</div> </div>
</div> </div>
<!-- 竖线和按钮 --> <!-- 竖线和按钮 -->
<div class="divider-container"> <div class="divider-container">
<div class="divider" v-show="!isCollapse"></div> <div v-show="!isCollapse" class="divider"></div>
<div v-if="allowCollapse" class="ca-split-panel__collapse-trigger" :class="{ <div v-if="allowCollapse" class="ca-split-panel__collapse-trigger" :class="{
'is-collapse': isCollapse, 'is-collapse': isCollapse,
'is-mobile': isMobile, 'is-mobile': isMobile,
}" :style="!isMobile ? collapseTriggerStyle : undefined" @click="toggleCollapse"> }" @click="toggleCollapse">
<div class="ca-split-panel__collapse-trigger-icon" style=""> <div class="ca-split-panel__collapse-trigger-icon">
<icon-right size="20" v-if="isCollapse" /> <IconRight v-if="isCollapse" size="20" />
<icon-left v-else size="20" /> <IconLeft v-else size="20" />
</div> </div>
</div> </div>
</div> </div>
@@ -123,7 +117,7 @@ const sideStyle = computed((): CSSProperties => ({
* 计算主内容区域样式 * 计算主内容区域样式
*/ */
const mainStyle = computed(() => ({ const mainStyle = computed(() => ({
transition: 'padding-left 0.5s ease', transition: 'padding 0.5s ease',
flex: 1, flex: 1,
})) }))
@@ -136,32 +130,6 @@ const isResponsive = computed(() => {
return window.innerWidth < 768 return window.innerWidth < 768
}) })
/**
* 计算折叠触发器的样式
*/
const collapseTriggerStyle = computed(() => {
if (isMobile.value) {
return {}
}
const baseSize = resizedSize.value || normalizedSize.value
const buttonOffset = '16px' // 按钮偏移量
if (props.reverse) {
return {
right: isCollapse.value
? `-${buttonOffset}`
: `calc(${baseSize} - ${buttonOffset})`,
}
}
return {
left: isCollapse.value
? `-${buttonOffset}`
: `calc(${baseSize} - ${buttonOffset})`,
}
})
/** /**
* 切换折叠状态 * 切换折叠状态
* 触发 update:collapse 事件通知父组件 * 触发 update:collapse 事件通知父组件
@@ -203,10 +171,12 @@ onUnmounted(() => {
height: 100%; height: 100%;
position: relative; position: relative;
background: var(--color-bg-2); background: var(--color-bg-2);
.container{
.container {
display: flex; display: flex;
height: 100%; height: 100%;
} }
.divider-container { .divider-container {
position: relative; position: relative;
@@ -221,12 +191,10 @@ onUnmounted(() => {
} }
} }
// 布局变体
&.is-vertical { &.is-vertical {
flex-direction: column; flex-direction: column;
} }
// 基础组件
&__side { &__side {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@@ -235,6 +203,9 @@ onUnmounted(() => {
background: var(--color-bg-1); background: var(--color-bg-1);
overflow: hidden; overflow: hidden;
transition: transform 0.5s ease, width 0.5s ease; transition: transform 0.5s ease, width 0.5s ease;
}
&__content {
padding: $padding; padding: $padding;
} }
@@ -244,10 +215,10 @@ onUnmounted(() => {
overflow: hidden; overflow: hidden;
:deep(.arco-table-border .arco-table-container) { :deep(.arco-table-border .arco-table-container) {
/* border-left: none;*/
border: none; border: none;
} }
} }
&__main { &__main {
flex: 1; flex: 1;
display: flex; display: flex;
@@ -259,15 +230,11 @@ onUnmounted(() => {
} }
.ca-split-panel__collapse-trigger-icon { .ca-split-panel__collapse-trigger-icon {
// padding: 2px;
border-radius: 50%; border-radius: 50%;
// position: relative;
z-index: 2; z-index: 2;
width: 100%; width: 100%;
height: 100%; height: 100%;
box-shadow: 0px 0px 0px 1px var(--color-border-1); box-shadow: 0px 0px 0px 1px var(--color-border-1);
// left: 0;
// transform: translate(-50%, -50%);
background-color: var(--color-bg-1); background-color: var(--color-bg-1);
display: flex; display: flex;
justify-content: center; justify-content: center;
@@ -279,7 +246,6 @@ onUnmounted(() => {
} }
} }
// 折叠触发器
&__collapse-trigger { &__collapse-trigger {
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
@@ -289,12 +255,11 @@ onUnmounted(() => {
justify-content: center; justify-content: center;
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50% !important; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
z-index: 3; z-index: 3;
} }
// 折叠状态
&.is-collapse { &.is-collapse {
.ca-split-panel__side { .ca-split-panel__side {
width: 0; width: 0;
@@ -305,14 +270,12 @@ onUnmounted(() => {
} }
} }
// 移动端样式
&.is-mobile { &.is-mobile {
.ca-split-panel__side { .ca-split-panel__side {
height: 100%; height: 100%;
width: 100%; width: 100%;
background: var(--color-bg-1); background: var(--color-bg-1);
z-index: 2; z-index: 2;
padding: 0;
} }
.divider { .divider {
@@ -325,10 +288,6 @@ onUnmounted(() => {
z-index: 12; z-index: 12;
transform: translateX(-100%); transform: translateX(-100%);
&::before {
display: none;
}
&.is-collapse { &.is-collapse {
left: 10px; left: 10px;
right: auto; right: auto;
@@ -340,18 +299,16 @@ onUnmounted(() => {
} }
} }
// 表格固定列适配
:deep(.arco-table-col-fixed-left), :deep(.arco-table-col-fixed-left),
:deep(.arco-table-col-fixed-right) { :deep(.arco-table-col-fixed-right) {
position: sticky; // 默认状态 position: sticky;
z-index: 10; z-index: 10;
} }
// 移动端表格固定列适配
&.is-mobile { &.is-mobile {
:deep(.arco-table-col-fixed-left), :deep(.arco-table-col-fixed-left),
:deep(.arco-table-col-fixed-right) { :deep(.arco-table-col-fixed-right) {
position: static; // 移动端状态 position: static;
} }
} }
} }