解决布局跳动问题

This commit is contained in:
zhcnyuyang 2025-08-21 18:26:35 +08:00
parent 74d299a8c3
commit 5c2a9ab91b
7 changed files with 190 additions and 30 deletions

View File

@ -8,6 +8,7 @@
import { TosClient } from '@volcengine/tos-sdk'; import { TosClient } from '@volcengine/tos-sdk';
import * as fs from 'fs'; import * as fs from 'fs';
import * as path from 'path'; import * as path from 'path';
import { fileURLToPath } from 'url';
// 配置信息 // 配置信息
@ -114,11 +115,10 @@ async function uploadDirectory(dirPath: string): Promise<void> {
// 主函数 // 主函数
async function main() { async function main() {
// 使用 import.meta.url 替代 __dirname (ES 模块兼容) // ES 模块中获取当前文件目录的正确方式
const currentFileUrl = import.meta.url; const __filename = fileURLToPath(import.meta.url);
const currentFilePath = new URL(currentFileUrl).pathname; const __dirname = path.dirname(__filename);
const currentDir = path.dirname(currentFilePath); const assetsDir = path.resolve(__dirname, '../dist/assets');
const assetsDir = path.resolve(currentDir, '../dist/assets');
console.log(`开始上传目录: ${assetsDir}`); console.log(`开始上传目录: ${assetsDir}`);
await uploadDirectory(assetsDir); await uploadDirectory(assetsDir);
} }
@ -128,4 +128,3 @@ main().catch(error => {
console.error('程序执行失败:', error); console.error('程序执行失败:', error);
process.exit(1); process.exit(1);
}); });

View File

@ -142,7 +142,51 @@ const { breakpoint } = useBootstrapBreakpoint();
<script> <script>
export default { export default {
name: "Aboutus" name: "Aboutus",
mounted() {
this.$nextTick(function() {
this.handleMediaLoad();
});
},
methods: {
handleMediaLoad: function() {
const container = document.getElementById('aboutusbanner');
if (container) {
//
const video = document.getElementById('abtbannervideo');
if (video) {
const handleVideoReady = () => {
container.classList.add('video-loaded');
video.removeEventListener('loadedmetadata', handleVideoReady);
video.removeEventListener('canplay', handleVideoReady);
};
video.addEventListener('loadedmetadata', handleVideoReady);
video.addEventListener('canplay', handleVideoReady);
if (video.videoWidth > 0) {
handleVideoReady();
}
}
// GIF
const img = document.querySelector('#aboutusbanner .videoimg');
if (img) {
const handleImageReady = () => {
container.classList.add('video-loaded');
img.removeEventListener('load', handleImageReady);
};
img.addEventListener('load', handleImageReady);
if (img.complete && img.naturalWidth > 0) {
handleImageReady();
}
}
}
}
}
} }
</script> </script>

View File

