如何并排展开和折叠三个div?

Posted

技术标签:

【中文标题】如何并排展开和折叠三个div?【英文标题】:How to expand and collapse three div's side by side? 【发布时间】:2017-05-03 01:13:09 【问题描述】:

$(document).ready(function () 
    $("#toggle").click(function () 
        if ($(this).data('name') == 'show') 
            $("#sidebar").animate(
                width: '10%'
            ).hide()
            $("#map").animate(
                width: '89%'
            );
            $(this).data('name', 'hide')
         else 
            $("#sidebar").animate(
                width: '29%'
            ).show()
            $("#map").animate(
                width: '70%'
            );
            $(this).data('name', 'show')
        
    );
);
html, body 
    width:100%;
    height: 100%;

#header 
    width: 100%;
    height: 20%;
    float: left;
    border: 1px solid;

#map 
    width: 80%;
    height: 80%;
    float: left;
    border: 1px solid;

#sidebar 
    width: 19%;
    height: 80%;
    float: left;
    border: 1px solid;

#toggle 
    width: 10%;
    height: 40%;
    margin-right: 6.5%;
    margin-top: 3.5%;
    float: right;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="header">HEADER
    <input type="button" data-name="show" value="Toggle" id="toggle">
</div>
<div id="map">MAP</div>
<div id="sidebar">SIDEBAR</div>

我是angularjsjquerycss 的初学者。我想创建三个并排切换的 div 请帮助我如何在 angularjs 中做到这一点。

在普通模式下示例:-

会是这样的。

如果我展开 center div 它需要像这样的例子:-

如果我展开最后一个 div,它需要像这样的示例:-

谢谢..

【问题讨论】:

我为 2 个 div 完成了,但我为 3 个 div 做了努力 我把示例代码分享给了两个div 你能为此制作一个小提琴吗? 你想在单个按钮中实现这一点还是点击div? 看这个:codepen.io/vishnuprasad/pen/MbZqgW 【参考方案1】:

试试这个。所有的 div 都可以按任意顺序展开。要切换回正常位置,请再次单击展开的 div。

压缩和展开状态下的宽度以百分比表示,您可以根据需要在 css 中更改它们。我还添加了transition 属性以实现平稳运行。

这是pen。

$("a.expansion-btn").click(function ()
  classes = this.className;
  var divNumber = classes.slice(-1);
  var toGetId = "#div-"+divNumber;
  if ($(toGetId).hasClass("expanded-div"))
   $(".normal-div").removeClass("compressed-div expanded-div");
  
  else
   $(".normal-div").removeClass("compressed-div expanded-div").addClass("compressed-div");;
   $(toGetId).removeClass("compressed-div").addClass("expanded-div");    
    
);
*
  box-sizing:border-box;

.container
  margin:0;
  padding:0;
  width:100%;
  height:400px;

.normal-div
  width:33.33%;
  height:100%;
  position:relative;
  border:2px solid black;
  float:left;
  -webkit-transition: all 0.5s ease-in-out;
  -moz-transition: all 0.5s ease-in-out;
  transition: all 0.5s ease-in-out;

.expanded-div
  width:80%;

.compressed-div
  width:10%;

#div-1
  background-color:green;

#div-2
  background-color:red;

#div-3
  background-color:blue;

a.expansion-btn
  position:absolute;
  top:10px;
  right:10px;
  font-weight:bold;
  cursor:pointer;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
  <div class="normal-div" id="div-1">
    <a class="expansion-btn exp-1">click</a>
  </div>
  <div class="normal-div" id="div-2">
    <a class="expansion-btn exp-2">click</a>
  </div>
  <div class="normal-div" id="div-3">
    <a class="expansion-btn exp-3">click</a>
  </div>
</div>

【讨论】:

如何重置?恢复正常位置? 抱歉没有早点想到,您能等五分钟吗【参考方案2】:

如果您只想在 div 之间切换,请执行以下操作。

// varible for holding div index
var i = 0,
  // cache divs
  $div = $('.div');;

// bind click event handler
$('.toggle').click(function() 
  $div
  // remove both class from all elements
    .removeClass('active nonactive')
    // get element by index
    .eq(i)
    // add active class
    .addClass('active')
    // get siblings
    .siblings()
    // add nonactive class
    .addClass('nonactive');
  // update index 
  i = ++i % $div.length;
)
.div 
  height: 300px;
  width: 30%;
  border: solid 1px black;
  display: inline-block

