CSS (中)
回顾
HTML5新增的那些
HTML5标准更加的讲究语义化了,借用一张网上的图来说明这些新标签
-
header元素
:header 元素代表“网页”或“section”的页眉。 -
footer元素
:footer元素代表“网页”或“section”的页脚,通常含有该节的一些基本信息,譬如:作者,相关文档链接,版权资料。 -
hgroup元素
: 标签用于对网页或区段(section)的标题进行组合。 -
nav元素
:nav元素代表页面的导航链接区域。用于定义页面的主要导航部分。 -
aside元素
:aside元素被包含在article元素中作为主要内容的附属信息部分,其中的内容可以是与当前文章有关的相关资料、标签、名次解释等。(特殊的section) -
section元素
:section元素代表文档中的“节”或“段”,“段”可以是指一篇文章里按照主题的分段;“节”可以是指一个页面里的分组。section通常还带标题,虽然html5中section会自动给标题h1-h6降级,但是最好手动给他们降级。- 当一个容器需要直接定义样式或通过脚本定义行为时,推荐使用div元素而非section
图灵
一个可爱>技术俱乐部
- 注意标题部分位于它的内部,而不是前面(通常不推荐为那些没有标题的内容使用section)
-
article元素
:article元素最容易跟section和div容易混淆,其实article代表一个在文档,页面或者网站中自成一体的内容,其目的是为了让开发者独立开发或重用。譬如论坛的帖子,博客上的文章,一篇用户的评论,一个互动的widget小工具。(特殊的section)除了它的内容,article会有一个标题(通常会在header里),会有一个footer页脚。
推荐看原博主的博客:传送门
常见问题
为什么出现二级标题比一级的大?
http://www.it1352.com/867990.html
背景与边框
灵活背景定位
- background-position
- 原理:background-positioon:right 10px bottom 20px;指背景位置距离右边10px,距离底部20px.
/**
* Flexible background positioning
* via extended background-position
*/
div {
background: url(http://csssecrets.io/images/code-pirate.svg)
no-repeat bottom right #58a;
background-position: right 20px bottom 10px;
/* Styling */
max-width: 10em;
min-height: 5em;
padding: 10px;
color: white;
font: 100%/1 sans-serif;
}
https://codepen.io/AlexZ33/pen/JjoRvRP
/**
* Flexible background positioning
* via calc()
*/
div {
background: url(http://csssecrets.io/images/code-pirate.svg)
no-repeat bottom right #58a;
background-position: calc(100% - 20px) calc(100% - 10px);
/* Styling */
max-width: 10em;
min-height: 5em;
padding: 10px;
color: white;
font: 100%/1 sans-serif;
}
http://dabblet.com/gist/b5fcb42d055427ab6c1a
https://codepen.io/AlexZ33/pen/QWwKrKm
- background-origin
- 作用:用于设置背景的原始位置依据,值为content-box,padding-box,border-box;
/**
* Flexible background positioning
* via extended background-position
*/
div {
background: url(http://csssecrets.io/images/code-pirate.svg)
no-repeat bottom right #58a;
background-origin: content-box;
/* Styling */
max-width: 10em;
min-height: 5em;
padding: 10px;
color: white;
font: 100%/1 sans-serif;
}
http://dabblet.com/gist/0f19ac5d28d0aa7b6c60
https://codepen.io/AlexZ33/pen/xxbEjRK
边框内圆角
- 原理:利用outline和box-shadow组合实现内圆角(outline目前没有实现圆角)
- https://www.html.cn/tool/css3Preview/Box-Shadow.html
- 方法二:两个元素来实现,当然这样增加了额外的html标签
https://codepen.io/AlexZ33/pen/vYEXjgX
横向条纹背景
- 原理:利用
bacground:linear-gradient(red 50%,green 50%)
实现双条纹,利用background-size:100% 30px
实现单个条纹高15px
垂直条纹背景
- 原理:设置
linear-gradient
角度为90deg,或to right
,通过background-size:30px 100%
设置条纹单个宽15px
斜向条纹
- 原理:45deg斜向条纹,利用 勾股定理计算出 条纹若30px时,需要background-size对应的值
60度斜向条纹
- 原理:通过
background:repeating-linear-gradient(60deg,red,red 15px,blue 15px ,blue 30px)
实现
灵活同色系条纹
- 应用场景:如bootstrap的进度条,由深色背景+同色系浅背景的斜条纹组成
- 原理:同色系深色作为背景色,再通过叠加
白色半透明
和透明条纹,实现深浅间隔条纹
蓝色网格背景
- 原理:利用background-image:linear-gradient()支持分隔叠加的属性方式
波点背景图
- 原理:利用
background:radial-gradient(green 30%,transparent 0)
实现,径向渐变由内向外
动态loading图
- 原理:通过叠加多个animation,实现连续动画效果(旋转,变色,边框宽度增加)
https://codepen.io/AlexZ33/pen/abzmGWo
连续的图像边框
- 原理:通过叠加纯白背景(渐变实现,padding-box)和图像背景(border-box)
信封边缘背景
- 原理:通过叠加纯白渐变背景(padding-box)和-45deg条纹渐变(borderbox)
边框背景图实现信封边缘
- 原理:通过border-image值为线性渐变的条纹而实现
移动的虚线边框
- 原理:利用背景叠加实现虚线边框,通过animation实现背景移动产生动态效果
字体脚注效果
- 原理:利用
border-image
属性加一条线性渐变产生的垂直条纹,border-width
控制边框粗线,渐变长度
来控制脚注长度
尺寸
尺寸,我们就应该从单位聊起,对于px这个单位,做网页的应该在熟悉不过了,因此不多做介绍。
那么,我们可以来介绍一下下面几个单位:
- 百分比:百分比的参照物是父元素,50%相当于父元素width的50%
- rem:这个对于复杂的设计图相当有用,它是html的font-size的大小
- em:它虽然也是一个相对的单位,相对于父元素的font-size,但是,并不常用,主要是计算太麻烦了。
单位只是一个来定义元素大小的相应参考。另一个概念,或许可以用房子来打一个比方,在早年每幢房子都会在房子的外围建一层栅栏,使得整一块地区可以看成房子+内部地块+栅栏+外围地块的模型。而在css中,每个元素也会有盒子模型的概念。
盒子模型:每个元素,都会形成一个矩形块,主要包括四部分:margin(外边距)+border(边框)+padding(内边距)+content(内容)
css中存在两种不同的盒子模型,可以通过box-sizing设置不同的模型。两种盒子模型,主要是width的宽度不同。如图:
width-auto
但是,height的属性值也是默认的auto,为什么没有像width一样呢?
其实,auto这个属性值表示的是浏览器自动计算。这种自动计算,需要一个基准,一般浏览器都是允许高度滚动的,所以,会导致一个问题——浏览器找不到垂直方向上的基准。
同样地道理也会被应用在margin属性上。相信如果考察居中时,水平居中你可能闭着眼睛都能写出来,但是垂直居中却绕着脑袋想。这是因为如果是块级元素水平居中只要将水平方向上的margin设置成auto就可以了。但是,垂直方向上却没有这么简单,因为你设置成auto时,margin为0。这个问题,还是需要仔细思考一下的。
到此为止,布局最基本的部分我们已经将去大半,还有就是一块浮动。
正常文档流
如果你选择没有用任何CSS来改变页面布局的网页,那么HTML元素就会排列在一个正常流(Normal Flow)之中。在正常流中,元素盒子(任何一个HTML元素其实就是一个盒子)会基于文档的写作模式一个接一个地排列(根据不同的文档写作模式,排列方向不一样)。这就意味着,如果你的写作模式是水平的(句子是从左到右或从右到左写),正常流会垂直地一个接一个排列页面的块级元素。如果你是在一个垂直方向的写作模式下,句子是垂直方向书写的,那么块级元素会水平方向排列。
确保书写的页面具有良好的结构(HTML结构),可以最大程度复用正常文档流
- 如果浏览器中没有正常流,那么你创建的HTML元素都会堆积在浏览器的右上角。这就意味着,你必须指定所有的HTML元素的布局方式。
- 有了正常流,哪怕是CSS加载失败了,用户仍然能阅读你的页面内容;
布局技术会覆盖默认的布局行为:
**
-
display
属性 — 标准的value,比如block
,inline
或者inline-block
元素在正常布局流中的表现形式 (见 Types of CSS boxes). 接着是全新的布局方式,通过设置display
的值, 比如 CSS Grid 和 Flexbox. - 浮动——应用
float
值,诸如left
能够让块级元素互相并排成一行,而不是一个堆叠在另一个上面。 -
position
属性 — 允许你精准设置盒子中的盒子的位置,正常布局流中,默认为static
,使用其它值会引起元素不同的布局方式,例如将元素固定到浏览器视口的左上角。 - 表格布局— 表格的布局方式可以用在非表格内容上,可以使用
display: table
和相关属性在非表元素上使用。 - 多列布局— 这个 Multi-column layout 属性 可以让块按列布局,比如报纸的内容就是一列一列排布的。
拓展阅读 -->
脱离文档流
一旦页面有一个良好的结构,你就需要去决定如何利用它并将它变为我们需要的布局结构。这会涉及到脱离正常文档流
浮动
float(浮动)
浮动被用来将元素盒子向左或向右移动,同时让内容环绕其展示。
要让一个元素进行浮动,需要给该元素的flaot
属性设置为left
或right
。float
的默认值为none
。
.item {
float: left
}
float 属性有四个可能的值:
-
left
— 将元素浮动到左侧。 -
right
— 将元素浮动到右侧。 -
none
— 默认值, 不浮动。 - inherit — 继承父元素的浮动属性。
简单示例:
将两个 demo: 需要注意的是, 当你使某个元素浮动并让文字环绕它时,内容的行框(Line Box)被缩短。如果你让一个元素浮动,同时为紧跟着的包含文本的元素设置一个背景颜色,你会发现背景色会出在浮动元素下方。 如果想要在浮动元素和环绕的文本之间有一定的间距,需要给浮动元素设置margin。在文本元素上设置margin只会让其相对于容器缩进。例如在下面这个例子中,你就需要为左侧浮动的图片设置右边距和下边距。著作权归作者所有。 https://codepen.io/AlexZ33/pen/WNbbgmO 一旦对一个元素进行了浮动,所有接下来的元素都会环绕它,直到内容处理它下方才开始应用正常文档流。如果想要避免这种情形,可以手动清除浮动。 更好的写法
定位的概念就是它允许你定义一个元素相对于其他正常元素的位置,它应该出现在哪里,这里的其他元素可以是父元素,另一个元素甚至是浏览器窗口本身。还有就是浮动了,其实浮动并不完全算是定位,它的特性非常的神奇,以至于它在布局中被人广泛的应用。我们会在后文中专门提及它的。 简单地,介绍一下position的属性值的含义后,在来看一下偏移量top、right、bottom、left四个属性。 其实,这里说描述的内容,应该都是需要理解的。这些相对于布局来说是基础的,同时也是非常重要的。需要注意的是,这里的偏移量其实已经涉及到了接下来要说的尺寸。在做自适应布局设计时,往往希望这些偏移量的单位能够使用百分比,或者相对的单位例如rem等。 fixed: 实践:
**
https://codepen.io/AlexZ33/pen/BaBvbEr 使用这个技巧,从单行文本、段落到box,都会垂直对齐。目前浏览器对 https://codepen.io/AlexZ33/pen/qBBewPE **
left
,另外一个浮动为 right
。这意味着它们其中一个往左靠,另外一个往右靠。给这两个元素分别设置 width
值,使得它们能够在同一行放下来,并且设置一个水平的间距(总宽度不要大于100%!).
https://codepen.io/AlexZ33/pen/povvOQd
实践:
https://game.xiaomi.com/clear(清除浮动)
如果不想要在某个元素受到其之前的浮动元素影响时,可以为其添加clear属性。left值表示清除左边的浮动,right值表示清除右浮动,both值表示清除左右两边的浮动。.clear {
clear: both;
}
如果希望元素在浮动元素之后开始排列,那么上面的代码可以达到你的需求。如果你发现在容器内有一个浮动元素,同时容器内文本内容过短时,就会出现问题。文本盒子会被绘制在浮动元素下,然后接下来的部分会以正常流方式绘制在其后。著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。.clear::after {
display: block;
content: '';
clear: both;
}
典型的CSS清除浮动
.clearfix:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
.clearfix { display: inline-block; }
html[xmlns] .clearfix { display: block; }
* html .clearfix { height: 1%; }
新版清除浮动(2011)
.clearfix:before, .container:after { content: ""; display: table; }
.clearfix:after { clear: both; }
/* IE 6/7 */
.clearfix { zoom: 1; }
绝对定位
定位
谈及定位,我们就得从position属性说起。你能准确的说出position的属性值吗?相信你可以完美地说出这么六个属性值:static、relative、absolute、fixed、sticky和inherit。
不清楚,当初在初学css的时候,会不会与margin这个属性混淆?其实,它们之间是很容易去辨识地。因为这四个属性值,其实是,定位时的偏移量。偏移量不会对static的元素起到作用。而margin,相对应的是盒子模型的外边距,它会对每个元素框起到作用,使得元素框与其他元素之间产生空白。
下面:我们来看一下一些常用定位的偏移
relative-offset
这里设置了top:100px,left:100px。
定位&居中
水平居中
(1). 行内元素的水平居中?
如果被设置元素为文本、图片等
行内元素时,在父元素中设置text-align:center实现行内元素水平居中,将子元素的display设置为
inline-block,使子元素变成行内元素
(2)块状元素的水平居中(定宽)
当被设置元素为
定宽块级元素时用 text-align:center 就不起作用了。可以通过设置“左右margin”值为“auto”来实现居中的。
.child{
width: 200px;
margin: 0 auto;
}
(3)块状元素的水平居中(不定定宽)**
**实际工作中我们会遇到需要为“不定宽度的块级元素”设置居中,比如网页上的分页导航,因为分页的数量是不确定的,所以我们不能通过设置宽度来限制它的弹性。
可以直接给不定宽的块级元素设置text-align:center来实现,也可以给父元素加text-align:center 来实现居中效果。
当不定宽块级元素的宽度不要占一行时,可以设置display 为 inline 类型或inline-block(设置为
行内元素 显示或行内块元素)
.container{text-align:center;background: beige}
.container ul{list-style:none;margin:0;padding:0;display:inline-block;}
.container li{margin-right:8px;display:inline-block;}
垂直居中
和水平居中一样,这里要讲垂直居中,首先设定两个条件即父元素是盒子容器且高度已经设定
1:子元素是行内元素,高度是由其内容撑开的
这种情况下,需要通过设定父元素的line-height为其高度来使得子元素垂直居中
.wrap{
width:200px ;
height: 300px;
line-height: 300px;
border: 2px solid #ccc;
}
.span{
background: red;
}
2:子元素是块级元素但是子元素高度没有设定
在这种情况下实际上是不知道子元素的高度的,无法通过计算得到padding或margin来调整,但是还是存在一些解法。
通过给父元素设定display:table-cell;vertical-align:middle来解决
.wrap{
width:200px ;
height: 300px;
border: 2px solid #ccc;
display: table-cell;
vertical-align: middle;
}
.non-height{
background: green;
}
3:子元素是块级元素且高度已经设定
计算子元素的margin-top或margin-bottom,计算方法为父(元素高度-子元素高度)/2
.wrap{
width:200px ;
height: 300px;
border: 2px solid #ccc;
}
.div1{
width:100px ;
height: 100px;
margin-top: 100px;
background: darkblue;
}
4、最常用方法
怎么垂直对齐容器中的元素是最佳实践呢?
CSS3
的Transform
,可以很优雅的解决这个困惑:.verticalcenter{
position: relative;
top: 50%;
-webkit-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
Transform
的支持是需要关注的,Chrome 4
, Opera 10
, Safari 3
, Firefox 3
, and Internet Explorer 9
均支持该属性水平垂直居中
1、水平对齐+行高
text-align + line-height实现单行文本水平垂直居中
2、水平+垂直对齐
2.若子元素是
图像,可不使用table-cell,而是其父元素用
行高替代高度,且
字体大小设为0。子元素本身设置vertical-align:middle
3、相对+绝对定位
1、使用absolute,利用
绝对定位元素的
盒模型特性,在
偏移属性为确定值的基础上,设置margin:auto