iframe加载或者切换时候,短暂的白屏频闪问题解决

问题描述

iframe加载或者是切换iframe链接的时候,会有短暂的白屏,这个时候是在加载,目前没有想到避免的问题,应该是浏览器层面的,所以解决方法之一就是,用页面的主题背景色来遮盖一下,当他加载的时候。

这个只是众多方法中的一种

解决

复制代码
<script setup>
import { ref ,watch} from 'vue'

// tab 配置列表
const tabs = [
  { label: '业务ss', url: 'http://localhost:5173' },
  { label: '状态ss', url: 'http://localhost:5173' },
  { label: 'fdfdfdf', url: 'http://localhost:5173/page15' },
  { label: 'fsdfdfdfd', url: 'http://localhost:5173/page_strategy' },
  { label: 'fsdf管理', url: 'http://localhost:5173' },
  { label: 'fdfdfdf总览', url: 'http://localhost:5173' }
]

const activeIndex = ref(0)

let expanded = true;

function toggleSide() {
  const side = document.getElementById('side');
  const content = document.getElementById('content');
  if (expanded) {
    side.style.width = '2vw'; // 收缩
    content.style.width = '97vw'
  } else {
    side.style.width = '11vw'; // 展开
    content.style.width = '87vw'
  }
  expanded = !expanded;
}

// 点击切换按钮的时候,先遮住,再切换iframe
function switchTab(index) {
  let iframeDom = document.getElementsByClassName('iframe-mask')[0]
  iframeDom.style.opacity = 1
  activeIndex.value = index
}

// 当iframe加载完成后,立马隐藏遮罩层,注意这里不要加动画给opacity 
function onIframeLoad() {
  let iframeDom = document.getElementsByClassName('iframe-mask')[0]
  iframeDom.style.opacity = 0
}



</script>

<template>
  <div>
    <div id="title"></div>
    <div id="middle">
      <div id="side" @click="toggleSide()">
        
      </div>
      <div id="content">
        <!-- 顶部导航栏 -->
        <div class="top-nav">
          <div
            v-for="(tab, index) in tabs"
            :key="index"
            class="tab"
            :class="{ active: activeIndex === index }"
            @click="switchTab(index)"
          >
            {{ tab.label }}
          </div>
        </div>

        <!-- iframe 区域 -->
        <div class="iframe-wrapper">
          <iframe
            class="iframe-area"
            :src="tabs[activeIndex].url"
            frameborder="0"
            @load="onIframeLoad"
          ></iframe>
          <div class="iframe-mask"></div>
        
        </div>
        
      </div>
    </div>
    <div id="bottom"></div>
  </div>
</template>

<style scoped lang="less">
#title {
  width: 100vw;
  height: 5.6vh;
  background-image: url(../public/images/title.jpg);
}
#middle {
  width: 100vw;
  height: 89vh;
  display: flex;
  

  #side {
    width: 11vw;
    height: 89vh;
    background-image: url(../public//images/side.png);
    background-repeat: no-repeat;
    transition: width 0.3s ease; /* 添加过渡动画 */
    overflow: hidden;
  }

  #content {
    width: 87vw;
    height: 87vh;
    margin-top: 0.8vh;
    margin-left: 0.6vw;
    //background-color: aquamarine;
    
    /* 顶部导航样式 */
    .top-nav {
      height: 3vh;
      display: flex;
      //background-color: #e8f6f4;
      border-bottom: 3px solid #4bb3a4;
      //padding: 6px;
    }

    .tab {
      padding: 1px 16px;
      margin-right: 6px;
      border: 1px solid #48a2a3;
      border-bottom: none;
      background-color: #fff;
      cursor: pointer;
      user-select: none;
      border-radius: 3px 3px 0 0;

      &:hover {
        background-color: #f0fcfb;
      }

      &.active {
        background-color: #5ecbb8;
        color: #fff;
        font-weight: bold;
      }
    }
    // 用到的部分
    .iframe-wrapper {
      position: relative;
      width: 100%;
      height: 84vh;
      background-color: red;

      /* iframe 内容区域 */
      .iframe-area {
        flex: 1;
        width: 100%;
        height: 84vh;
        border: none;
        background-color: #c1eeed;
      }

      .iframe-mask {
        width: 100%;
        height: 84vh;
        position: absolute;
        inset: 0;
        background: #c1eeed; // 遮罩颜色,可换为 loading 图
        z-index: 10;
        pointer-events: none; // 避免遮罩拦截点击
        // 初始先让他是遮住的,这样当第一次加载的时候,不会出现白屏,等加载完成后,再隐藏
        opacity: 1;
      }


    }
    

  }

}

#bottom {
  width: 100vw;
  height: 5vh;
  background-image: url(../public/images/bottom.jpg);
}
</style>

思路

主要就是当第一次打开页面第一次加载iframe的时候,默认有个遮罩层遮住了,当加载完成的时候,遮罩层立即隐藏,当切换链接的时候,切换前先遮住,然后切换,然后加载完成的时候,遮罩层立即隐藏。


关于其他应用的一些想法

electron 还有 tauri 这些,可以在外面再封装一层c++或者rust的gui,做一个黑色空白页面,打开之后显示的是c++或者rust的gui,当监听到浏览器或者webview加载完成后,立即隐藏,切换成浏览器或者webview的页面,这样应该可以解决打开应用的那一瞬间,由于网页还没有加载造成的白屏频闪现象。

相关推荐
一 乐5 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
C_心欲无痕6 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
清沫6 小时前
Claude Skills:Agent 能力扩展的新范式
前端·ai编程
yinuo7 小时前
前端跨页面通信终极指南:方案拆解、对比分析
前端
yinuo7 小时前
前端跨页面通讯终极指南⑨:IndexedDB 用法全解析
前端
xkxnq8 小时前
第二阶段:Vue 组件化开发(第 16天)
前端·javascript·vue.js
烛阴8 小时前
拒绝配置地狱!5 分钟搭建 Three.js + Parcel 完美开发环境
前端·webgl·three.js
Van_Moonlight8 小时前
RN for OpenHarmony 实战 TodoList 项目:空状态占位图
javascript·开源·harmonyos
xkxnq8 小时前
第一阶段:Vue 基础入门(第 15天)
前端·javascript·vue.js
anyup9 小时前
2026第一站:分享我在高德大赛现场学到的技术、产品与心得
前端·架构·harmonyos