问题描述:父元素不写高度时,子元素写了浮动后,父元素会发生高度塌陷(造成父元素高度为 0)
问题解决
优点:代码少、简单
缺点: 不能和position定位配合使用,超出的尺寸会被隐藏
保险起见,再加height:0。清除个别块元素可能自带的height:16px;
缺点:需要添加多余的空标签并添加属性
box::after{
content: "";
display: block;
clear: both;
height: 0; /*为了清楚个别块元素自带的16px高度*/
}
缺点: 可能产生新的浮动问题
避免垂直方向margin合并
问题: 垂直方向上,两个元素上下margin相遇,两元素的间的距离并不等于两个margin的和。而是等于最大的margin。小的margin会被大的margin吞并。
解决:
结果:下方元素的margin-top受到新外层元素BFC渲染区域的阻隔,不会影响外部上方的元素的margin-bottom了。同理,外部上方元素的margin-bottom,因为在BFC渲染区域之外,所以,也无法影响其内部元素的margin-top了。
避免垂直方向margin溢出
问题:子元素设置margin-top,会超出父元素上边的范围,变成父元素的margin-top。而实际上,子元素与父元素之间,依然是没有margin-top的——效果不是想要的。
解决:
设置新外层元素overflow:hidden
变成一个BFC方式的渲染区域
结果:子元素的margin-top受到外层父元素BFC渲染区域的阻隔,不会影响父元素以外的区域了。子元素的margin-top,才真正成为子元素与父元素上边的间距
其实还可以
为父元素添加上边框,颜色设置为透明
用父元素的padding-top代替第一个子元素的margin-top
在父元素内第一个子元素之前添加一个空的
父元素::before{ content:“”; display:table; }
左固定,右自适应
变成BFC渲染区域,就不会与float:left的左侧元素发生重叠了
防止高度坍塌
网页内容要可以随显示设备的大小而动态调整布局
float属性,的确可以实现根据显示设备大小,自动换行显示。但是,浮动定位float提供的可控制的属性太少了,以至于难于随心所欲的控制布局。
弹性布局就很好的解决了多种设备下自适应和灵活定制布局的目的
概念:
容器
项目
主轴
子元素排列方向上的轴
交叉轴
与主轴方向垂直的轴
父元素上设置的属性
display:flex
flex-direction
指定容器主轴的排列方向
row
row-reverse
column
column-reverse
flex-wrap
当主轴排列不下所有元素时,是否自动换行
默认nowrap
wrap
flex-flow
justify-content
定义项目在主轴上的对齐方式
取值
flex-start
以主轴起点对齐
flex-end
以主轴终点对齐
center
space-between,表示两端对齐
space-around,表示每个项目两端间距相同
align-items
定义所有子元素在交叉轴上的对齐方式
取值
flex-start,表示让项目以交叉轴的起点方向对齐
flex-end,表示让项目以交叉轴的终点方向对齐
center,表示让项目以交叉轴的中线居中对齐
baseline,表示让项目以交叉轴的基线对齐
stretch,表示如果项目未设置尺寸,就让项目在交叉轴上占满所有空间
每个子元素项目可单独设置的属性
order
flex-grow
专门定义项目的放大比例
如果容器有足够的空间,项目可以放大
其值为整数数字,无需单位。
默认情况,项目不放大。
取值越大,占据剩余的空间越多。
取值都一样,则占据空间始终一样大
flex-shrink
align-self
专门单独定义某一个项目在交叉轴上的对齐方式
与align-items属性对比
其取值和align-items完全一样。只是多了一个auto值,表示继承父元素的align-items效果。
水平居中
前提
父元素必须是块级盒子容器
;分隔线
父元素宽度必须已经被设定好
场景1: 子元素是块级元素且宽度没有设定
场景2:子元素是行内元素,子元素宽度是由其内容撑开的
场景3:子元素是块级元素且宽度已经设定
给子元素添加margin:0 auto;
通过计算指定父元素的padding-left或padding-right
计算得到子元素的margin-left或margin-right
通过子元素相对父元素绝对定位
父相子绝
弹性布局
父
垂直居中
前提:
场景1:子元素是行内元素,高度是由其内容撑开的
单行
多行
场景2:子元素是块级元素但是子元素高度没有设定
解法1:通过给父元素设定display:inline/inline-block/table-cell; vertical-align:middle来解决
解法2:flexbox
父元素
场景3:子元素是块级元素且高度已经设定
解法1:计算子元素的margin-top或margin-bottom
解法2:计算父元素的padding-top或padding-bottom
解法3:利用绝对定位,让子元素相对于父元素绝对定位
父相子绝
子元素宽已知
子元素宽未知
解法4:利用flexbox
父元素
总结:垂直和水平方向同时居中
父相子绝
已知子元素宽高
未知子元素宽高
弹性布局
设备物理像素
pt
css像素
px
pc机大屏幕显示器,1px约等于0.76个物理像素
手机小屏幕
所以,px也是一个相对单位
px是为了平衡一个元素在PC上显示的大小与在手机上显示的大小尽量一致而制定的。
但是,因为手机屏幕大小不一,差异较大,所以,反而不希望一个元素在所有手机上显示一样大。而是希望能够自动等比缩放。所以,移动端不要用px
通常PC端大屏浏览器的网页,使用px单位较多
移动端少用,因为px的长度相对固定,无法根据大小不一的移动端设备自适应改变大小
rem
以网页根元素元素上设置的默认字体大小为1rem
用的多
好处
em
父元素的字体大小为1em
rpx
小程序专用
以iPhone6为标准,物理像素750,分辨率375
无论屏幕大小,都将屏幕分成750份,每份就是1rpx。
1rpx=0.5px=1pt
优点
vw/vh
%
中每个属性的含义
viewport
视口
width
视口宽
device-width
user-scalable
initial-scale=1.0
maximum-scale=1.0,minimum-scale=1.0
5种响应式布局方式
flex布局
优点: 代码简单,布局方便
缺点
父相子绝
优点
缺点
grid布局
Flex布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局,
Grid 布局则是将容器划分成“行"和“列”,产生单元格,然后指定"项目所在”的单元格,可以看作是二维布局
Grid布局远比 Flex布局强大。(不过存在兼容性问题)
知识点比较多, 学习成本相对较高, 目前兼容性不如flex布局!
如何
容器属性
grid-template-columns
grid-template-rows
规定共有几行,几列,每行,每列宽多少?
grid-template-columns:100px 100px 100px; // 显示为三列每一列宽度100px
grid-template-columns:repeat(3,100px); //同上
也可以固定格大小,然后优先占满整个宽度
也可以按份数规定列宽
还可以设置最小和最大的大小范围:
还可以请浏览器自己决定长度
还可以定义网格线
column-gap和row-gap
grid-auto-flow
划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是"先行后列".即先填满第一行,再开始放入第二行(就是子元素的排放顺序)
grid-auto-flow: row
grid-auto-flow: column
justify-items(水平方向)/ align-items(垂直方向)
设置单元格内容的水平和垂直的对齐方式
值为:
同时设置两个属性: 简写
justify-content (水平方向)/ align-content(垂直方向)
项目属性
grid-column-start / grid-column-end grid-row-start / grid-row-end
一句话解释,用来指定item的具体位置,根据在哪根网格线
grid-column-start:1;
grid-column-end:3;
grid-column-start:1;
grid-column-end:3;
grid-row-start:1;
grid-row-end:3;
justify-self / align-self
当前单元格内容的水平和垂直对齐方向
place-self
float布局
使用rem作单位,等比缩放
媒体查询
通过媒体查询来设置样式(Media Queries)是响应式设计的核心。
它根据条件告诉浏览器如何为指定视图宽度渲染页面
媒体类型
style
- 在 css文件/less文件 里也可以使用
多设备支持(,分隔)
设备方向(orientation 属性)
使用 orientation 属性可以定义设备的方向
orientation: landscape
orientation: portrait
查询条件
可以使用不同条件限制使用的样式,条件表达式需要放在扩号中
比如
横屏显示
宽度不能超过600px
横屏显示或宽度不超过600px
既不是横屏,宽度又不小于600时,才使用
引入顺序
@import url(big.css) only screen and (min-width:1200px);
@import url(medium.css) only screen and (min-width:900px);
设备的划分情况:
父容器版心的尺寸划分
响应式字体
变量
body {
font: 100% $font-stack;
color: $primary-color;
}
嵌套
li { display: inline-block; }
a {
display: block;
padding: 6px 12px;
text-decoration: none;
}
}
引用父级选择器"&"
a {
font-weight: bold;
text-decoration: none;
&:hover { text-decoration: underline; }
body.firefox & { font-weight: normal; }
}
无论CSS规则嵌套的深度怎样,关键字"&"都会使用父级选择器级联替换全部其出现的位置:
/===== CSS =====/
#main {
color: black; }
#main a {
font-weight: bold; }
#main a:hover {
color: red;
}
- "&"必须出现在复合选择器开头的位置,后面再连接自定义的后缀
- /*===== SCSS =====*/
#main {
color: black;
&-sidebar { border: 1px solid; }
}
/===== CSS =====/
#main {
color: black; }
#main-sidebar {
border: 1px solid;
}
- 嵌套属性
- /*===== SCSS =====*/
.demo {
// 命令空间后带有冒号:
font: {
family: fantasy;
size: 30em;
weight: bold;
}
}
/===== CSS =====/
.demo {
font-family: fantasy;
font-size: 30em;
font-weight: bold; }
引入
// _reset.scss
html, body, ul, ol {
margin: 0;
padding: 0;
}
// base.scss
@import ‘reset’;
body {
font: 100% Helvetica, sans-serif;
background-color: #efefef;
}
混合
.box {
@include border-radius(10px);
}
继承
// 下面代码会正常输出到生成的CSS文件,因为它被其接下来的代码所继承。
%message-common {
border: 1px solid #ccc;
padding: 10px;
color: #333;
}
.message {
@extend %message-common;
}
.success {
@extend %message-common;
border-color: green;
}
.error {
@extend %message-common;
border-color: red;
}
.warning {
@extend %message-common;
border-color: yellow;
}
算术运算符
article[role=“main”] {
float: left;
width: 600px / 960px * 100%;
}
aside[role=“complementary”] {
float: right;
width: 300px / 960px * 100%;
}
上三角
下三角
左三角
右三角
左上三角
右上三角
左下三角
右下三角
如何实现<12px的字
0.5px的线如何实现
问题:
.hr.half-px {
height: 0.5px;
}
解决:
更好的解决: svg
.hr.svg {
background: none;
height: 1px;
background: url(“data:image/svg+xml;utf-8,
”);
}
其中: svg图片是
- 使用svg的line元素画线,stroke表示描边颜色,默认描边宽度stroke-width=“1”,由于svg的描边等属性的1px是物理像素的1px,相当于高清屏的0.5px,另外还可以使用svg的rect等元素进行绘制。
- 但是在firefox挂了
- 解决: 把svg转为base64
- .hr.svg {
background: url(“data:image/svg+xml;utf-8,
”);
background: url(“data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMDAlJyBoZWlnaHQ9JzFweCc+PGxpbmUgeDE9JzAnIHkxPScwJyB4Mj0nMTAwJScgeTI9JzAnIHN0cm9rZT0nIzAwMCc+PC9saW5lPjwvc3ZnPg==”);
}
- 优点,可以利用svg画出各种图形的0.5px线条