前言

本文将用不同的方式实现动态内容的等高布局。

场景描述

首先不同内容的固定高度等高布局没有任何难度,本文讲的不是这种。本文讲的是,不同行级或者浮动元素具有不定高度时,将其他元素的高度填充为最大高度元素的高度这种场景。

  1. <ul class="cont-wrap1">
  2. <li>12324134242342wrwt</li>
  3. <li>241</li>
  4. </ul>

方案 一 display:flex

特点:简单,高效,基本的现代浏览器都支持。

  1. .cont-wrap1 {
  2. border:1px solid gray;
  3. padding:10px;
  4. overflow:hidden;
  5. display:flex;
  6. li{
  7. word-break:break-all;
  8. margin-left:20px;
  9. border:1px solid red;
  10. width:50px;}
  11. }

方案 二 table 布局或者伪table

特点:没有兼容问题,但是元素显示不能符合预期(容器百分百的时候,元素设置的宽度无效;容器没有宽度的时候,不符合原来容器需求),而且比较受限于需要占满父容器,不过也是看你实际需求,有可能这正是你需要的。

  1. .cont-wrap2 {
  2. border:1px solid gray;
  3. display:table;
  4. overflow:hidden;
  5. width:100px;
  6. li{
  7. display:table-cell;
  8. word-break:break-all;
  9. border:1px solid red;
  10. width:50px;}
  11. }

方案 三 :绝对定位

实现固定的等高

特点:参考同一个父模型,同时实现等高利用top,bottom

  1. .cont-wrap3{
  2. border:1px solid gray;
  3. padding:10px;
  4. height:100px;
  5. position:relative;
  6. .main,.left{
  7. position:absolute;
  8. word-break:break-all;
  9. border:1px solid red;
  10. width:50px;
  11. top:0;
  12. bottom:0;
  13. }
  14. .left{
  15. left:0;
  16. }
  17. .main{
  18. left:50px;
  19. }
  20. }

侧边栏根据内容实现变化等高

特点:需要指定好变化的内容是哪部分,根据依赖项等高的原理。

  1. .cont-wrap4 {
  2. border:1px solid gray;
  3. position:relative;
  4. width:100px;
  5. .main{
  6. margin-left:50px;
  7. border:1px solid red;
  8. word-break:break-all;
  9. }
  10. .left{
  11. position:absolute;
  12. word-break:break-all;
  13. border:1px solid red;
  14. width:50px;
  15. top:0;
  16. bottom:0;
  17. }
  18. }

方案四 :padding+margin实现

特点:没有兼容性问题,可以实现动态等高,原理是在浮动元素里添加一个padding+margin值的盒模型,需要注意的是padding的值要足够大。

  1. <ul class="cont-wrap6">
  2. <li class="left">
  3. <div class="Cont">1234242342w34532</div></li>
  4. <li class="main"> <div class="Cont">24134413r4413rw4413rw4413rw4413rwwt</div></li>
  5. </ul>
  6. .cont-wrap6{
  7. overflow:hidden;
  8. border:1px solid red;
  9. .left,.main{
  10. margin-left:20px;
  11. float:left;
  12. word-break:break-all;
  13. width:50px;
  14. .Cont{
  15. width:48px;
  16. padding-bottom:3000px;
  17. margin-bottom:-3000px;
  18. border:1px solid gray;
  19. }
  20. }
  21. }

方案五 :其他

利用背景图片

特点:纯效果模拟,利用整体布局的背景图片宽度相同,竖直方向重铺,各个元素的高度并未变化。不做过多的描述。

利用边框

特点:也是视觉效果的边框重合,并没有真实实现元素等高

  1. .cont-wrap5 {
  2. border:1px solid gray;
  3. padding-left:50px;
  4. &:after{
  5. content:'';
  6. clear:both;
  7. display:table;
  8. }
  9. .left,.main{
  10. float:left;
  11. word-break:break-all;
  12. }
  13. .left{
  14. margin-left:-50px;
  15. width:50px;
  16. border-right:1px solid red;
  17. }
  18. .main{
  19. width:50px;
  20. margin-left:-1px;
  21. border-left:1px solid red;
  22. }
  23. }

总结

综上,其实不考虑兼容的话:只要display:flex完整的能实现吧水平的浮动或者行内元素实现动态内容完整的等高布局。考虑兼容,利用float+padding模型就可以。

参考