@ -11,9 +11,6 @@ const { breakpoint } = useBootstrapBreakpoint();
<template> <template>
<div class="pageroot" id="examplesprocessroot"> <div class="pageroot" id="examplesprocessroot">
<div id="examplebanner" class="videorootbanner"> <div id="examplebanner" class="videorootbanner">
<!-- <img v-if="$isMobile.android.phone||$isMobile.android.tablet"-->
<!-- src="/ExpVideoPreload.png"-->
<!-- class="videoimg"/>-->
<video v-if="breakpoint==='xs'||breakpoint==='sm'||breakpoint==='md'" <video v-if="breakpoint==='xs'||breakpoint==='sm'||breakpoint==='md'"
controls="" controls=""
id="expbannervideo" id="expbannervideo"
@ -23,7 +20,6 @@ const { breakpoint } = useBootstrapBreakpoint();
<source :src="ExpVideo" type="video/mp4"></source> <source :src="ExpVideo" type="video/mp4"></source>
</video> </video>
<video v-else <video v-else
:poster="ExpVideoPreload"
id="expbannervideo" id="expbannervideo"
muted autoplay="autoplay" muted autoplay="autoplay"
loop="loop" playsinline webkit-playsinline loop="loop" playsinline webkit-playsinline
@ -52,7 +48,36 @@ const { breakpoint } = useBootstrapBreakpoint();
<script> <script>
import axios from 'axios'; import axios from 'axios';
export default { export default {
name: "Examples" name: "Examples",
mounted() {
this.$nextTick(function() {
this.handleVideoLoad();
});
},
methods: {
handleVideoLoad: function() {
const video = document.getElementById('expbannervideo');
const container = document.getElementById('examplebanner');
if (video && container) {
// 使loadedmetadata
const handleVideoReady = () => {
container.classList.add('video-loaded');
//
video.removeEventListener('loadedmetadata', handleVideoReady);
video.removeEventListener('canplay', handleVideoReady);
};
video.addEventListener('loadedmetadata', handleVideoReady);
video.addEventListener('canplay', handleVideoReady);
//
if (video.videoWidth > 0) {
handleVideoReady();
}
}
}
}
} }
</script> </script>

View File

@ -19,18 +19,14 @@ const { breakpoint } = useBootstrapBreakpoint();
<template> <template>
<div id="homepageroot" class="pageroot"> <div id="homepageroot" class="pageroot">
<div id="homepagebanner" class="videorootbanner"> <div id="homepagebanner" class="videorootbanner">
<!-- <img v-if="$isMobile.android.phone||$isMobile.android.tablet"-->
<!-- src="/bannervideopreload.png"-->
<!-- class="videoimg"/>-->
<video v-if="breakpoint==='xs'||breakpoint==='sm'||breakpoint==='md'" <video v-if="breakpoint==='xs'||breakpoint==='sm'||breakpoint==='md'"
:poster="bannervideopreload" controls=""
id="bannervideo" muted autoplay="autoplay" loop="loop" id="bannervideo" muted autoplay="autoplay" loop="loop"
playsinline webkit-playsinline playsinline webkit-playsinline
class="bannervideos" class="bannervideos"
x5-video-player-type="h5-page"> x5-video-player-type="h5-page">
<source :src="HpgVideo" type="video/mp4"></source> <source :src="HpgVideo" type="video/mp4"></source>
</video> </video>
<video v-else :poster="bannervideopreload" <video v-else
id="bannervideo" muted autoplay="autoplay" loop="loop" id="bannervideo" muted autoplay="autoplay" loop="loop"
playsinline webkit-playsinline playsinline webkit-playsinline
class="bannervideos" class="bannervideos"
@ -179,6 +175,7 @@ export default {
mounted() { mounted() {
this.$nextTick(function() { this.$nextTick(function() {
this.video_autoplay(); this.video_autoplay();
this.handleVideoLoad();
}); });
}, },
methods:{ methods:{
@ -190,6 +187,28 @@ export default {
video.play(); video.play();
} }
}); });
},
handleVideoLoad: function() {
const video = document.getElementById('bannervideo');
const container = document.getElementById('homepagebanner');
if (video && container) {
// 使loadedmetadata
const handleVideoReady = () => {
container.classList.add('video-loaded');
//
video.removeEventListener('loadedmetadata', handleVideoReady);
video.removeEventListener('canplay', handleVideoReady);
};
video.addEventListener('loadedmetadata', handleVideoReady);
video.addEventListener('canplay', handleVideoReady);
//
if (video.videoWidth > 0) {
handleVideoReady();
}
}
} }
} }
} }

View File

