使用CSS的动态响应表单

时间:2018-09-29 16:34:05

标签: html css forms responsive

我正在尝试创建具有表格格式的多个字段/值的用户输入表单。如果是台式机,它应该显示6列(每个字段名称/值一对),如果它的电话(人像模式)应该仅显示2列。如果是横向,则应该显示4列。

预期输出:电话(纵向)

+--------+---------+
+  Field + Value   +
+--------+---------+
+  Field + Value   +
+--------+---------+
+  Field + Value   +
+--------+---------+

电话(横向模式)

+--------+---------+--------+---------+
+  Field + Value   +  Field + Value   +
+--------+---------+--------+---------+
+  Field + Value   +  Field + Value   +
+--------+---------+--------+---------+
+  Field + Value   +  Field + Value   +
+--------+---------+--------+---------+

iPad或更大

+--------+---------+--------+---------+--------+---------+--------+---------+
+  Field + Value   +  Field + Value   +  Field + Value   +  Field + Value   +
+--------+---------+--------+---------+--------+---------+--------+---------+
+  Field + Value   +  Field + Value   +  Field + Value   +  Field + Value   +
+--------+---------+--------+---------+--------+---------+--------+---------+

我希望它尽可能是纯CSS,因为稍后将由角度构造器填充内容。

但是,由于div似乎粘在一起并且不能连续干净,我无法获得正确的流量!我可能在这里错过了一些东西。在手机人像模式下它可以正常工作,但正如您在下面的笔中所见,它到处都是。

密码笔:Link

这是到目前为止的代码:

            <div class='table-type'>
            <div class='row-type'>
                <div class='cell-type'>Account</div>
                <div class='cell-type'>Acme Incorporated US and Seychelles</div>
                <div class='cell-type'>Geography</div>
                <div class='cell-type'>North America</div>
                <div class='cell-type'>Premier</div>
                <div class='cell-type'>Yes</div>
                <div class='cell-type'>Countact Count</div>
                <div class='cell-type'>23</div>
                <div class='cell-type'>Account Manager</div>
                <div class='cell-type'>Dustin Brown</div>
                <div class='cell-type'>Customer Engineer</div>
                <div class='cell-type'>David Hoff</div>
                <div class='cell-type'>Exec Sponsor</div>
                <div class='cell-type'>Jeff Larabee</div>
            </div>
        </div>

现在使用CSS:

    .table-type
{
    display: table;
    margin-bottom: 5px;
    width:100%;
    table-layout: fixed;
}
.row-type
{
    display: table-row;
}
.cell-type
{
    float: left;
    margin-top: 2px;
    margin-bottom: 2px;
    padding: 5px;
    line-height: 16px;
    font-family: 'Lato', sans-serif;
    border: 4px solid;
    border-color: #fff;
    border-radius: 15px;
    border-spacing: 15px 15px;
}
.cell-type:nth-child(odd)
{
    text-align: right;
}
.cell-type:nth-child(even)
{
    text-align:left;
    font-weight: bold;
    -webkit-border-radius:15px;-moz-border-radius:15px;
    background-color: #e3f2f2;
}
@media (max-width: 500px)
{
    .cell-type:nth-child(3n+3)
    {
        display: block;
    }
    .cell-type:nth-child(odd)
    {
        width:30%;
    }
    .cell-type:nth-child(even)
    {
        width:70%;
    }
}
@media (max-width: 700px) and (min-width: 501px)
{

    .cell-type:nth-child(odd)
    {
        width:20%;
    }
    .cell-type:nth-child(even)
    {
        width:30%;
    }
    .cell-type:nth-child(5n+5)
    {
        display: block;
    }
}
@media (min-width: 701px)
{
    .cell-type:nth-child(odd)
    {
        width:13%;
    }
    .cell-type:nth-child(even)
    {
        width:20%;
    }
    .cell-type:nth-child(7n+7)
    {
        display: block;
    }

}

2 个答案:

答案 0 :(得分:0)

我认为使用flexbox会更容易达到预期的结果:

.row-type {
  display: flex;
  flex-wrap: wrap;
}
.cell-type {
  flex: 0 0 10% 
  /* translates to: flex-grow: 0;
   *                flex-shrink: 0;
   *                flex-basis: 10%;
   */
}
.cell-type:nth-child(even) {
  flex-basis: 15%; 
  /* 10% + 15% = 25% */
}

但是您需要解决的第一个问题是将box-sizing:border-box应用于所有单元格。这将更改考虑填充和边框的方式,使其包含在width属性中(对于flexbox,则包含在flex-basis中),因此您不必设置百分比并扣除填充和边框大小

