4.19.4 面板与表格进行嵌套

一般在使用面板的时候,往往可能会在主区域(panel-body)内放很多内容,比如图片、表格等。来看一下放表格的效果,示例代码如下:

  1. <div class="panel panel-default">
  2. <div class="panel-heading">Panel heading</div>
  3. <div class="panel-body">
  4. <p>...</p>
  5. <table class="table table-bordered">
  6. ...
  7. </table>
  8. </div>
  9. </div>

上述示例的运行效果如图4-92所示。

4.19.4 面板与表格进行嵌套 - 图1 图4-92 面板与表格嵌套时的效果

可以看到,由于panel-body有15像素的内边距,所以内部的表格边框并没有和外部的panel紧靠在一起,如果想紧靠在一起,则只要将table元素和panel-body所在的div元素并列放就可以了。示例代码如下:

  1. <div class="panel panel-default">
  2. <div class="panel-heading">Panel heading</div>
  3. <div class="panel-body">
  4. <p>...</p>
  5. </div>
  6. <table class="table table-bordered">
  7. ...
  8. </table>
  9. </div>

上述示例的运行效果如图4-93所示。

这样看起来是不是很完美?你可能会有疑问:table-bordered样式本来是有边框的,这样放的话,应该会有边框重合的粗边框才对啊。是的,原本是有粗线的,但是Bootstrap作者专门又对这种场景进行了优化(即:去除一个边框)。源码如下:

  1. // 源码4798行
  2. .panel > .table,
  3. .panel > .table-responsive > .table {
  4. margin-bottom: 0; /*使用panel时,将表格的底部外边距设置为0,以便重合靠近*/
  5. }
  6. .panel > .panel-body + .table,
  7. .panel > .panel-body + .table-responsive {
  8. border-top: 1px solid #ddd;
  9. /*使用panel时,如果表格和panel-body并列放,将表格的顶部边框设置为1像素,以便和panel-body
  10. 有分隔*/
  11. }
  12. .panel > .table > tbody:first-child > tr:first-child th,
  13. .panel > .table > tbody:first-child > tr:first-child td {
  14. border-top: 0; /*将tbody区域的第一个th或td的顶部边框设置为0,避免有水平粗线*/
  15. }
  16. .panel > .table-bordered,
  17. .panel > .table-responsive > .table-bordered {
  18. border: 0; /*使用panel时,将表格的table-bordered样式的外边框设置为0,
  19. 但tr和td依然有边框*/
  20. }
  21. .panel > .table-bordered > thead > tr > th:first-child,
  22. .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
  23. .panel > .table-bordered > tbody > tr > th:first-child,
  24. .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
  25. .panel > .table-bordered > tfoot > tr > th:first-child,
  26. .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
  27. .panel > .table-bordered > thead > tr > td:first-child,
  28. .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
  29. .panel > .table-bordered > tbody > tr > td:first-child,
  30. .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
  31. .panel > .table-bordered > tfoot > tr > td:first-child,
  32. .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
  33. border-left: 0; /*将左边框设置为0,以便和左边的panel重合靠紧*/
  34. }
  35. ……
  36. /*将右边框设置为0,以便和panel的右边重合靠紧*/
  37. /*将下边框设置为0,以便和panel的下边框重合靠紧*/

4.19.4 面板与表格进行嵌套 - 图2 图4-93 表格充满面板时的运行效果

而如果去除了.table-bordered样式,仅仅使用.table样式的话,效果也是很好的,如图4-94所示。

4.19.4 面板与表格进行嵌套 - 图3 图4-94 面板与table-bordered样式的完美融合

最后,还有一个场景就是,如果不用panel-body样式的元素,只放head元素和表格元素,效果也是极好的。示例代码如下:

  1. <div class="panel panel-default">
  2. <div class="panel-heading">我的图书</div>
  3. <table class="table">
  4. ...
  5. </table>
  6. </div>

上述示例的运行效果如图4-95所示。

4.19.4 面板与表格进行嵌套 - 图4 图4-95 只有head和表格时的运行效果