table:宽度设置无效及写出理想的表格

目录

举例:

理论:

1、每列都不设置宽度

2、只设置第一列的宽度

3、设置列一、列二的宽度

4、三列宽度全部设置

4.1三列之和等于列表宽度,宽度设置有效。

4.2 三列之和小于列表宽度,宽度设置失效 

4.3 三列之和大于列表宽度

5、结论

思考:如果表格第一列的宽度,第一行设置50px,第二行设置100px,不同布局下列一的实际宽度?--必看


举例:

<!--例1 自动表格布局:部分列设宽,且已设置列宽之和不超过列表宽度【必须】-->
<table cellspacing="0" cellpadding="0" border="0" style="width: 600px;">
  <tr>
    <th style="width: 100px">种类</th>
    <th style="width: 200px;word-break: break-all;"
        >111111111111111111111111111111111111111111111111111111</th>
    <th>重量</th>
  </tr>
</table>

<!--例2 固定表格布局:全部列设宽,且已设置列宽之和 = 列表宽度-->
<table cellspacing="0" cellpadding="0" border="0" 
       style="width: 600px;table-layout: fixed">
  <tr>
    <th style="width: 100px">种类</th>
    <th style="width: 200px">名称</th>
    <th style="width: 300px">重量</th>
  </tr>
</table>

<!--例3 固定表格布局:全部列设宽,且已设置列宽之和 > 列表宽度;
设置一个可横向滚动的table-->
<div style="width: 600px;overflow-x: auto">
  <table cellspacing="0" cellpadding="0" border="0" 
         style="width: 100%;table-layout: fixed">
    <tr>
      <th style="width: 100px">种类</th>
      <th style="width: 200px">名称</th>
      <th style="width: 400px">重量</th>
    </tr>
  </table>
</div>

理论:

  • 自动表格布局:table的CSS属性table-layout:auto; (默认值)

        列的宽度是由列单元格中没有折行的最宽的内容设定的

  • 固定表格布局:table的CSS属性table-layout:fixed; 

       水平布局仅取决于表格宽度、列宽度、表格边框宽度、单元格间距,而与单元格的内容无关

针对两种表格布局,分别设置列宽来实现宽度设置自由。

1、每列都不设置宽度

<!--自动布局-->
<table cellspacing="0" cellpadding="0" border="0" style="width: 600px">
<!--固定布局-->
<!--<table cellspacing="0" cellpadding="0" border="0" 
    style="width: 600px;table-layout: fixed">-->
  <tr>
    <th>种类</th>
    <th>名称</th>
    <th>重量</th>
  </tr>
</table>

【图示说明:所有的图例中,上面的表格采用自动布局,下面的表格采用固定布局;每个表格都只有一行。红色字体标明的宽度如100px,是代码中设置的宽度,蓝色字体标明的数字如100,是实际浏览器渲染的宽度】 

每列都不设置宽度,自动布局中,列宽根据内容自适应【图1-1,1-2,1-3】;

固定布局中,三列等宽分布【图1-4,1-5,1-6】。

2、只设置第一列的宽度

<table cellspacing="0" cellpadding="0" border="0" style="width: 600px;">
  <tr>
    <th style="width: 100px">种类</th>
    <th>名称</th>
    <th>重量</th>
  </tr>
</table>

表1和表2设置列一宽100px;表3和表4设置列一宽600px

结果:

列表只设置第一列的宽度时,

1)设置的列宽远小于列表宽度时,自动布局中,列一的宽度设置有效,列二、列三根据内容自适应【图2-1,2-2】;固定布局中,列一的宽度设置有效,列二、列三等宽分布【图中2-5,2-6】。

2)设置的列宽 ≥ 列表宽度时,自动布局中,列一的宽度设置失效,列二、列三会尽可能的窄,列一尽可能的宽【图中2-3,2-4】;固定布局中,列一的宽度设置有效,例二和列三会超出整个列表【图2-7,2-8】【避免这种写法】。

3)临界值【如599px】,这里不做讨论

 

3、设置列一、列二的宽度

<table cellspacing="0" cellpadding="0" border="0" style="width: 600px;">
  <tr>
    <th style="width: 100px">种类</th>
    <th style="width: 200px">名称</th>
    <th>重量</th>
  </tr>
</table>

表1和表2设置列一宽100px,列二宽200px;表3和表4设置列一宽200px,列二宽400px。

结果:

列表设置第一、第二列的宽度时,和只设置第一列的情况类似。但此时比较的是列宽之和。