.active 
  width: 75%;

.nonactive 
  width: 10%;

.active,
.nonactive 
  -webkit-transition: width 1s ease-in-out;
  -moz-transition: width 1s ease-in-out;
  -o-transition: width 1s ease-in-out;
  transition: width 1s ease-in-out;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="toggle">toggle</button>
<br>
<div class="div"></div>
<div class="div"></div>
<div class="div"></div>

或者,如果您想在单击 div 内的按钮时进行切换,请执行以下操作。

$('.toggle').click(function() 
  $(this)
    // get div 
    .parent()
    // remove nonactive class from clicked element
    .removeClass('nonactive')
    // toggle active class
    .toggleClass('active')
    // get sibling divs
    .siblings()
    // remove active class from siblings
    .removeClass('active')
    // toggle nonactive class based on the clicked element 
    .toggleClass('nonactive', $(this).parent().is('.active'));
)
.div 
  height: 300px;
  width: 30%;
  border: solid 1px black;
  display: inline-block

.active 
  width: 75%;

.nonactive 
  width: 10%;

.div,
.active,
.nonactive 
  -webkit-transition: width 1s ease-in-out;
  -moz-transition: width 1s ease-in-out;
  -o-transition: width 1s ease-in-out;
  transition: width 1s ease-in-out;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <div class="div">
    <button class="toggle">toggle</button>
  </div>
  <div class="div">
    <button class="toggle">toggle</button>
  </div>
  <div class="div">
    <button class="toggle">toggle</button>
  </div>
</div>

【讨论】:

【参考方案3】:
    <div id="header">HEADER
        <input type="button" data-name="show" value="Toggle" id="toggle">
    </div>
    <div id="maincont">
        <div id="map" class="active">MAP</div>
        <div id="sidebar" class="inactive">SIDEBAR</div>
        <div id="sidebar1" class="inactive">SIDEBAR1</div>
    </div>

脚本:

    $(document).ready(function ()      
            $("#toggle").click(function () 

                        var $div = $('#maincont').find(".active");
                        $div.removeClass('active').addClass("inactive").next().addClass("active");      

                        $('#maincont').find(".inactive").animate(
                            width: '10%'
                        )

                        $('#maincont').find(".active").animate(
                            width: '79%'
                        );           

             );

    );

css.

         html, body 
            width:100%;
            height: 100%;
        
        #header 
            width: 100%;
            height: 100px;
            float: left;
            border: 1px solid;
        
        #map   
            height: 80%;
            float: left;
            border: 1px solid;
        
        .active
          width:78%;
           float: left;
           height: 100px;
        
        .inactive
          width:10%;
           float: left;
           border: 1px solid;
            height: 100px;
        
        #sidebar    
            height: 80%;
            float: left;

        
        #toggle 
            width: 10%;
            height: 40%;
            margin-right: 6.5%;
            margin-top: 3.5%;
            float: right;
        

fiddle link

【讨论】:

【参考方案4】:

由于您使用 angularjs 标记了您的问题,因此这里有一个没有花哨 CSS 的简单解决方案:

假设你有一些描述控制器中面板/div的对象数组,例如

$scope.panels = [
    title: "One",
    expanded: true
  , 
    title: "Two"
  , 
    title: "Three"
  ];

expanded 标志只跟踪实际展开的面板。默认是第一个。

然后当你点击一个面板时,这个函数将标志设置为选定的面板:

  $scope.expandPanel = function(panel) 
     $scope.panels.forEach(p => p.expanded = false);
     panel.expanded = true;
  

然后您在ng-repeat 循环中显示所有内容,其中关键是根据expanded 标志和ng-class 动态设置类:

<div class="panel" 
     ng-class="'expanded': panel.expanded, 'reduced': !panel.expanded" 
     ng-repeat="panel in panels" ng-click="expandPanel(panel)">
  <span>panel.title</span>
</div> 

看到它live with this plunker。

注意:.panel.expanded.reduced 类在 plunker css 文件中定义。

【讨论】:

以上是关于如何并排展开和折叠三个div?的主要内容,如果未能解决你的问题,请参考以下文章

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

VUE项目实战19实现侧边栏折叠与展开功能

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

用 css 展开和折叠

如何以角度动态创建 n 级嵌套展开/折叠组件

js 控制展开折叠 div html dom