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的页面,这样应该可以解决打开应用的那一瞬间,由于网页还没有加载造成的白屏频闪现象。

相关推荐
Micro麦可乐1 小时前
前端图片裁剪上传全流程详解:从预览到上传的完整流程
前端·javascript·图片上传·图片裁切·cropper.js
Am1nnn1 小时前
CICD编译时遇到npm error code EINTEGRITY的问题
前端·npm·node.js
测试工程喵3 小时前
如何测试JWT的安全性:全面防御JSON Web Token的安全漏洞
前端·网络·功能测试·安全·json·接口测试·token
Python私教4 小时前
PrimeVue菜单组件深度解析:构建高效能的Web导航系统
前端·javascript·vue.js
iamtsfw5 小时前
记录:express router,可以让node.js后端文件里的路由分布的更清晰
前端·node.js
黑匣子~5 小时前
Vue 3 官方 Hooks 的用法与实现原理
前端·javascript·vue.js
Yvonne爱编码6 小时前
CSS-5.1 Transition 过渡
前端·css·状态模式·html5·hbuilder
恰恰兄6 小时前
webpack性能优化
前端·webpack·node.js
23级二本计科6 小时前
对Web界面进行简单自动化测试Selenium
前端·数据库
看到我,请让我去学习7 小时前
LInux—shell编程
android·linux·chrome