1)设置的列宽之和小于列表宽度时(小于不准确,但能说明问题),自动布局【图3-1,3-2】和固定布局【图3-5,3-6】,宽度设置有效。

2)设置的列宽之和 ≥ 列表宽度时,自动布局中,宽度设置失效,列三会尽可能的窄,列一和列二基本按照我们的宽度设置,1:2【200 : 400 】分布【图3-3,3-4】;固定布局中,宽度设置有效,列三会超出整个列表【图中3-7,3-8】【避免这种写法】。

 

4、三列宽度全部设置

4.1三列之和等于列表宽度,宽度设置有效。

<table cellspacing="0" cellpadding="0" border="0" style="width: 600px;">
  <tr>
    <th style="width: 300px">种类</th>
    <th style="width: 200px">名称</th>
    <th style="width: 100px">重量</th>
  </tr>
</table>

分别设置列一宽300px,列二宽200px,列三宽100px。

自动布局【图4-1,4-2】和固定布局【图4-5,4-6】,宽度设置有效。

如果列三的文字是连续的英文字母或数字,浏览器实际渲染效果会奇奇怪怪【图4-3,4-7】。

此时列三加上样式 word-break: break-all; 或 word-break: break-word; 可达到预期【图4-4,4-8】。

 

4.2 三列之和小于列表宽度,宽度设置失效 

<table cellspacing="0" cellpadding="0" border="0" style="width: 600px;">
  <tr>
    <th style="width: 200px">种类</th>
    <th style="width: 200px">名称</th>
    <th style="width: 100px">重量</th>
  </tr>
</table>

分别设置列一200px,列二200px,列三100px,三列之和500px 小于 table宽度600px。

自动布局和固定布局宽度设置均失效,除了内容不能自动折行的图5-3,其余的列表各列基本按照我们的宽度设置,2:2:1【200 : 200 : 100】分布。

 

4.3 三列之和大于列表宽度

<table cellspacing="0" cellpadding="0" border="0" style="width: 600px;">
  <tr>
    <th style="width: 100px">种类</th>
    <th style="width: 200px">名称</th>
    <th style="width: 400px">重量</th>
  </tr>
</table>

分别设置列一100px,列二200px,列三400px,三列之和700px 大于 table宽度600px。

自动布局中,宽度设置失效。如果文字是纯中文、纯英文、中英文混合,浏览器最终渲染的宽度是有差异的【图6-1,6-2,6-3】,各列大体按照我们的宽度设置,1:2:4分布。 

固定布局中,宽度设置有效。但列表的实际宽度会大于我们设置的600px【图6-4,6-5,6-6】。

此时,如果我们给table套一个div,div加样式style="width: 100%;overflow-x: auto",就可以轻松实现横向滚动的table【图6-6】。

 

5、结论

自动表格布局下,设置了table宽度后,table的实际宽度一般不会改变(即我们设置的宽度)【如果某列的文字是连续的英文或数字,且未折行宽度大于列表宽度,列表的实际宽度仍会改变】。

设置不同的列宽不一定有效。有效的情况为:

  • 部分列设置了宽度,且设置的列宽之和小于table的宽度【注意临界值】;
  • 全部的列设置了宽度,且宽度之和等于table的宽度

固定表格布局下,设置了table宽度后,table的实际宽度会改变。

设置不同的列宽基本有效。有效的情况为:

  • 部分列设置了宽度【注意避免已设置宽度之和≥table宽度的情况,此时文本超出,挤在一起】
  • 全部的列设置了宽度,且宽度之和等于table的宽度
  • 全部的列设置了宽度,且宽度之和大于table的宽度(可设置列表横向滚动)

思考:如果表格第一列的宽度,第一行设置50px,第二行设置100px,不同布局下列一的实际宽度?--必看

自动布局下,浏览器最终以设置当前列的最大宽度渲染。图7-1中,第一行第一列不设置宽度,第二行第一列设宽为100px,第三行第一列设宽为60px,浏览器最终以最大的100px渲染。图7-2中,第一行第一列设宽为50px,第二行第一列设宽为100px,第三行第一列设宽为60px,浏览器最终以最大的100px渲染。

固定布局下,浏览器最终以第一行设置的宽度渲染,之后的行设置的宽度失效。图7-3中,第一行三列都未设置宽度,因此三列等分布局。图7-4中,浏览器实际以第一行第一列的列宽50px渲染。

 

The End 

猜你喜欢

转载自blog.csdn.net/weixin_43932309/article/details/125404167