可调整大小的响应式切换 iframe

Posted

技术标签:

【中文标题】可调整大小的响应式切换 iframe【英文标题】:Resizable responsive toggle iframes 【发布时间】:2021-07-14 15:19:47 【问题描述】:

我需要一个带有 2 个 IFRAME 的布局,可以通过 javascript 在屏幕上切换而不刷新内容(它们只是改变位置),并且可以调整列的大小。 在移动设备上,它们应该 100% 宽度堆叠。

Drawing example here

https://codepen.io/az3l10/pen/vYgVmeP

function toggleLayout() 
  document.querySelector('main').classList.toggle('social');
 
main div 
  position: absolute;
  width: calc(100% - 400px);
  height: 100%
  top: 0; 
  left: 0;


[orange] 
  position:absolute;
  right:0px;
  background-color: #FFAD77;


[yellow] 
    position: absolute;
  background-color: #FFE377;
  width:400px;
  height:30px;
  left:calc(100% - 400px);



[green] 
    position: absolute;
  background-color: lightgreen;
  width:400px;
  height:300px;
  left:calc(100% - 400px);
  top:30px;



[purple] 
  position: absolute;
  width:400px;
  height:calc(100% - 330px);

  left:calc(100% - 400px);
  top:330px;
  background-color: #FF77C8;
  


main.social div 
 




main.social [orange] 
 left:calc(100% - 400px);
 top:30px;
  width:400px;
  height:1000px;

  background-color: #FFE377;
  
  



main.social [green] 
 position: absolute;
 top:0;
 left:0;
 width: calc(100% - 400px);
 height: calc(100%);
 
  background-color: lightgreen;



@media only screen and (max-width: 1580px) 

[orange] 
  position:relative;
  left:0px;
  top:0px;
  width:100%;
  background-color: #FFAD77;


[yellow] 
  position:relative;
  left:0px;
  top:0px;
  width:100%;
  background-color: #FFE377;


[purple] 
  position:relative;
  left:0px;
  top:0px;
  width:100%;
  height:600px;
    background-color: #FF77C8;
  

[green] 
  position:relative;
  left:0px;
  top:0px;
  width:100%;
  height:10px;
  background-color: lightgreen;
   



main.social.sociald 
  height:600px;



main.social.chatd 
  height:10px;


<main>
 <div orange> 
ORANGE
  </div>

    <div yellow>

        <button onclick="toggleLayout">TOGGLE</button>

        
    </div>

    <div green id="sociald">    
    <figure style="width:100%;height:100%;margin:0px">
        <iframe id="framesoc" border=0 style="width:100%;height:100%" src="https://www.google.com"></iframe>
        </figure>
    
    </div>

    <div purple id="chatd"> 
        
        <figure style="width:100%;height:100%;margin:0px">
        <iframe id="framechat" border=0 style="width:100%;height:100%" src="https://www.calm.com/breathe"></iframe>
        </figure>
        
    </div>

</main>

 
</body>
</html>

我遇到的问题是,由于 DIV 位置是绝对的,我无法调整列的大小,如果我改变了位置,我就无法切换。

有人可以帮忙吗?

【问题讨论】:

你尝试了什么?你的代码在哪里? 欢迎来到 SO。不幸的是,您似乎误解了它的工作原理。它不是免费的代码编写服务,您只需发布需求。预计您发布代码尝试解决您自己的问题,并在其他人无法按预期工作时提供帮助。见How to Ask和minimal reproducible example 【参考方案1】:

如果可以使用CSS Flexbox 或CSS Grid 实现绝对定位,则不要使用。

移动优先

我们知道我们想要两个元素 A 和 B 出现在我们的网站上,并且这两个元素属于同一类。这意味着,我们创建了两个包含在一个分组元素中的元素:

/* Ignore; for demonstration-purposes */
html height:100%
body margin:0;min-height:100%
#a, #b min-width:100px;min-height:100px
#a background-color:red
#b background-color:blue
<div class="wrapper">
  <div id="a"></div>
  <div id="b"></div>
</div>

这两个(本质上)设置了display: block,默认CSS就足够了,所以不需要写任何东西。

现在,当在更大的屏幕上查看网站时,我们希望有...:

... 2×2 网格 ...网格右上角的一个切换按钮(简单来说:一个复选框),用于交换 A 和 B 的位置 ...占据整个第一列的第一个(“选定”)元素

我们修改 HTML 以适应我们想要的结果,然后开始编写 CSS。 我们基本上禁用了仅限大屏幕的元素,并在@media-规则中(重新)启用它们和其他想要的样式。另外,我们添加网格,并默认为#a 赋予selected 类。

现在,要添加交换功能,我们需要一些 JavaScript。 我们想将 selected-class 添加到 A 或 B,具体取决于复选框 checked-property。

总而言之,代码现在看起来像这样:

const a = document.querySelector('#a');
const b = document.querySelector('#b');
document.querySelector('input').addEventListener('click', evt => 
  if (evt.target.checked) 
    b.classList.add('selected');
    a.classList.remove('selected');
   else 
    a.classList.add('selected');
    b.classList.remove('selected');
  
);

/* Alternatively (same effect)
const wrapperElements = document.querySelectorAll('.wrapper>*:not(label)');
document.querySelector('input').addEventListener('click', evt => 
  let i = Number(!!evt.target.checked);
  wrapperElements[i].classList.add('selected');
  wrapperElements[++i % 2].classList.remove('selected');
);
*/
/* Ignore; for demonstration-purposes */
html height:100%
body margin:0;min-height:100%
#a, #b min-width:100px;min-height:100px
#a background-color:red
#b background-color:blue

/* The CSS */
label display: none

@media only screen and (min-width: 768px)  /* When at least 768px, then: */
  .wrapper 
    display: grid;
    grid-template-rows: auto 1fr;
    grid-template-columns: 1fr auto;
  
  label 
    display: initial;
    grid-area: 1 / 2 / 2 / 3;
  
  .selected grid-area: 1 / 1 / -1 / 1
<div class="wrapper">
  <label><input type="checkbox">Toggle A/B</label>
  
  <div id="a" class="selected"></div>
  <div id="b"></div>
</div>

【讨论】:

太棒了!!!我想现在我可以自己添加调整大小的列。非常感谢!

以上是关于可调整大小的响应式切换 iframe的主要内容,如果未能解决你的问题,请参考以下文章

css 使用flexbox的响应式,可调整大小的面板布局

如何使用 jQuery UI 获取可拖动和可调整大小元素的坐标

Bootstrap 响应式 iframe 不调整大小

响应式 iframe(谷歌地图)和奇怪的调整大小

为啥手动调整 Visjs 时间线图的高度(可调整大小)不起作用?

当浏览器调整大小时,不断在视频上移动可调整大小/可拖动的图像