Files
klp-oa/klp-ui/src/components/ChartWrapper/index.vue
2025-08-11 18:07:01 +08:00

207 lines
5.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="chart-wrapper" ref="chartWrapper">
<!-- 操作按钮组 -->
<div class="chart-actions">
<button
class="action-btn fullscreen-btn"
@click="toggleFullscreen"
title="全屏预览"
>
<i :class="isFullscreen? 'el-icon-close' : 'el-icon-full-screen'"></i>
</button>
</div>
<!-- 图表容器插槽内容 -->
<div class="chart-container" ref="chartContainer">
<slot></slot>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isFullscreen: false, // 是否处于全屏状态
fullscreenElement: null, // 存储全屏元素引用
};
},
mounted() {
// 监听浏览器全屏状态变化事件
document.addEventListener('fullscreenchange', this.handleFullscreenChange);
document.addEventListener('webkitfullscreenchange', this.handleFullscreenChange);
document.addEventListener('mozfullscreenchange', this.handleFullscreenChange);
document.addEventListener('msfullscreenchange', this.handleFullscreenChange);
},
methods: {
// 切换全屏/退出全屏
toggleFullscreen() {
if (!this.isFullscreen) {
this.enterFullscreen();
} else {
this.exitFullscreen();
}
},
// 进入全屏模式
enterFullscreen() {
const container = this.$refs.chartWrapper;
// 不同浏览器的全屏 API 兼容
if (container.requestFullscreen) {
container.requestFullscreen();
} else if (container.webkitRequestFullscreen) { /* Safari */
container.webkitRequestFullscreen();
} else if (container.msRequestFullscreen) { /* IE11 */
container.msRequestFullscreen();
} else if (container.mozRequestFullScreen) { /* Firefox */
container.mozRequestFullScreen();
}
this.fullscreenElement = container;
},
// 退出全屏模式
exitFullscreen() {
if (!document.fullscreenElement) return;
// 不同浏览器的退出全屏 API 兼容
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) { /* Safari */
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) { /* IE11 */
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) { /* Firefox */
document.mozCancelFullScreen();
}
this.fullscreenElement = null;
},
// 处理全屏状态变化
handleFullscreenChange() {
// 检查当前是否处于全屏状态
const isFull =!!(
document.fullscreenElement ||
document.webkitFullscreenElement ||
document.mozFullScreenElement ||
document.msFullscreenElement
);
this.isFullscreen = isFull;
// 触发窗口 resize 事件,让图表自适应
this.triggerResize();
},
// 触发窗口 resize 事件(让图表自适应)
triggerResize() {
const event = document.createEvent('Event');
event.initEvent('resize', true, true);
window.dispatchEvent(event);
}
},
beforeDestroy() {
// 移除事件监听
document.removeEventListener('fullscreenchange', this.handleFullscreenChange);
document.removeEventListener('webkitfullscreenchange', this.handleFullscreenChange);
document.removeEventListener('mozfullscreenchange', this.handleFullscreenChange);
document.removeEventListener('msfullscreenchange', this.handleFullscreenChange);
// 组件销毁时如果处于全屏状态则退出
if (this.isFullscreen) {
this.exitFullscreen();
}
}
};
</script>
<style scoped>
.chart-wrapper {
position: relative;
width: 100%;
height: 100%;
min-height: 100px; /* 最小高度防止内容为空时样式异常 */
}
/* 全屏状态下的样式调整 */
.chart-wrapper:-webkit-full-screen {
background-color: #fff;
width: 100%!important;
height: 100%!important;
}
.chart-wrapper:-moz-full-screen {
background-color: #fff;
width: 100%!important;
height: 100%!important;
}
.chart-wrapper:fullscreen {
background-color: #fff;
width: 100%!important;
height: 100%!important;
}
.chart-container {
width: 100%;
height: 100%;
min-height: inherit;
}
/* 操作按钮组样式 */
.chart-actions {
position: absolute;
top: 10px;
right: 10px;
z-index: 10; /* 确保按钮在图表上方 */
display: flex;
gap: 8px;
}
.action-btn {
width: 32px;
height: 32px;
border-radius: 4px;
border: none;
background-color: rgba(255, 255, 255, 0.8);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: all 0.2s ease;
}
.action-btn:hover {
background-color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
/* 图标样式(适配 Element UI 图标) */
.action-btn i {
font-size: 16px;
color: #666;
}
.action-btn:hover i {
color: #1890ff;
}
/* 全屏状态下的按钮样式优化 */
:fullscreen.chart-actions {
top: 20px;
right: 20px;
}
:-webkit-full-screen.chart-actions {
top: 20px;
right: 20px;
}
:-moz-full-screen.chart-actions {
top: 20px;
right: 20px;
}
</style>