【问题标题】:min-width isn't preferred strongly enough when child is a table当孩子是一张桌子时,最小宽度不够强烈
【发布时间】:2015-01-10 22:35:42
【问题描述】:

我之前的问题有一个answer 使用min-width 来设置包含块的宽度,但是当它的孩子太大时允许它增长。

这适用于某些类型的孩子(明确指定自己的min-widthmax-width 的简单div)。现在我正在研究一个更复杂的变化,其中孩子是桌子。 (具有语义上有意义的行和列的合法表,而不是页面布局表。)

这些表格上没有手动指定的min-widthmax-width,但表格具有固有的最大和最小宽度,对应于表格在任何单元格中没有换行符的情况下呈现的宽度(最大值)和插入所有可能的换行符的宽度(最小值)。

在我试图替换的现有页面布局中,最外面的容器是一个表格(一种糟糕的表格),单行中有一个单元格,CSS width(不是min-width)设置为首选宽度。当孩子们是桌子时,他们会非常努力地适应容器的宽度。宽表将用换行符呈现以使其适合,并且仅当插入所有换行符后子 仍然 不适合时,容器才会展开。

换句话说,父级的width 属性被视为最小值,但它也是一个强首选宽度,其优先级高于子级的首选(即最大)宽度。

相比之下,当父级是带有display:inline-block 和指定min-width 的普通div 时,父级的min-width 不是首选。子代更喜欢更宽,因此父代会扩展,即使子代能够以较小的宽度呈现。

这是一个 sn-p,很像上一个问题中的那个,它演示了所有这些。目标是让第二个容器在某种程度上表现得像第一个容器,这比使用display:table 进行布局更“正确”。

(注意:这个问题的核心表格宽度对字体的选择非常敏感。我希望 Courier New 能够通过,并且每个人都能在 sn-p 中看到相同的宽度。)

var containers = document.querySelectorAll(".container");
for(var i = 0; i < containers.length; ++i) {
  (function() {
    var c = containers[i],
        b = c.nextElementSibling;
    b.addEventListener("click", function(ev) {
      big = c.querySelector(".bigchild");
      medium = c.querySelector(".mediumchild");
      small = c.querySelector(".smallchild");
      if(big.style.display != "block" &&
         medium.style.display != "block" &&
         small.style.display != "block") {
        big.style.display = "block";
      } else if(big.style.display == "block") {
        big.style.display = "none";
        medium.style.display = "block";
      } else if(medium.style.display == "block") {
        medium.style.display = "none";
        small.style.display = "block";
      } else {
        small.style.display = "none";
      }
    });
  })();
}
body {
  background-color: #ccc;
  text-align: center;
  font-size: 14px;
  font-family: "Courier New";
}
table {
  border-collapse: collapse;
}
td {
  border: 1px solid black;
  padding: 5px;
}
.container {
  background-color: white;
  min-height: 250px;
  margin-left: auto;
  margin-right: auto;
}
.bigchild, .mediumchild, .smallchild {
  display: none;
}
button {
  display: block;
  margin: 10px auto 20px;
}
#container1 {
  display: table;
  width: 400px;
}
#container2 {
  display: inline-block;
  min-width: 400px;
}
<div class="container" id="container1">
    <table class="bigchild">
      <tr>
        <td>Lots of</td>
        <td>columns</td>
        <td>make this</td>
        <td>a very</td>
        <td>wide</td>
        <td>table</td>
        <td>that won't</td>
        <td>fit</td>
        <td>even with</td>
        <td>added</td>
        <td>line breaks</td>
      </tr>
    </table>
    <table class="mediumchild">
      <tr>
        <td>This table</td>
        <td>is smaller</td>
        <td>and</td>
        <td>it fits</td>
        <td>but</td>
        <td>only with</td>
        <td>added</td>
        <td>line breaks</td>
      </tr>
    </table>
    <table class="smallchild">
      <tr>
        <td>very</td>
        <td>small</td>
      </tr>
    </table>
  </div>
  <button>Next</button>

  <div class="container" id="container2">
    <table class="bigchild">
      <tr>
        <td>Lots of</td>
        <td>columns</td>
        <td>make this</td>
        <td>a very</td>
        <td>wide</td>
        <td>table</td>
        <td>that won't</td>
        <td>fit</td>
        <td>even with</td>
        <td>added</td>
        <td>line breaks</td>
      </tr>
    </table>
    <table class="mediumchild">
      <tr>
        <td>This table</td>
        <td>is smaller</td>
        <td>and</td>
        <td>it fits</td>
        <td>but</td>
        <td>only with</td>
        <td>added</td>
        <td>line breaks</td>
      </tr>
    </table>
    <table class="smallchild">
      <tr>
        <td>very</td>
        <td>small</td>
      </tr>
    </table>
  </div>
  <button>Next</button>

【问题讨论】:

  • 我看到了您的问题的解决方法,因为它出现在您的 sn-p 中。 javascipt 将表的display 属性设置为block,将其更改为display:table 并将max-width 添加到与容器的min-width 相同的值的表中将创建您所追求的效果.我不认为这是一个完整的答案,因为它涉及信息重复。
  • 脚本中的"block"s当然应该是"table"。当我将原始子 div 更改为表格时,我只是忘记更改它们。 max-width 的想法是可行的,但在一般情况下,孩子可能是也可能不是桌子,强制他们全部使用 display:table 意味着我们还没有解决滥用表格进行布局的问题。
  • 根据您的问题,在这种情况下,孩子们是桌子。不是这样吗?
  • 是的,但那是因为我正在尝试遵循 stackoverflow 政策,使问题尽可能具体,并使用MCVE 来显示问题。当我遇到不依赖于子节点类型的问题时,我将它们设置为 div 以保持简单。然后,当我遇到作为表的子节点的问题时,我开始为这些子节点提出一个单独的问题。但实际目标始终是适用于任意内容的解决方案。
  • “我们的目标是让第二个容器在某种程度上表现得像第一个容器,这比使用 display:table 进行布局更“正确”” - display: table 有什么问题?使用带有display: table 的元素进行布局是完全可以接受的:)

标签: css css-tables


【解决方案1】:

我认为.container {min-width: 400px;width: min-content;},模供应商前缀,是你想要的。

【讨论】:

    猜你喜欢
    • 2011-11-17
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多