表与字段集内的水平滚动条

时间:2014-11-12 17:04:22

标签: html css firefox

在我的应用程序中,我有一个包含表数据的字段集。

该表可能包含许多列。 因此,为了避免浏览器窗口获得水平滚动条, 我试图将表格包装到一个包含width: 100%overflow: auto的容器中。

那不起作用。字段集仍然比浏览器的内部宽度更大,从而导致滚动条。我已尝试将width: 100%应用于fieldset。即使position: absolute left:0;right:0;也无效。

稍后多次尝试,我另外添加了min-widthmax-width,然后它似乎有效。嗯,它适用于Chrome,Internet Explorer和Opera。但不是在Firefox中。

在Firefox中,似乎没有办法将字段集的宽度限制为正文宽度。有办法解决这个问题吗?



* {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}
body {
  margin: 1em;
}
fieldset {
  width: 100%;
  max-width: 100%;
  min-width: 100%;
  overflow: auto;
}
table {
  display: block;
  width: 290em;
  table-layout: fixed;
  border-collapse: collapse;
}
table input {
  border: 1px solid transparent;
  width: 100%;
}
td,
th {
  border: 1px solid black;
  width: 10em;
}
.container {
  width: 100%;
  overflow: auto;
}

<fieldset>
  <legend>
    Table Data
  </legend>
  <div class="container">
    <table>
      <tr>
        <th>Year 2001</th>
        <th>Year 2002</th>
        <th>Year 2003</th>
        <th>Year 2004</th>
        <th>Year 2005</th>
        <th>Year 2006</th>
        <th>Year 2007</th>
        <th>Year 2008</th>
        <th>Year 2009</th>
        <th>Year 2010</th>
        <th>Year 2011</th>
        <th>Year 2012</th>
        <th>Year 2013</th>
        <th>Year 2014</th>
        <th>Year 2015</th>
        <th>Year 2016</th>
        <th>Year 2017</th>
        <th>Year 2018</th>
        <th>Year 2019</th>
        <th>Year 2020</th>
        <th>Year 2021</th>
        <th>Year 2022</th>
        <th>Year 2023</th>
        <th>Year 2024</th>
        <th>Year 2025</th>
        <th>Year 2026</th>
        <th>Year 2027</th>
        <th>Year 2028</th>
        <th>Year 2029</th>
        <th>Year 2030</th>
      </tr>
      <tr>
        <td>
          <input value="Val 1">
        </td>
        <td>
          <input value="Val 2">
        </td>
        <td>
          <input value="Val 3">
        </td>
        <td>
          <input value="Val 4">
        </td>
        <td>
          <input value="Val 5">
        </td>
        <td>
          <input value="Val 6">
        </td>
        <td>
          <input value="Val 7">
        </td>
        <td>
          <input value="Val 8">
        </td>
        <td>
          <input value="Val 9">
        </td>
        <td>
          <input value="Val 10">
        </td>
        <td>
          <input value="Val 11">
        </td>
        <td>
          <input value="Val 12">
        </td>
        <td>
          <input value="Val 13">
        </td>
        <td>
          <input value="Val 14">
        </td>
        <td>
          <input value="Val 15">
        </td>
        <td>
          <input value="Val 16">
        </td>
        <td>
          <input value="Val 17">
        </td>
        <td>
          <input value="Val 18">
        </td>
        <td>
          <input value="Val 19">
        </td>
        <td>
          <input value="Val 20">
        </td>
        <td>
          <input value="Val 21">
        </td>
        <td>
          <input value="Val 22">
        </td>
        <td>
          <input value="Val 23">
        </td>
        <td>
          <input value="Val 24">
        </td>
        <td>
          <input value="Val 25">
        </td>
        <td>
          <input value="Val 26">
        </td>
        <td>
          <input value="Val 27">
        </td>
        <td>
          <input value="Val 28">
        </td>
        <td>
          <input value="Val 29">
        </td>
        <td>
          <input value="Val 30">
        </td>
      </tr>
    </table>
  </div>
</fieldset>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

我最终得到了以下解决方法:

当我将fieldsetlegend替换为sectionh3时,表格会按预期使用滚动条进行渲染。为了使该部分看起来像fieldsets,我定义了一个.fieldset类。这可能是这样的:

&#13;
&#13;
.fieldset {
  border: 1px solid silver;
  display: block;
  position: relative;
  margin-top: 1em;
  padding: 1em;
}

.fieldset > h3 {
  position: absolute;
  background-color: white;
  font-weight: normal;
  font-size: 0.8em;
  padding: 0;
  margin: 0;
  top: -0.5em;
}

/* content styling, not relevant to the workaround */
label {
  display: block;
}
&#13;
<section class="fieldset">
  <h3>Fieldset legend</h3>

  <!-- some content -->
  <p>
    <label>Foo</label>
    <input />
  </p>
  <p>
    <label>Bar</label>
    <input />
  </p>
  <p>
    <label>Baz</label>
    <input />
  </p>

</section>
&#13;
&#13;
&#13;

但是,我真的很喜欢fieldsetlegend背后的语义,以便在命名区域内对复杂网络表单的元素进行分组 - 这正是为其制作的字段集(请参阅{{3 }})。

此外,我并不想更改html结构,因为它应该很容易恢复到简单的字段集。所以我想出了一个服务器端解决方案,在DOM树中搜索字段集并用我的假字段集替换它们。该方法的替代方案是使用模板引擎的特征,例如。 &#34;混入&#34;在MDN。在我的特定用例中,用DOM操作库替换标签更容易,因为html代码必须使用WYSIWYG编辑器进行编辑。