@ -10,7 +10,7 @@ const { breakpoint } = useBootstrapBreakpoint();
<template> <template>
<div class="pageroot" id="serviceprocessroot"> <div class="pageroot" id="serviceprocessroot">
<div id="serviceprocessbanner" class="videorootbanner"> <div id="serviceprocessbanner">
<img class="videoimg" :src="Newbanner"/> <img class="videoimg" :src="Newbanner"/>
<div id="expbanner" class="bannerovervideo"> <div id="expbanner" class="bannerovervideo">
<div class="bannercontent"> <div class="bannercontent">
@ -96,7 +96,34 @@ const { breakpoint } = useBootstrapBreakpoint();
<script> <script>
export default { export default {
name: "ServiceProcess" name: "ServiceProcess",
mounted() {
this.$nextTick(function() {
this.handleImageLoad();
});
},
methods: {
handleImageLoad: function() {
const img = document.querySelector('#serviceprocessbanner .videoimg');
const container = document.getElementById('serviceprocessbanner');
if (img && container) {
//
const handleImageReady = () => {
container.classList.add('video-loaded');
//
img.removeEventListener('load', handleImageReady);
};
img.addEventListener('load', handleImageReady);
//
if (img.complete && img.naturalWidth > 0) {
handleImageReady();
}
}
}
}
} }
</script> </script>
@ -104,9 +131,18 @@ export default {
@import "src/publicstyle.scss"; @import "src/publicstyle.scss";
#serviceprocessbanner{ #serviceprocessbanner{
width: 100% !important;
background-color: black !important;
position: relative !important;
z-index: 0 !important;
overflow: hidden !important;
@include media-breakpoint-between(xs, md) { @include media-breakpoint-between(xs, md) {
aspect-ratio: 1.92; aspect-ratio: 1.92;
} }
@include media-breakpoint-up(md){
aspect-ratio: 2.62026969;
}
} }
#blackchart{ #blackchart{

View File

@ -35,12 +35,43 @@
} }
.videorootbanner{ .videorootbanner{
width: 100%; width: 100% !important;
height: auto; background-color: black !important;
background-color: black; position: relative !important;
position: relative; z-index: 0 !important;
z-index: 0; // 明确设置父容器z-index overflow: hidden !important;
overflow: hidden; // 帮助创建新的堆叠上下文
// 始终保持固定的aspect-ratio作为占位确保立即渲染
@include media-breakpoint-between(xs, md) {
aspect-ratio: 1.92 !important;
}
@include media-breakpoint-up(md){
aspect-ratio: 2.62026969 !important;
}
// 视频/图片元素的默认样式
video, .videoimg {
position: absolute !important;
top: 0 !important;
left: 0 !important;
width: 100% !important;
height: 100% !important;
object-fit: cover !important;
display: block !important;
}
// 当媒体加载完成后重新调整容器和媒体尺寸
&.video-loaded {
aspect-ratio: unset !important; // 移除固定比例
height: auto !important; // 高度自适应
video, .videoimg {
position: static !important; // 改为文档流布局
width: 100% !important; // 宽度占满
height: auto !important; // 高度自适应
object-fit: contain !important; // 保持媒体比例完整显示
}
}
} }
.bannervideos{ .bannervideos{

View File

@ -4,7 +4,8 @@ import { fileURLToPath, URL } from 'node:url'
import fs from 'fs' import fs from 'fs'
export default defineConfig({ export default defineConfig({
base: process.env.NODE_ENV === 'production' ? 'https://cdn.kdesign.top/' : '/', // base: process.env.NODE_ENV === 'production' ? 'https://cdn.kdesign.top/' : '/',
base: '/',
plugins: [ plugins: [
vue(), vue(),
// 添加自定义中间件来处理根路径 // 添加自定义中间件来处理根路径
@ -37,6 +38,11 @@ export default defineConfig({
input: { input: {
main: fileURLToPath(new URL('./index.html', import.meta.url)), main: fileURLToPath(new URL('./index.html', import.meta.url)),
start: fileURLToPath(new URL('./start.html', import.meta.url)) start: fileURLToPath(new URL('./start.html', import.meta.url))
},
output: {
chunkFileNames: 'assets/[name]-[hash].js',
entryFileNames: 'assets/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash].[ext]'
} }
} }
}, },