You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML+原生JS实现Div可见性切换时自动调整尺寸

解决方案:用Flex布局实现自动适配宽度

我来帮你搞定这个问题!其实不用写复杂的JS来计算宽度,借助CSS Flex布局就能轻松实现div根据显示数量自动分配空间的效果,同时还能简化你的冗余代码。

步骤1:简化JavaScript函数

你现在有三个重复的切换函数,我们可以把它们合并成一个通用函数,减少代码冗余:

// 通用切换函数,接收div的ID作为参数
function toggleDiv(divId) {
  const div = document.getElementById(divId);
  // 切换显示/隐藏状态
  div.style.display = div.style.display === "none" ? "block" : "none";
}

步骤2:改用Flex布局(核心调整)

原来的float布局需要手动计算宽度,换成Flex布局后,容器会自动帮我们分配空间。修改CSS如下:

/* 父容器设置Flex布局,元素之间间距20px(替代原来的margin) */
.div-container {
  display: flex;
  gap: 20px;
  padding: 0 20px; /* 可选:让容器左右保留边距,和原效果一致 */
}

/* 给每个div统一设置基础样式,flex:1表示自动平分可用空间 */
.div-item {
  flex: 1;
  padding: 50px 0;
  text-align: center;
}

/* 保留每个div的背景色 */
#myDIV-1 { background-color: lightblue; }
#myDIV-2 { background-color: coral; }
#myDIV-3 { background-color: gold; }

步骤3:更新HTML结构

给包裹div的父容器添加class,同时给每个子div添加统一的class:

<p>Click on the checkboxes to toggle the visibility of the divs.</p>
<input type="checkbox" onclick="toggleDiv('myDIV-1')" checked>Toggle DIV-1</input>
<input type="checkbox" onclick="toggleDiv('myDIV-2')" checked>Toggle DIV-2</input>
<input type="checkbox" onclick="toggleDiv('myDIV-3')" checked>Toggle DIV-3</input>

<!-- 父容器添加class -->
<div class="div-container">
 <div id="myDIV-1" class="div-item"> This is my DIV-1 element. </div>
 <div id="myDIV-2" class="div-item"> This is my DIV-2 element. </div>
 <div id="myDIV-3" class="div-item"> This is my DIV-3 element. </div>
</div>

效果说明

这样修改后:

  • 当3个div都显示时,flex:1会让它们自动平分父容器的可用空间(减去gap的20px间距)
  • 隐藏任意一个div后,剩下的div会自动调整宽度,平分剩余空间
  • 只显示一个div时,它会占满整个父容器的可用宽度

如果你坚持用Float布局(备选方案)

如果你不想改动布局方式,也可以通过JS计算宽度。添加一个更新宽度的函数,在每次切换后调用:

function updateDivWidths() {
  const divs = [document.getElementById('myDIV-1'), document.getElementById('myDIV-2'), document.getElementById('myDIV-3')];
  // 统计当前显示的div数量
  const visibleCount = divs.filter(div => div.style.display !== 'none').length;
  
  if (visibleCount === 0) return;
  
  // 计算每个div的宽度:减去所有margin的总宽度后平分
  const totalMargin = 40 * visibleCount; // 每个div左右margin各20px,总横向margin为40*数量
  divs.forEach(div => {
    if (div.style.display !== 'none') {
      div.style.width = `calc((100% - ${totalMargin}px) / ${visibleCount})`;
    }
  });
}

// 修改原来的切换函数,每次切换后更新宽度
function myFunction1() { 
  var x = document.getElementById("myDIV-1"); 
  x.style.display = x.style.display === "none" ? "block" : "none";
  updateDivWidths();
}

function myFunction2() { 
  var x = document.getElementById("myDIV-2"); 
  x.style.display = x.style.display === "none" ? "block" : "none";
  updateDivWidths();
}

function myFunction3() { 
  var x = document.getElementById("myDIV-3"); 
  x.style.display = x.style.display === "none" ? "block" : "none";
  updateDivWidths();
}

// 页面加载时初始化宽度
window.onload = updateDivWidths;

这种方式需要手动计算宽度,而且窗口resize时可能需要重新计算,不如Flex布局方便,所以更推荐第一种方案。

内容的提问来源于stack exchange,提问作者DataScienceNovice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:47:54