Matebase是一个开源,易上手的BI工具,这里不做太多介绍了。

官网地址:https://www.metabase.com/

解决问题描述:

使用iframe内嵌Metabase公开链接之后,页面样式不美观:

1、Metabase默认有背景色,背景的高度不会因为开启了滚动条就适应高度。

2、如果不成为Metabase的付费用户,所使用的的公开连接左下角会有Powerd by Metabse。(违反Metabase开源约定)

解决方案描述:

此方案能够生效,前提是iframe里面的链接不能跨域,跨域将无法获取iframe内的元素高度。

1、在页面完成渲染之后,获取iframe内的元素高度,动态为iframe设置样式高度。

2、监听浏览器窗口的尺寸变化,动态更新iframe的高度设置(如果单纯变化宽度,此时iframe不会自动增高,没找到宽度跟高度的对应关系,有兴趣你可以自己研究一下)

3、监听左侧菜单导航栏的宽度变化:本项目中,左侧菜单导航栏可以收缩,最小宽度为54px,最大210px。需要根据实际进行调整

使用Matebase构建完成自己的仪表盘之后,点击分享并编辑按钮:

如果什么都不做呢,Matebase显示样式会很难看。如下图:

接下来介绍一下样式优化方案:

1、iframe样式设置如下:

<iframe
id="bdIframe"
ref="myIframe"
src="http://localhost/matebase/public/dashboard/6f47b37b-0f86-4dad-822d-d69440ffe5e2" frameborder="0"
style="width:100%;height: 100%;"
allowtransparency
scrolling="no" ></iframe>

2、iframe高度自适应:

let _this = null;

export default {
name: 'DashboardEditor',
data() {
},
created() {
_this = this;
},
mounted() {
_this = this;
this.adaptIframeHeight();
window.onresize = () => {
const oIframe = document.getElementById('bdIframe');
try {
let iDoc = oIframe.contentDocument || oIframe.document || oIframe.contentWindow;
let cHeight = Math.max(iDoc.body.clientHeight, iDoc.documentElement.clientHeight);
let sHeight = Math.max(iDoc.body.scrollHeight, iDoc.documentElement.scrollHeight);
console.info("cHeight=" + cHeight + ", sHeight=" + sHeight);
let height = Math.max(cHeight, sHeight);
oIframe.style.height = height + 'px';
// 隐藏 Power By MetaBase
// let footerDiv = iDoc.getElementsByClassName("EmbedFrame-footer");
// if (footerDiv[0] !== undefined) {
// footerDiv[0].style.display = 'none';
// }
} catch (e) {
console.error("窗口大小变化时,iframe高度自适应异常!" + e);
oIframe.style.height = '1000px';
}
};
try {
const erd = elementResizeDetectorMaker();
let sidebarWidth = null;
// 监听左侧导航栏的宽度变化
erd.listenTo(document.getElementsByClassName("sidebar-container"), (element) => {
sidebarWidth = element.offsetWidth;
_this.$nextTick(() => {
let addHeight = 210;
// 导航栏收缩最小的时候,加大iframe的高度
if (sidebarWidth === 54) {
const oIframe = _this.$refs.myIframe;
if (undefined !== oIframe) {
console.info(oIframe);
let oldHeight = oIframe.style.height;
if (undefined !== oldHeight && oldHeight !== '100%') {
oIframe.style.height = (Number(oldHeight.replace("px", ""))) + addHeight + 'px';
}
}
}
// 导航栏伸展到最大时,减少iframe的高度
if (sidebarWidth === 210) {
const oIframe = _this.$refs.myIframe;
if (undefined !== oIframe) {
console.info(oIframe);
let oldHeight = oIframe.style.height;
if (undefined !== oldHeight && oldHeight !== '100%') {
oIframe.style.height = (Number(oldHeight.replace("px", ""))) - addHeight + 'px';
}
}
}
})
})
} catch (e) {
console.error("监听左侧导航栏宽度变化异常!" + e);
}
},
methods: {
adaptIframeHeight() {
const oIframe = document.getElementById('bdIframe');
oIframe.onload = () => {
try { // iframe高度自适应
let iDoc = oIframe.contentDocument || oIframe.document || oIframe.contentWindow;
let cHeight = Math.max(iDoc.body.clientHeight, iDoc.documentElement.clientHeight);
let sHeight = Math.max(iDoc.body.scrollHeight, iDoc.documentElement.scrollHeight);
let height = Math.max(cHeight, sHeight);
oIframe.style.height = height + 'px';
// 隐藏 Power By MetaBase
// let footerDiv = iDoc.getElementsByClassName("EmbedFrame-footer");
// if (footerDiv[0] !== undefined) {
// footerDiv[0].style.display = 'none';
// }
} catch (e) {
console.error("iframe高度自适应异常!" + e);
oIframe.style.height = '1000px';
}
};
}
}
}

解决这个问题耗费了好久,所以记录一下。希望能帮到遇到类似问题的同学,加油~

