4/5/2014, 4:02:22 AM
rem
单位<input>
按钮<button>
设置type
属性fixed
定位和transform
绝非是标题党,下面的东西至少让你少踩几次坑,翻译完才发现这篇文章已经有人翻译过了,但是经过对比,还是自以为翻译的要用心点:(。
—————译文—————
一些HTML和CSS的组合也许会让你忍不住爆粗口,下面是整理出的列表
如果遗漏文档模型会导致,浏览器使用怪异模式渲染页面,表格,输入框等会显得畸形。
元素设置了padding
,border-width
之后width
值就会变大,如果要改变这种计算的方式,可以使用box-sizing:border-box
来重置。
rem
单位移动端Safari支持rem
单位,但它在使用其作为媒体查询时候会变得很糟糕,页面中的文字会在不同大小间不停闪烁。
对于现在,解决的方案便是,使用em
代替rem
。
html { font-size: 16px; } /* Causes flashing bug in Mobile Safari */
@media (min-width: 40rem) { html { font-size: 20px; } } /* Works great in Mobile Safari */
@media (min-width: 40em) { html { font-size: 20px; } }
求救!,如果你有向Apple或者WebKit提交这个bug的链接,烦请告知。我不确定怎么向移动端,而不是桌面的Safari提交。
译注,此bug,测试的时候并未重现,不知还有什么解答?
浮动的元素应该一直吃在文档顺序的前面。浮动元素需要东西来围绕,否则它们就会引起高度塌陷(step down effect),浮动的反而在内容的下面,在此查看译者的Demo。
<div class="parent">
<div class="float">Float</div>
<div class="content"><!-- ... --></div>
</div>
如果你使用了浮动,你或许需要将其清除。在浮动元素之后的内容将会环绕着浮动元素,直到将其清除。清楚浮动可以使用下面的几种方法。
使用the micro clearfix作为一个单独的class来清除浮动。
.clearfix:before,
.clearfix:after {
display: table;
content: "";
}
.clearfix:after {
clear: both;
}
或者在父元素上设置overflow
为auto
或者hidden
。
.parent {
overflow: auto; /* clearfix */
}
.other-parent {
overflow: hidden; /* clearfix */
}
需要注意的是使用overflow
将会导致一些意想不到的问题,特别是父元素内有绝对定位元素的时候。
高级提示!,将该属性作为清除浮动作用的时候,你可以加上诸如/* clearfix */
之类的注释,以此来提醒你和你的协作者。
父元素只有浮动内容,它的计算后的height:0
。给父元素添加清除浮动将会强制浏览器计算出真正的高度。
元素使用float
之后将会自动变为display:block;
,因此两者不必同时设置,并且float
将会覆盖你的display
。
.element {
float: left;
display: block; /* Not necessary */
}
**有趣的是:**多年之前,我们在浮动元素中设置display:inline;
来让其在IE6中避免双边距叠加(double margin bug)的bug,但是这种情况早已一去不复返。
临近元素(一个跟在另一个后面)的顶部外边距和底部外边距在很多情况下会叠加,但是对于浮动元素或者绝对定位的元素则不会。阅读这篇MDN的文章或者CSS2 spec’s的collapsing margin section来了解更多。
水平方向的临近外边距不会叠加。
如果不在<table>
元素上设置border-collapse:collapse;
,<tr>
元素上的border
属性将不会生效。此外如果<tr>
和它子元素<th>
,<td>
的border-width
值相同,<tr>
元素的border
属性也不会生效。可以在此查看这个例子。
<input>
按钮由于一些未知的原因,Firefox中提交和按钮的<input>
中line-height
属性不能用CSS覆盖。对此下面有两个选择:
<button>
元素。line-height
属性。如果你选择了你一个选项(我也推荐这个,因为<button>
元素确实很棒),你需要知道的是:
<!-- Not so good -->
<input type="submit" value="Save changes" />
<input type="button" value="Cancel" />
<!-- Super good everywhere -->
<button type="submit">Save changes</button>
<button type="button">Cancel</button>
如果你选用了第二种方案,不使用line-height
只是使用padding
来垂直居中按钮文字。在Firefox中查看这个例子及其解决方案。
**好消息!**看起来在Firefox 30的版本中对此做出了修复,这很好,不过需要注意的是这个问题在老的版本中仍然存在。
Firefox在按钮(<input>
以及<button>
)的:focus
状态时添加了内轮廓。
表面上看来这是为了更好的可用性。但是看起来有点丑陋。可使用这样的CSS覆盖它:
input::-moz-focus-inner,
button::-moz-focus-inner {
padding: 0; border: 0;
}
你可以在上述的例子中看到对此的修复。
**高级提示!**确保在按钮、链接和输入框中有focus的状态,以此来为使用tab切换的用户和视力障碍的用户提供更好的可供性(affordance)。
<button>
设置type
属性默认的值是submit
,以此来让表单内的任何按钮可以提交表单。在无需提交表单的按钮中使用type="button"
。
<button type="submit">Save changes</button>
<button type="button">Cancel</button>
对于需要表单之外需要执行动作的<button>
设置type="button"
。
<button class="dismiss" type="button">x</button>
**有趣的是:**似乎IE7不支持<button>
中的value
属性。它读取<button>
元素内(<button>
起始和结束标签内)的文本(innerHTML)。然而我让为这没什么要紧的关系,因为不但IE7的用户在下降,而且很少有看到同时设置<button>
元素的value
属性和元素内的文本。
IE9及以下的IE浏览器支持的一个样式表中选择器的上限是4096。同时一个页面中只容许最多31个样式表的引入(包括外部引入和<style></style>
)。任何超出的样式将会被浏览器忽略,要么分割你的CSS,要么重构你的代码,我建议后者。
作为一个帮助新的提示,下面是浏览器如何计算选择器的:
/* One selector */
.element { }
/* Two more selectors */
.element,
.other-element { }
/* Three more selectors */
input[type="text"],
.form-control,
.form-group > input { }
设置position:fixed;
的元素是相对于浏览器的视口(viewport)。设置position:absolute;
则是相对于最近的设置position
属性为非static
(例如,relative
,absolute
或者fixed
)的父元素。
不要在设置了position:[absolute|fixed];
,以及left
和right
的元素中设置width:100%
。使用width:100%
等同于设置left:0
和right:0
,使用其中一种方案而不是同时使用。
fixed
定位和transform
浏览器破坏position:fixed;
当元素的父元素设置transform
属性。使用transform
也就创建了一个新的包含块(containing block),将会强制父元素有一个position:relative;
并且fixed
的子元素的行为就像position:absolute;
。