【问题标题】:How to justify form input fields with css?如何用css证明表单输入字段的合理性?
【发布时间】:2012-06-13 11:24:58
【问题描述】:

我有一个简单的注册输入表单(这里是 haml :)

%form#signup
  %fieldset
    %input.email{type:'text'}
    %br
    .name
      %input.first-name{type:'text'}
      %input.last-name{type:'text'}

和css:

#signup { width: 350px; }
fieldset { width: 100%; }
.name { width: 100%; }
.first-name { width: 30%; }
.last-name { /* occupy remainder of 'name' line */ }

如何设置此样式,使.email 字段是fieldset 的全宽,.last-name 和/或.first-name 字段扩展为也填满fieldset 的整个宽度,并使用右边缘与.email 字段对齐?

是的,在这里使用table 可能更容易,但是有没有简单的css 方法?它只需要在兼容 css3 的浏览器上工作,并在 IE8 和 9 上合理降级。

小提琴链接:http://jsfiddle.net/3UP9H/1

【问题讨论】:

  • 显示您的真实 HTML,最好是发布指向JS Fiddle demo的链接。
  • 好的,jsfiddle.net/3UP9H/1 注意 .email 字段延伸到字段集边界之外(无论如何在 chrome 上)。目标是通过将输入字段扩展为简单地右对齐字段集的每一行全屏宽度。你的解决方案?
  • 您是否接受绝对单位而不是相对单位?既然您为form 本身明确标识350px
  • 字段集宽度是任意的,但理想情况下,元素应仅使用相对度量,以免在整个过程中对大小进行硬编码。

标签: html css forms layout


【解决方案1】:

原始答案出现在hr下方;为了清楚起见,问题的答案似乎是box-sizing(及其供应商前缀变体)的组合,以便在定义的元素width 中包含border-widthpadding ) (而不是它们的宽度是定义宽度 + 边框宽度 + 填充)和 font-size: 0 用于父元素,这消除了两个 input 元素之间的错误空间(尽管空间在技术上仍然存在;它只是没有任何大小来影响周围元素的位置)。

所以,CSS 就是下面第二个示例中的 CSS:

fieldset input[type=text] {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
    width: 350px;
}

fieldset div input[type=text] {
    width: 105px;
    margin: 0;
}

fieldset div input[type=text] + input[type=text] {
    float: right;
    width: 245px;
}

div.name {
    font-size: 0;
}​

JS Fiddle demo.


原答案如下:

一种方法似乎是:

form {
    width: 350px;
}

fieldset {
    width: 100%;
}

​fieldset input[type=text] {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
    display: inline-block;
    width: 350px;
}​​

fieldset div input[type=text] {
    width: 105px;
    margin: 0;
}

fieldset div input[type=text] + input[type=text] {
    float: right;
    width: 241px;
}​

JS Fiddle demo.

box-sizing(以及以供应商为前缀的变体)的用途是简单地将元素的border 以及任何已分配的padding 包含在元素的定义宽度内。

我在链接的演示中使用了自关闭标签input,因为input 元素,据我所知,没有关闭标签</input>

我已经稍微修改了上面的内容,以消除错误空间的问题(在.name 元素中的兄弟input 元素之间需要任意更正以允许它们都在同一行上(因此奇怪width: 241px 在上面的 CSS 中):

form {
    width: 350px;
}

fieldset {
    width: 100%;
}

fieldset input[type=text] {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
    display: inline-block;
    width: 350px;
}

fieldset div input[type=text] {
    width: 105px;
    margin: 0;
}

fieldset div input[type=text] + input[type=text] {
    float: right;
    width: 245px;
}

div.name {
    font-size: 0;
}​

JS Fiddle demo.


编辑以删除固定宽度的测量值,并替换为基于相对、百分比、基于单位的单位(如原始问题中所示):

form {
    width: 350px;
}

fieldset {
    width: 100%;
}

fieldset input[type=text] {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
    display: inline-block;
    width: 100%;
}

fieldset div input[type=text] {
    width: 30%;
    margin: 0;
}

fieldset div input[type=text] + input[type=text] {
    float: right;
    width: 70%;
}

div.name {
    font-size: 0;
}​

JS Fiddle demo.

不幸的是,默认情况下无法将input 元素的宽度设置为100%,同时仍允许同级input 元素具有不同的宽度。或者,有,但它更尴尬,并且需要您明确地将两个兄弟姐妹标识为,尽管可以使用 +~ 组合符选择第二个或以后的兄弟姐妹,但无法选择 first 兄弟姐妹,基于其具有后续兄弟姐妹(没有 JavaScript 或其他脚本语言,无论是客户端还是服务器端)。

【讨论】:

  • 有趣。我会看看盒子尺寸。内联块是无关的。
  • 关于inline-block同意
  • 一般不关心选择器,只关心框大小以使字段对齐。如果您减少对第二次编辑/演示的回答,我会接受它。 @saluce 在这方面也走在了正确的轨道上。谢谢大家!
  • 我已经进行了编辑以澄清,但我不希望从答案中删除信息(除非它明显是错误的),因为在进展过程中可能会有对其他人有用的东西/发展。
  • 太多无关紧要的东西了。我宁愿只看到第一段和最后一个代码示例。少即是多。单行答案是,使用 css 属性 box-sizing 来纠正跨浏览器的 input 字段渲染。
【解决方案2】:
#signup { width: 350px; }
fieldset { width: 100%; border: 1px solid grey; padding:2px;}
.email { width: 99%;margin-bottom:2px; }
.name { width: 100%; }
.first-name { width: 30%; }
.last-name { width : 67% }

DEMO

更新

#signup { width: 350px; }
fieldset { width: 100%; border: 1px solid grey; padding:2px;}
.email { width: 99%;margin-bottom:2px; }
.name { width: 100%; }
.first-name { width: 30%; }
.last-name { width : 67%; float:right; }

DEMO

火狐截图。

【讨论】:

  • 这在 FF 中不起作用。我正在寻找有原则的东西,即 css 通常说“将这些元素扩展为正确的理由”,而不是针对示例恰好起作用(或不起作用)的临时性东西。
  • 不。姓氏字段跳到另一行。这与调整百分比无关。无论字段集的宽度、字体大小、边框装饰等如何(或至少对于给定的边框装饰),它都需要与像素完全对齐。
  • @Sheikh 我在 FF13 中看到了同样的问题
【解决方案3】:

将这两行更改为如下所示:

.email { width: 99%; float: right; }
.last-name { width: 65%; float: right;}​

Fiddle Link

编辑 奇怪的是,Chrome 和 IE 中的 width 是 Firefox 中没有的额外 4px 宽度。问题是 Chrome 和 IE 将边框添加到框的宽度,而 Firefox 会补偿内部文本字段的宽度以使其适合指定范围内的边框。请参阅this version of the fiddle 进行演示。

EDIT2检查此updated fiddle

【讨论】:

  • 再次,这是一种临时解决方案,现在左边缘未对齐。将border: 1px solid grey 放回fieldset 以查看此内容。可能解决方案比调整百分比更复杂。名字的宽度也是任意的,例如。问题只是右(和左)证明字段集中的每一行输入字段。有 CSS 专家吗?
  • 好的,这很接近,jsfiddle.net/SapWq/2 但正如你所说,现在 ff 中有额外的边距。有没有办法在没有 moz 特殊情况的情况下做到这一点?
猜你喜欢
  • 2017-09-11
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2019-12-04
  • 2018-11-10
  • 2022-11-17
  • 1970-01-01
相关资源
最近更新 更多