MetaBase使用iframe内嵌到Vue页面样式优化的更多相关文章

  1. 如何根据iframe内嵌页面调整iframe高宽续篇

    接着昨天的工作 如何根据iframe内嵌页面调整iframe高宽 来说,按照文章中说的第二种方法实现代码如下: 实现 A.com/detail/view 页面的iframe代码如下: <ifra ...

  2. Python3.x:selenium获取iframe内嵌页面的源码

    Python3.x:selenium获取iframe内嵌页面的源码 前言 在一些网页中经常会看到ifrmae/frame标签,iframe是嵌入式框架一般用来在已有的页面中嵌入另一个页面,当一个元素在 ...

  3. 关于selenium自动化对iframe内嵌元素的处理

    今天上班闲来无聊,于是来练练自动化,结果碰上了可恶的iframe,楼主,以前也遇到过,但是一直也没搞懂怎么处理的,都是抄别人的代码,今天决定独立解决试试.首先先来认识什么是iframe,它就长下图这样 ...

  4. HTML+CSS教程(二)frameset框架和iframe内嵌

    一.框架 (frameset)1.用<frameset></frameset>代替了<body></body>2.rows设置行的占页面的百分比:col ...

  5. 在iframe内页触发顶层页面body的blur事件

    //在iframe内页触发顶层页面body的blur事件. if (window != top) { $(document.body).click(function () { $(top.docume ...

  6. 如何根据iframe内嵌页面调整iframe高宽

    问题来自于工作的实例,我的一个域名A的页面,有个iframe,它可能内嵌了另一个域名B的页面,也可能内嵌域名C的页面,但是呢,B和C的页面大小是不一样的,特别是高是不一样的高,那么我如何设置ifram ...

  7. iframe内嵌页面——跨域通讯

      <template> <div class="act-form"> <iframe :src="src" ref=" ...

  8. vue页面性能优化方案

    个人在项目中用到的页面性能优化的方式总结. 一.均衡页面加载文件的大小和数量 1.项目中小图片图片转base64,通过工具如webpack进行图片压缩,文件进行压缩混淆等 2.vue-router 懒 ...

  9. 弹出iframe内嵌页面元素到父页面并全屏化

    (注册博客好久了,一直没舍得添砖加瓦,主要是每次想写点东西的时候,随便搜一搜发现都比我总结的都要好,甚感尴尬,但是总是要开始的,所以这就是我的第一篇博客,也绝不会是最后一篇,废话不多说,直接入正题) ...

随机推荐

  1. 数据泵导入,报错:ORA-12899: value too large for column "SCOTT"."TEST112"."JOIN" (actual: 9, maximum: 8)

    1.报错: 数据泵执行导入时报错:ORA-12899: value too large for column "SCOTT"."TEST112"."J ...

  2. Java实现工厂模式

    工厂模式(Factory),当需要根据运行时的一些条件来决定创建具体对象时,就应该考虑使用工厂设计模式,将创建对象的任务交给工厂集中处理. 工厂模式有多种写法,总体分为简单工厂模式和抽象工厂模式 工厂 ...

  3. Qt 新手实战项目之手把手打造一个串口助手

    一前景 很多时候我们在学习一门新的语言,一直在学习各种语法和记住各种关键字,很容易产生枯燥的情绪,感觉学习这些玩意儿不知道用在什么地方,心里很是苦恼,这不,我在这记录下我学习Qt的第一个的小项目-串口 ...

  4. 9.4、安装zabbix(1)

    1.什么是zabbix: zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案: zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以 ...

  5. hdu 3117 Fibonacci Numbers 矩阵快速幂+公式

    斐波那契数列后四位可以用快速幂取模(模10000)算出.前四位要用公式推 HDU 3117 Fibonacci Numbers(矩阵快速幂+公式) f(n)=(((1+√5)/2)^n+((1-√5) ...

  6. 消息队列——kafka

    原文:再过半小时,你就能明白kafka的工作原理了 会出现什么情况呢? 1.为了这个女朋友,我请假回去拿(老板不批). 2.小哥一直在你楼下等(小哥还有其他的快递要送). 3.周末再送(显然等不及). ...

  7. WPF技巧:命中测试在视觉树中的使用

    我们有时候又需求从当前视觉树中找一些东西,比如鼠标按下的时候,看看鼠标下的元素都有什么.又比如某块区域下有哪些元素?某个坐标点下有哪些元素? 这些需求在使用 命中测试的时候,可以非常方便和快速的去找到 ...

  8. [NOI2000] 古城之谜

    题目描述 给定 n 和 n 个信息,每个信息包含一个词性 a (只有三种:名,动,辅)和对应的词 mot ,形为" \(a.mot\) ".(一次可能多词性) 最后给一个长度不大于 ...

  9. java集合(4)-Set集合

    Set集合,类似于一个罐子,程序可以把多个对象"丢进"Set集合,而Set集合通常不能记住每个元素的添加顺序.Set集合与Collection基本相同,没有提供任何额外的方法.实际 ...

  10. Kettle——简介

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定 Kettle 的主作者是 Matt ,他在 2003 年就开始了这个项目,在  ...