先贴效果图:
<template>
<div>
<div class="aaa"></div>
<div class="btn-run" @click="tres">运行</div>
</div>
</template>
<script>
import { mapState } from 'vuex';
export default {
data() {
return {
}
},
components: {},
computed: {
...mapState([])
},
onLoad() {
},
onShow() {
},
methods: {
tres() {
let str = " <div class='container' style='width: 100px; height: 100px;background-color: aquamarine;'></div>"
var iframe = document.createElement('iframe');
iframe.setAttribute('style', 'width:600px;max-width:98%;max-height:600px;height:98vh;position:fixed;border:1px solid;outline:9999px solid rgba(0,0,0,.6);top:0;right:0;left:0;bottom:0;margin:auto;overflow:hidden;');
iframe.src = URL.createObjectURL(new Blob([str], { "type": "text/html" }));
document.querySelectorAll('.aaa')[0].appendChild(iframe)
}
},
}
</script>
<style lang="scss" scoped>
* {
padding: 0;
margin: 0;
border: none;
line-height: 1;
}
</style>
核心原理:
此效果实现的核心原理是:
- 创建
<iframe>
元素; - 将CSS,HTML字符串转换为
Blob
对象; - 使用
URL.createObjectURL()
方法将Blob
对象转换为URL对象并赋予我们创建的<iframe>
元素的src
属性;
使用JavaScript代码表示更加一目了然:
// 1. 创建<iframe>元素
var iframe = document.createElement('iframe');
// 2. 将CSS,HTML字符串转换为Blob对象
var blob = new Blob([htmlCode], {
'type': 'text/html'
});
// 3. 使用URL.createObjectURL()方法将...
iframe.src = URL.createObjectURL(blob);
需要注意的是,当我们使用 new Blob()
对我们的字符数据进行转换的时候,一定要指定type
为text/html
,否则,HTML代码会被自动转移为安全的纯文本显示在<iframe>
元素中。
学自于文章