用于 Div 调整大小、展开和折叠的 JQuery/Javascript

Posted

技术标签:

【中文标题】用于 Div 调整大小、展开和折叠的 JQuery/Javascript【英文标题】:JQuery/Javascript for Div resizing, expand and collapse 【发布时间】:2016-12-19 02:45:16 【问题描述】:

任何帮助将不胜感激。

我有 3 个 div,父 div(红色),顶部 2 个子 div(蓝色)和底部(绿色)另一个。这是我想要实现的目标:

当顶部 div(blue) 通过单击“Expand Blue Div”按钮调整/增加其大小时,底部 div(green) 将缩小/减小其大小但保持在其位置,这意味着它应该仍然保持打开它的 x 轴,即使它改变了它的高度。简而言之,无论底部 div(绿色)的高度如何,它都应该保持在它的位置上。

我还希望它在单击“缩小蓝色 Div”按钮时恢复所有原始大小。绿色和蓝色尺寸都将保持其原始尺寸。

我更喜欢一个完整的 jquery/javascript 解决方案。谢谢大家

请注意 javascript 代码不应使用常数来计算“绿色”div 的大小/高度。例如,“greendiv.height = 100 - 5px”

$("#expandDiv").click(function()
	$("#blueDiv").css("height","150px");
);
.parent_container 
  border: 5px solid red;
  height: 400px;

.blue_box 
  height: 50px;
  border: 5px solid blue;

.green_table 
  overflow-y: auto;
  border: 5px solid green;
  position:relative;
  height:250px;


.btn_actions 
  padding: 10px;
<div class="parent_container">
  <div class="btn_actions">
    <button class="btn" id="expandDiv">Expand Blue Div</button>
    <button class="btn" id="shrinkDiv">Shrink Blue Div</button>
  </div>
  <div class="blue_box" id="blueDiv">
    
  </div>
  <div class="btn_actions">
    <button class="btn">Download Data</button>
    <button class="btn">Sort Data</button>
  </div>
  <div class="green_table">
      </div>
</div>

这是我的 JSFiddle:https://jsfiddle.net/koykoys/0zLpgzsn/1/

【问题讨论】:

您需要的是一个仅高度不同的开放/封闭类。当您单击一个 div 时,使用 javascript 添加开放类,同时从另一个 div 中删除封闭类 谢谢Martin的回复,但是我在“Green” div里面有一个表,如果我要创建2个类,那么一个类的数据会转移到另一个类吗? “Green” div 内的内容不应被转移,因为那是“Green” div 标记的全部部分 【参考方案1】:

试试这个代码:

$("#expandDiv").click(function()
   var $blueDiv = $("#blueDiv"), $greenDiv = $(".green_table");
   var blueDivHeight = $blueDiv.height(), greenDivHeight = $greenDiv.height();
   var updatedblueDivHeight = 150;
   var incrementedblueDivHeight = updatedblueDivHeight - blueDivHeight; 
     $blueDiv.height(updatedblueDivHeight);
   $greenDiv.height(greenDivHeight - incrementedblueDivHeight);
);

在https://jsfiddle.net/0zLpgzsn/2/查看演示

【讨论】:

哇!!非常感谢@Dhananjay,这正是我想要实现的,但是当你点击“Shrink blue div”时,你能帮我恢复它们的所有尺寸吗?【参考方案2】:

如果您想要仅使用 CSS 的解决方案,请查看以下内容:

.parent-container 
    height: 300px;
    border: 1px solid red;
    padding: 2px;
    display: flex;
    flex-direction: column;


label[for=toggle-blue]::before 
    content: 'Expand';


.blue-container 
    border: 1px solid blue;
    flex-grow: 5;


#toggle-blue 
    display: none;


#toggle-blue:checked + label::before 
    content: 'Shrink';


#toggle-blue:checked + label + div 
    flex-grow: 20;


.green-container 
    border: 1px solid green;
    flex-grow: 10;
<div class="parent-container">
    <input id="toggle-blue" type="checkbox" />
    <label for="toggle-blue"></label>
    <div class="blue-container">

    </div>
    <div class="green-menu">
        <button>
            Button 1
        </button>
        <button>
            Button 2
        </button>
    </div>
    <div class="green-container">

    </div>
</div>

它使用CSS Flexible Boxes和Adjacent sibling selectors,以及::before Pseudo Element。

【讨论】:

谢谢 skobaljic,但我真的更喜欢 jquery 解决方案。【参考方案3】:

jQuery 代码:

$("#expandDiv").click(function(event)
$('#shrinkDiv').removeClass('shrinked');
if(!$(this).hasClass('expanded')) 
    $("#blueDiv").animate(
        height: "+=150"
  );
  $(".green_table").animate(
    height: "-=150"
  );
  $(this).addClass('expanded');
 

);

$("#shrinkDiv").click(function(event)

if( (!$(this).hasClass('shrinked')) && ($('#expandDiv').hasClass('expanded')) ) 
    $("#blueDiv").animate(
        height: "-=150"
  );
  $(".green_table").animate(
    height: "+=150"
  );
  $(this).addClass('shrinked');

      $('#expandDiv').removeClass('expanded');
);

这是工作小提琴

https://jsfiddle.net/0zLpgzsn/4/

【讨论】:

您好,先生,感谢您提供的这个出色的解决方案,它确实有效,但我的错误是我忘记在我的描述中添加我们不应该使用常量/固定数字来更改“绿色”的大小div,但是这个答案非常有用;),非常感谢 U 可以动态计算高度并存储在变量中。根据你的目的使用它。【参考方案4】:
/*CSS*/

  <style type="text/css">
  .parent_container 
    border: 5px solid red;
    height: auto;
    position:relative;
  
  .blue_box 
    height: 50px;
    border: 5px solid blue;
  
  .green_table 
    overflow-y: auto;
    border: 5px solid green;
    position:relative;
    height:50px;
  
  .open
    height:150px;
  
  .closed
    height:35px;
  

  .btn_actions 
    padding: 10px;
  
</style>

// jQuery

 $(document).ready(function()

  $("#expandDiv").on("click", function()

    if(!$("#blueDiv").hasClass("open"))
      $("#blueDiv").addClass("open");  
    
    if(!$(".green_table").hasClass("closed"))
        $(".green_table").addClass("closed");
    

  )

  $("#shrinkDiv").on("click", function()

    if($("#blueDiv").hasClass("open"))
      $("#blueDiv").removeClass("open");  
    
    if($(".green_table").hasClass("closed"))
        $(".green_table").removeClass("closed");
    


  )

)

这取决于您的解决方案和要求 :)

加链接到小提琴Fiddle

【讨论】:

您好,先生,感谢您提供的这个出色的解决方案,它确实有效,但我的错误是我忘记在我的描述中添加我们不应该使用常量/固定数字来更改“绿色”的大小div,但是这个答案非常有用;),非常感谢 @Reymark 没问题,它是一个简单的解决方案,可以调整:)

以上是关于用于 Div 调整大小、展开和折叠的 JQuery/Javascript的主要内容,如果未能解决你的问题,请参考以下文章

React:如何在内容大小未知时为展开和折叠 Div 设置动画

JQuery 移动面板小部件 - 打开可折叠列表会导致一旦展开超出页面高度,就会跳转到页面 div 的底部。为啥?

用 css 展开和折叠

jQuery简单的可折叠div?

使用 jQuery 切换 DIV 背景图像

jquery 和 bootstrap 导航栏在 Angular 7 中折叠或展开子菜单的布局中不起作用