如果是 img 标签,不管是否可见(display:none 或 visibility:hidden),都会加载资源, image 或者 svg 都会加载。
如果是 background 引用,display:none 不加载,如果是 visibility:hidden; 加载。
来源: 博客园大牛资深Web开发南辰先生
如果是 img 标签,不管是否可见(display:none 或 visibility:hidden),都会加载资源, image 或者 svg 都会加载。
如果是 background 引用,display:none 不加载,如果是 visibility:hidden; 加载。
来源: 博客园大牛资深Web开发南辰先生
iscolor 是否是颜色 接受正常的颜色关键字和十六位表示法以及RGB表示法等。
isnumber 是否是数字
isstring 是否是字符串
iskeyword 是否是关键字 这个没搞明白到底用来判断什么东西。
isurl 是否是 url 例如 url(…),貌似必须这样子才行。
ispixel 是否是像素 应该判断给定的值是否是 数字+px 的。
ispercentage 是否是百分比 应该判断给定的值是否是 数字+% 的。
isem 是否是 em
isunit 是否是某个单位的,两个参数 如果待验证的值为指定单位的数字则返回 true
用法:(同时包含了 when 的一种用法)
.mixin (@a) when (isnumber(@a)) {
padding:@a;
}
.x {
.mixin(5);
}
如果 .x 中的 mixin 给的是数字的话,输出:
.x {
padding:5;
}
否则什么都不输出。
在经过了IE6 IE7的洗礼之后,我们终于可以放心的使用 inline-block 了,但是在使用 inline-block 的时候,我们总会发现很多莫名其妙的空隙出现在两个 inline-block 元素之间,例如我们的代码如下所示:
<nav>
<a href="#">One</a>
<a href="#">Two</a>
<a href="#">Three</a>
</nav>
nav a {
display: inline-block;
padding: 5px;
background: red;
}
然后在浏览器里面的结果就是:
但是一般情况下,我们这么写,总是想让各个元素紧挨在一起的,如果需要中间有空隙,那我们可以通过 css 来更精确地控制。难道这个是一个 bug。刚刚好可以方便的使用这个属性值了,又出现 bug 了,难道又要骂娘了?
其实,了解了背后的原理,就明白这里其实并不是一个 bug,因为对浏览器来说,回车和换行都会被当做有效地字符,只是看不见而已,由于其被当做有效地字符,所以这个空隙的大小会随着定义的文字大小而改变,所以这里也就是为什么我们不需要它的出现,而要自己控制间隙的原因。那么既然知道了产生这个问题的原意,那就有解决方案来应对它。
方法一,可以通过代码来去掉这个inline-block 元素之间的空格。
<nav>
<a href="#">
One</a><a href="#">
Two</a><a href="#">
Three</a>
</nav>
或者
<nav>
<a href="#">One</a
><a href="#">Two</a
><a href="#">Three</a>
</nav>
或者
<nav>
<a href="#">One</a><!--
--><a href="#">Two</a><!--
--><a href="#">Three</a>
</nav>
然后,这就解决了这个问题,主要就是想办法去掉那个换行或者空格。但是这样子的话,会让我的结构很不好看,尤其是对于处女座的前端来说。
方法二:负边距
nav a {
display: inline-block;
margin-right: -4px;
}
此时需要给相应的元素以负边距来抵消产生的空隙,但是上面的原因说过了,由于跟其字体大小有关系,所以在具体的情况下,需要更具字体来调整。风险是,万一用户系统中没有你设定的字体呢?
方法三:不写结束标签
<ul>
<li>one
<li>two
<li>three
</ul>
方法四:字体大小 0
由于空隙来源于字符,那我让他为 0 的大小不就行了?对嘛,真聪明。
nav {
font-size: 0;
}
nav a {
font-size: 16px;
}
不过,这样的方式,在某些平台以及某些浏览器上是有 bug 的。而且,如果使用 em 作为单位,那么下面的文字再怎么设置都是 0 了(em相对于父级)。
反正,每种方法都不算优雅,但基本都可以解决问题。
但或者,我们有可能根本就不需要 inline-block ,float 如果好用的话。或者以后可以用 flexbox 了。美好的愿望,在国内。
来源于:Fighting the Space Between Inline Block Elements 按自己的理解翻译,未忠实于原文。
方法一:
该方法是将外部容器的显示模式设置成display:table,img标签外部再嵌套一个span标签,并设置span的显示模式为display:table-cell,这样就可以很方便的使用vertical-align象表格元素那样对齐了,当然这只是在标准浏览器下,IE6/IE7还得使用定位。
HTML结构部分:
<div id="box">
<span><img src="images/demo.jpg" alt="" /></span>
</div>
CSS样式部分:
<style type="text/css">
#box {
width:500px;height:400px;
display:table;
text-align:center;
border:1px solid #d3d3d3;background:#fff;
}
#box span {
display:table-cell;
vertical-align:middle;
}
#box img {
border:1px solid #ccc;
}
</style>
<!--[if lte IE 7]>
<style type="text/css">
#box {
position:relative;
overflow:hidden;
}
#box span {
position:absolute;
left:50%;top:50%;
}
#box img {
position:relative;
left:-50%;top:-50%;
}
</style>
<![endif]-->
方法二:
标准浏览器还是将外部容器#box的显示模式设置为display:table-cell,IE6/IE7是利用在img标签的前面插入一对空标签的办法。
HTML结构部分:
<div id="box">
<i></i><img src="images/demo.jpg" alt="" />
</div>
<style type="text/css">
#box{
width:500px;height:400px;
display:table-cell;
text-align:center;
vertical-align:middle;
border:1px solid #d3d3d3;background:#fff;
}
#box img {
border:1px solid #ccc;
}
</style>
<!--[if IE]>
<style type="text/css">
#box i {
display:inline-block;
height:100%;
vertical-align:middle
}
#box img {
vertical-align:middle
}
</style>
<![endif]-->
方法三:
该方法针对IE6/IE7,将图片外部容器的字体大小设置成高度的0.873倍就可以实现居中,标准浏览器还是使用上面的方法来实现兼容,并且结构也是比较优雅。
HTML结构部分:
<div id="box">
<img src="images/demo.jpg" alt="" />
</div>
CSS样式部分:
#box {
width:500px;height:400px;
text-align:center;
border:1px solid #d3d3d3;background:#fff;
/* 兼容标准浏览器 */
display: table-cell;
vertical-align:middle;
/* 兼容IE6/IE7 */
*display:block;
*font-size:349px; /* 字体大小约为容器高度的0.873倍 400*0.873 = 349 */
*font-family:Arial; /* 防止非utf-8引起的hack失效问题,如gbk编码 */
}
#box img {
vertical-align:middle;
}
以上方法来源于:雨夜带刀’s Blog
另一篇关于这个问题解决方案的文章,请看 大小不固定的图片、多行文字的水平垂直居中。
对于 IE6 也可以使用纯 CSS 来实现 position:fixed 的效果。直接上代码吧。
先是结构。
<div class="container">
我是IE6,使用 absolute 模拟 fixed.</br>
这里多多复制几个,效果明显。
</div>
<div class="fixed"></div>
然后是 CSS。
body {
height:100%;
overflow-y:auto;
padding:0px;
margin:0px;
}
.container {
height:1800px;
background:#CCC;
}
.fixed {
position:fixed;
top:50px;
left:50px;
background:red;
height:50px;
width:50px;
}
还有对于 IE6 来说,加一个单独的样式
<!--[if lte IE 6]>
<style type="text/css">
html {overflow-x:auto; overflow-y:hidden;}
.fixed {
position:absolute;
}
</style>
<![endif]-->
原理就是对于 body 设置高度 100%,html 垂直方向上,超出高度给隐藏掉。然后里面的内容自己滚动,而 absolute 的相对于浏览器窗口的话,因为浏览器窗口就那么大,又不滚动,所以 absolute 看起来就 fixed 了。
但是这个有个问题,就是 所有设置了 absolute 和 relative 的元素,都会表现为 fixed 的,所以还是有副作用的。不过可以用来做遮罩层。
例子可以使用 IE6 浏览器访问。
其实对 BFC(Block Formatting Contexts 块级格式化上下文) 听过很多次了,虽然每次都无意中也有用到,但是并没有深入的看看这个到底是个什么东西。今天有点时间看到了这篇文章,但是感觉理解起来有点吃力,所以总结下,按照自己的理解再写一写,一方面加深记忆,一方面,以后自己理解起来也方便。
1. 防止外边距叠加。
这里的防止外边距叠加不是两个同级(兄弟)元素之间的外边距叠加,而是防止父元素和子元素之间的外边距叠加。来个结构:
<div class="a"></div>
<div class="a">
<div class="b"></div>
<div class="b"></div>
</div>
然后样式:
.a, .b {
margin:10px 0;
}
.a {
width:200px;
height:50px;
background:red;
}
.b {
width:100px;
height:10px;
background:blue;
}
此时给 .a .b 都有一个
margin:10px 0;
的外边距。但是并没有触发 .b 的 BFC 特性,此时如图所示:
例子请看:http://jsbin.com/odesoz/3/
然后给 .a 添加
overflow:hidden;
以触发 .a 的 BFC 特性,此时结果如图所示:
红色是 .a ,蓝色是 .b ,且 .b(蓝色) 是 .a(红色) 的子元素,一目了然。
此时的例子请看:http://jsbin.com/odesoz/2/
2. 清除浮动
其实平常我们使用的清除浮动的技巧,也就是利用了 BFC 的原理。
浮动元素导致父级元素的高度塌陷,此时触发父级元素的 BFC,因为
创建了 BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然,同时BFC任然属于文档中的普通流。
其实这句话挺不好理解的,按我的理解,就是这个元素触发了 BFC 然后它就需要按它的行为来,不管里面的元素是什么样子的。不管你浮动不浮动,我多大我就是多大。所以讲浮动闭合(清除)了。
到这里,其实另一点也就呼之欲出了,那是什么呢?就是 只要是可以使父级元素触发 BFC 的特性,都可以闭合浮动。这些就是闭合浮动的原理。(参考)
例子可看:http://jsbin.com/odesoz/5/(清除浮动), http://jsbin.com/odesoz/7/ (未清除浮动)
3. 块级格式化上下文不会重叠浮动元素
其实也就是如果有浮动元素和 BFC 一起的话,BFC 元素,会表现为有宽高的样子。具体请看这篇文章的 3.3,因为我觉得这里写的会比我写得好。而且配图也不错。
那么到底神马是 BFC 呢? (其实这些不想写来着,网上那么多,但还是加深印象吧)
其实说的简单点,就类似于在一个环境中的好几个 display:block 的元素所产生的相互影响的原理和表现。
比较专业的说法就是:它能把一个集合中的 float, margin, clear 等等的各种元素包裹,形成的一个集合就为 BFC , BFC 中的任何都不会对 BFC 外的元素产生影响。
通俗地来说:创建了 BFC 的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然,同时 BFC 仍然属于文档中的普通流。
在普通流( Normal flow )中,在创建了块格式化上下文的元素中的子元素都会按照块格式化上下文提供的规矩来排列自己,除非自己也创建一个新的块格式化上下文。
如何触发块级格式化上下文(BFC)?
float:left|right ,除了none
overflow:hidden|auto|scroll(也就是除了overflow:visible;)
position: absolute|fixed
display:inline-block|table-cell|table
fieldset 元素
表格的单元格(display: table-cells,TD、TH)
表格的标题(display: table-captions,CAPTION)
表格元素创建的 “匿名框” 。(display:table 之后创建的匿名框 http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes)
虽然 IE6 7 不支持 BFC,但是在他们中有一个类似的概念 hasLayout。触发hasLayout的条件:
position: absolute
float: left|right
display: inline-block
width: 除 “auto” 外的任意值
height: 除 “auto” 外的任意值 (例如很多人清除浮动会用到 height: 1% )
zoom: 除 “normal” 外的任意值 (MSDN)
writing-mode: tb-rl (MSDN)
在 IE7 中,overflow 也变成了一个 layout 触发器:
min-width:任何值
min-height:任何值
max-width:除了none之外的任何值
max-height:除了none之外的任何值
overflow: hidden|scroll|auto ( 这个属性在IE之前版本中没有触发 layout 的功能。 )
overflow-x|-y: hidden|scroll|auto (CSS3 盒模型中的属性,尚未得到浏览器的广泛支持。他们在之前IE版本中同样没有触发 layout 的功能)
其他一些知识点,请参考引用文章中的那几篇引用文章。