使用position解决layui的iframe宽高自适应的问题

绝对定位创建tab的解决方式

生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。

原理:利用绝对定位及宽高百分比样式具体可参看关于定位后对宽高的影响

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
       .layui-tab-content {
		    padding: 0;/*layui-tab-content:默认有padding: 10px;的值,因为iframe的绝对定位脱离文档流,所以会存在20px的空白空间*/
		}
		.show-frame {
		    top: 50px!important;
		    /*默认.layui-layout-admin .layui-body {
			    top: 60px;
			    bottom: 44px;
			}*/
		    overflow: hidden;/*消除浏览器最右边的滚动条*/
		}
		.frame {
		    position: absolute;
		    padding: 10px;/*与layui-footer隔开一段距离*/
		    width: 100%;
		    height: 100%;
		}
    </style>
</head>

<body class="layui-layout-body">
    <div class="layui-layout layui-layout-admin">
        <div class="layui-header"></div>
        <div class="layui-body show-frame">
            <div lay-filter="demo" class="layui-tab layui-tab-card" lay-allowClose="true">
                <ul class="layui-tab-title">
                    <li class="layui-this">欢迎</li>
                </ul>
                <div class="layui-tab-content">
                    <div class="layui-tab-item layui-show ">
                        <iframe class='frame' frameborder="no" scrolling="no" src="welcome.html"></iframe>
                    </div>
                </div>
            </div>
        </div>
        <div class="layui-footer"></div>
    </div>
</body>
</body>
<script src="../layui.js"></script>
<script>
	1. 引用layui模块
	2. tab添加事件
	3. tab切换事件
<script>
</html>

layui-body默认是绝对定位,上例中没有对layui-body设置宽高的百分比。所以设置了iframe的宽高百分比(如果在layui-body中设置宽高百分比,iframe中就可以不用设置了)。

相对定位没有创建tab的解决方式

html需要的结构

<div class="parent">
	<iframe class='son' frameborder="no" scrolling="no" src="#"></iframe> 
</div>

css样式

.parent {
	position: relative;
	height: 100%;/*高度一定要有,以让包含的iframe标签高度自适应。可以在parent外再包裹一个带高度的div,比如:<div class="layui-body">,layui-body在layui中有默认的高度的值*/
}
.son {
	position: absolute;
	top: 0;
	bottom: 0;
	margin: auto;
	height: 100%;
	width: 100%;
}

样例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .parent {
            position: relative;
        }
        .son {
            position: absolute;
            top: 0;
            bottom: 0;
            margin: auto;
        }
    </style>
</head>

<body class="layui-layout-body">
    <div class="layui-layout layui-layout-admin">
        <div class="layui-header"></div>
        <div class="layui-body">
            <div class="parent">
            </div>
        </div>
        <div class="layui-footer"></div>
    </div>
</body>
</body>
<script src="../layui.js"></script>
<script>
	$("选择器").find("选择器").click(function() {
		$(".parent").html('<iframe class="son" frameborder="no" scrolling="no" src="你的链接"></iframe>');
    }
<script>
</html>
### 动态调整 iframe 高度以实现自适应布局 在 Vue 中实现 iframe高度自适应可以通过多种方式完成。以下是几种常见的方法及其具体实现: #### 方法一:通过监听父容器的变化来动态更新 iframe 高度 这种方法利用了 CSS 和 JavaScript 结合的方式,使 iframe 能够根据其父级容器的高度变化而自动调整自身的高度。 ```javascript <template> <div ref="parentContainer" style="position: relative; height: 100%;"> <iframe :src="url" frameborder="0" ref="myIframe"></iframe> </div> </template> <script> export default { data() { return { url: 'https://example.com' }; }, mounted() { window.addEventListener('resize', this.adjustIframeHeight); this.$nextTick(() => { this.adjustIframeHeight(); }); }, beforeDestroy() { window.removeEventListener('resize', this.adjustIframeHeight); }, methods: { adjustIframeHeight() { const parentHeight = this.$refs.parentContainer.offsetHeight; if (this.$refs.myIframe) { this.$refs.myIframe.style.height = `${parentHeight}px`; } } } }; </script> ``` 此方法的核心在于使用 `offsetHeight` 获取父容器的实际高度并将其赋值给 iframe[^1]。 --- #### 方法二:基于 Dialog 对话框场景下的延迟加载策略 当需要在全屏对话框中显示 iframe 并使其高度自适应时,可以采用延时机制,在 DOM 渲染完成后获取 iframe 的尺寸信息。 ```javascript <template> <el-dialog v-model="dialogVisible" title="示例"> <iframe ref="dialogIframe" src="https://example.com" frameborder="0" width="100%"></iframe> </el-dialog> </template> <script> export default { data() { return { dialogVisible: false, }; }, watch: { dialogVisible(newVal) { if (newVal === true) { setTimeout(() => { this.resizeDialogIframe(); }, 1000); // 延迟一秒等待渲染完成 } } }, methods: { resizeDialogIframe() { const iframeElement = this.$refs.dialogIframe; if (!iframeElement) return; const windowHeight = window.innerHeight || document.documentElement.clientHeight; iframeElement.style.height = `${windowHeight - 100}px`; // 减去一些额外空间 } } }; </script> ``` 上述代码展示了如何在打开对话框后通过延时操作确保 iframe 正确适配屏幕高度[^2]。 --- #### 方法三:直接绑定 iframe属性并通过事件触发重新计算 对于简单的页面结构,可以直接绑定 iframe宽度高度,并通过事件监听器动态修改这些属性。 ```html <template> <div> <iframe :src="url" frameborder="0" @load="onIFrameLoad" ref="dynamicIframe" width="100%" height="auto" ></iframe> </div> </template> <script> export default { data() { return { url: 'https://example.com', }; }, methods: { onIFrameLoad() { const iframeDoc = this.$refs.dynamicIframe.contentDocument || this.$refs.dynamicIframe.contentWindow.document; const bodyHeight = iframeDoc.body.scrollHeight || iframeDoc.documentElement.scrollHeight; if (bodyHeight && this.$refs.dynamicIframe) { this.$refs.dynamicIframe.style.height = `${bodyHeight}px`; } } } }; </script> ``` 这种方式适用于能够访问子文档的情况(即不存在跨域限制),它会读取 iframe 子文档的内容高度并应用到 iframe 上[^3]。 --- ### 总结 以上三种方案分别针对不同的应用场景提供了灵活的解决办法。如果项目中有复杂的父子组件交互或者特定需求,则可以根据实际情况选择最合适的实现路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值