CSS 经典样式及问题思考
盒模型问题及处理
当你设置了元素的宽度,实际展现的元素却超出你的设置:这是因为元素的边框和内边距会撑开元素。
盒模型效果css:
.simple {
width: 500px;
margin: 20px auto;
}
.fancy {
width: 500px;
margin: 20px auto;
padding: 50px;
border-width: 10px;
}
问题解决:新增了一个叫做 box-sizing 的CSS属性。当你设置一个元素为 box-sizing: border-box; 时,此元素的内边距和边框不再会增加它的宽度。这里有一个与前一页相同的例子,唯一的区别是两个元素都设置了 box-sizing: border-box;
.simple {
width: 500px;
margin: 20px auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.fancy {
width: 500px;
margin: 20px auto;
padding: 50px;
border: solid blue 10px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
另外可以添加为页面全局有效
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
Position使用及特殊处理
position属性和top、right、bottom、left配合使用,用以设定元素的位置
static
默认属性,表示不会被”positioned“
relative
相对定位,配合top、right、bottom、left使用,表示在原来的位置相对移动
fixed
固定定位(position属性的值为fixed)元素会相对于视窗来定位,这意味着即便页面滚动,它还是会停留在相同的位置。和 relative 一样, top 、 right 、 bottom和 left 属性都可用。
移动端对fixed支持总结: http://bradfrost.com/blog/mobile/fixed-position/
移动端判断浏览器是否支持fixed属性方法如下:
function isSupportFixed() {
var userAgent = window.navigator.userAgent,
ios = userAgent.match(/(iPad|iPhone|iPod)\s+OS\s([\d_\.]+)/),
ios5below = ios && ios[2] && (parseInt(ios[2].replace(/_/g, '.'), 10) < 5),
operaMini = /Opera Mini/i.test(userAgent),
body = document.body,
div, isFixed;
div = document.createElement('div');
div.style.cssText = 'display:none;position:fixed;z-index:100;';
body.appendChild(div);
isFixed = window.getComputedStyle(div).position != 'fixed';
body.removeChild(div);
div = null;
return !!(isFixed || ios5below || operaMini);
}
说明: 对于不支持fixed的浏览器,window.getComputedStyle(div).position计算出来的值会是absolute。
z-index 属性设定了Z轴的位置,元素的默认z-index是0,要始终显示在最上层,可以通过设定z-index
absolute
absolute 与 fixed 的表现类似,但是它不是相对于视窗而是相对于最近的“positioned”祖先元素。如果绝对定位(position属性的值为absolute)的元素没有“positioned”祖先元素,那么它是相对于文档的 body 元素,并且它会随着页面滚动而移动。
如果祖先元素是 position: static; ,那么它的绝对定位子元素会跳过它直接相对于body元素定位。
Float使用
Float属性即浮动属性,设置了float属性的元素是在包含块中浮动显示,会影响自身位置,同时也会影响周围元素的对齐和环绕,其中包含块概念如下:
包含块:浮动元素的包含块就是离浮动元素最近的块级祖先元素。
Float浮动位置和周围位置的关系,此处不做赘述。
清除浮动
高度塌陷:一个块级元素如果没有设置height,其height是由子元素撑开的。对子元素使用了浮动之后,子元素会脱离标准文档流,也就是说,父级元素中没有内容可以撑开其高度,这样父级元素的height就会被忽略,这就是所谓的高度塌陷。
解决方法就是清除浮动。
方法1
哪里有浮动元素,就在其父级元素的内容中增加一个
方法2
在父元素上设置:overflow:hidden 或者 overflow: auto
方法3
after伪元素
.floatParent{
}
.floatParent:after {
display:block; content:''; clear:both; height:0; visibility:hidden;
}
移动端显示
使用 meta viewport:
https://dev.opera.com/articles/an-introduction-to-meta-viewport-and-viewport/
Display属性
block:块级属性,会重新开始一行并撑满容器。常用块级元素有:div、p、form、header、footer、section
inline:行内元素,占用一行并自动换行。常用行内元素有:span、a(用作链接元素)
none:不删除元素的情况下不显示元素,类似于Android View.Gone
inline-block:将对象呈递为内联对象,但是对象的内容作为块对象呈递,它是inline和block的结合
更多display属性:https://developer.mozilla.org/en-US/docs/Web/CSS/display?v=control
flex
采用Flex布局的元素,称为Flex容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex项目(flex item),简称"项目"。
容器具有以下属性:
1.flex-direction
flex-direction属性决定主轴的方向(即项目的排列方向).
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
2.flex-wrap
默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行。
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
3.flex-flow
flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。
.box {
flex-flow: || ;
}
4.justify-content
justify-content属性定义了项目在主轴上的对齐方式。
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
5.align-items
align-items属性定义项目在交叉轴上如何对齐。
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}
6.align-content
align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
垂直居中布局的一种实现
.vertical-container {
height: 300px;
display: -webkit-flex;
display: flex;
-webkit-align-items: center;
align-items: center;
-webkit-justify-content: center;
justify-content: center;
}
参考链接
学习CSS布局:http://zh.learnlayout.com/
CSS示例:http://www.w3school.com.cn/example/csse_examples.asp
Flex: http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html