然后,只需根据父级宽度布置正确的单元格大小即可。为此,选择一个方向(从大到小或从小到大)。我从下面选大到小,但也从小做大。

@media查询之前,在任何@media查询之外的第一个选择间隔中编写规则(这很重要,因为@media查询中的选择器将与外部的规则具有相同的特异性,并且@media内部的规则将仅适用于稍后将它们放置在CSS中的事实。
记住:@media查询不会更改特异性。他们仅根据提供的条件设置内部规则是否适用。 因此,@media查询之前设置的规则仅在后续@media查询(覆盖它们)均不为真时才适用。

然后,使用相同的精确选择器,在适当的@media规则内编写下一个间隔的规则,并继续操作直到到达最后一个@media规则。您只需要覆盖更改的属性,在这种情况下为flex-basis。如果是表格,则为width

我也碰巧认为您的断点有些偏离,因为700px500px太低了,无法作为您的表的断点(我决定将它们从8/6折断到每行1200px,在950px处从6到4 /行,在650px处从4到2 /行)。随意不同意并根据自己的需要和喜好进行调整。

这里是:

.table-type {
  margin-bottom: 5px;
  width: 100%;
}

.row-type {
  display: flex;
  flex-wrap: wrap;
  align-items: stretch; /* you might also try `center` here */
}

.cell-type {
  display: block;
  flex: 0 0 10%;
  margin: 3px 0;
  padding: 7px 12px;
  line-height: 16px;
  min-height: 46px; /* added for equal height cells. removed on mobile */
  font-family: 'Lato', sans-serif;
  border-radius: 16px;
  box-sizing: border-box;
}

.cell-type:nth-child(odd) {
  text-align: right;
}

.cell-type:nth-child(even) {
  flex-basis: 15%;
  font-weight: bold;
  background-color: #eaf5f5;
  box-shadow: inset 0 1px 3px rgba(0,0,0,.06), inset 0 1px 1px rgba(0,0,0,.04), inset 0 2px 1px rgba(0,0,0,.03)
}

@media(max-width: 1200px) {
  .cell-type:nth-child(odd) {
    flex-basis: 13.3333%;
  }
  .cell-type:nth-child(even) {
    flex-basis: 20%;
  }
}

@media(max-width: 950px) {
  .cell-type:nth-child(odd) {
    flex-basis: 20%;
  }
  .cell-type:nth-child(even) {
    flex-basis: 30%;
  }
}

@media(max-width: 650px) {
  .cell-type {
    min-height:0;
  }
  .cell-type:nth-child(odd) {
    flex-basis: 40%;
  }
  .cell-type:nth-child(even) {
    flex-basis: 60%;
  }
}
<div class='table-type'>
  <div class='row-type'>
    <div class='cell-type'>Account</div>
    <div class='cell-type'>Acme Incorporated US and Seychelles</div>
    <div class='cell-type'>Geography</div>
    <div class='cell-type'>North America</div>
    <div class='cell-type'>Premier</div>
    <div class='cell-type'>Yes</div>
    <div class='cell-type'>Countact Count</div>
    <div class='cell-type'>23</div>
    <div class='cell-type'>Account Manager</div>
    <div class='cell-type'>Dustin Brown</div>
    <div class='cell-type'>Customer Engineer</div>
    <div class='cell-type'>David Hoff</div>
    <div class='cell-type'>Exec Sponsor</div>
    <div class='cell-type'>Jeff Larabee</div>
  </div>
</div>


这也可以使用盒子模型(使用floats)来实现。请注意display:table(以及与子元素有关的道具)和box-model 不能一起玩。我的意思是:要使单元格包裹在所需的位置,您需要以下任一选项:

  • 实际上使用display:table-row将单个行的单元格包装在一个不同的DOM元素中(这就是表模型的工作原理)。
  • 通过在行和单元格上分别设置display:block和单元格上float:left来使用浮点数(框模型)。此技术还需要在正确的行单元格结束后进行清除,以避免在单元格之间存在高度差时避免单元格漂浮在错误的位置。

答案 1 :(得分:0)

这是您想要的吗?

.row-type
{
    display: grid;
    justify-items: center;
    align-items: center;
}
...
@media (max-width: 500px)
{ 
    .row-type{
      grid-template-columns: repeat(2,1fr);
    }
}
@media (max-width: 700px) and (min-width: 501px)
{
    .row-type{
      grid-template-columns: repeat(4,1fr);
    }
}
@media (min-width: 701px)
{   
    .row-type{
    grid-template-columns: repeat(8,1fr);
    }
}

https://codepen.io/smollet777/pen/mzypJo?editors=0100