文章目录
单独制作移动端页面(主流)
流式布局(百分比布局)
- 流式布局,就是百分比布局,也称非固定像素布局。
- 通过盒子的宽度设置成百分比来根据屏幕宽度进行伸缩,不受固定像素限制,内容向两侧填充。
- 流式布局方式是移动web开发使用的比较常见的布局方式。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scaleable=no">
<title>流式布局</title>
<style>
* {
margin: 0;
padding: 0;
}
section {
width: 100%;
max-width: 980px;
min-width: 320px;
margin: 0 auto;
}
section div {
float: left;
width: 50%;
height: 400px;
}
section div:nth-child(1) {
background-color: pink;
}
section div:nth-child(2) {
background-color: purple;
}
</style>
</head>
<body>
<section>
<div></div>
<div></div>
</section>
</body>
</html>
flex布局
传统布局与flex布局
-
传统布局:
- 兼容性好
- 布局繁琐
- 局限性,不能在移动端很好的布局
-
flex弹性布局:
- 操作方便,布局极为简单,移动端应用广泛
- PC端浏览器支持情况较差
- IE11或更低版本,不支持或仅支持部分
-
建议:
- 如果是PC端页面布局,我们还是传统布局
- 如果是移动端或者不考虑兼容性问题的PC端页面布局,我们还是使用flex弹性布局
初体验
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
display: flex;
width: 80%;
height: 300px;
background-color: pink;
justify-content: space-around;
}
div span {
/* width: 150px; */
height: 100px;
background-color: purple;
margin-right: 5px;
flex: 1;
}
</style>
</head>
<body>
<div>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
</body>
</html>
flex布局原理
-
flex是flexible Box的缩写,意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为flex布局。
-
当我们为父元素设置为flex布局以后,子元素的float、clear和vertical-align属性将失效。
-
伸缩布局=弹性布局=伸缩盒布局=弹性盒布局=flex布局。
-
采用flex布局的元素,称为flex容器(flex container),简称容器。它的所有子元素将自动成为容器成员,称为flex项目,简称项目。
- 体验中div就是flex父容器。
- 体验中span就是子容器flex项目。
- 子容器可以横向排列也可以纵向排列。
-
总结:就是通过给父盒子添加flex属性,来控制子盒子的位置和排列方式。
常见父项属性
-
以下6个属性是对父元素设置的:
-
flex-derection
:设置主轴的方向。 -
justify-content
:设置主轴上的子元素排列方式。 -
flex-wrap
:设置子元素是否换行。 -
align-content
:设置侧轴上的子元素的排列方式(多行)。 -
align-items
:设置侧轴上的子元素排列方式(单行)。 -
flex-flow
:复合属性,相当于懂事设置了flex-direction
和flex-wrap
。
-
-
主轴与侧轴:
- 在flex不居中,是分别以主轴和侧轴两个方向,同样的叫法有:行和列,x轴和y轴。
- 默认主轴方向就是x轴方向,水平向右。
- 默认侧轴方向就是y轴方向,垂直向下。
-
属性值:
-
flex-direction
属性决定主轴的方向(即项目的排列方式) -
注意:主轴和侧轴是会变化的,就看flex-direction设置谁为主轴,剩下的就是侧轴。而我们的子元素是跟着主轴来排列的。
属性值 | 说明 |
---|---|
row | 默认从左到右 |
row-reverse | 从右到左 |
column | 从上到下 |
column-reverse | 从下到上 |
div {
/* 给父级添加flex属性 */
display: flex;
width: 800px;
height: 300px;
background-color: pink;
/* 默认的主轴是x轴,我们的元素是跟着主轴排列的*/
/* flex-direction: row; */
/* flex-direction: row-reverse; */
flex-direction: column;
/* flex-direction: column-reverse; */
}
div span {
width: 150px;
height: 100px;
background-color: purple;
}
justify-content
:设置主轴上的子元素排列方式。justify-content
属性定义了项目在主轴上的对齐方式。- 注意:使用这个属性之前一定要确定好那个是主轴。
属性值 | 说明 |
---|---|
flex-start | 默认值,从头部开始,如果主轴是x轴,则从左到右 |
flex-end | 从尾部开始排列 |
center | 在主轴居中对齐(如果主轴是x轴则水平居中) |
space-around | 平分剩余空间 |
space-between | 先两边贴边,再平分剩余空间 |
flex-wrap
:设置子元素是否换行。- 默认情况下,项目都排在一条线(又称"轴线")上。
flex-wrap
属性定义,flex布局中默认是不换行的,如果装不开会缩小子元素的宽度。
属性值 | 说明 |
---|---|
nowrap | 默认值,不换行 |
wrap | 换行 |
align-items
:设置侧轴上的子元素排列方式(单行)- 该属性时控制子项在侧轴(默认是y轴)上的排列方式,在子项为单向的时候使用。
属性值 | 说明 |
---|---|
flex-start | 从上到下 |
flex-end | 从下到上 |
center | 垂直居中 |
stretch | 拉伸(默认值) |
align-content
:设置侧轴上的子元素的排列方式(多行)- 设置子项在侧轴上的排列方式并且只能用于子项出现换行的情况(多行),在单行下是没有效果的。
属性值 | 说明 |
---|---|
flex-start | 在侧轴的头部开始排列 |
flex-end | 在侧轴的尾部开始排列 |
center | 在侧轴中间显示 |
space-around | 子项在侧轴平分剩余空间 |
space-between | 子项在侧轴先分布在两头,再平分剩余空间 |
stretch | 设置子项元素高度平分父元素高度(默认值) |
-
align-content
和align-items
的区别:align-items
使用于单行情况下,是有上对齐、下对齐、居中和拉伸。align-content
适用于换行(多行)情况下,单行情况下无效,可以设置上对齐、下对齐、居中、拉伸预计平均分配剩余空间等属性值。- 总结就是:单行找
align-items
,多行找align-content
。
-
felx-flow
:flex-direction
和flex-wrap
属性的复合属性。-
/* flex-direction: column; flex-wrap: wrap; */ flex-flow: column wrap;
-
相当于简写。
-
flex布局子项常见属性
flex
属性:定义子项目分配剩余空间,用flex来表示占多少份数。
.item {
flex: <number>;/*default 0*/
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
section {
display: flex;
width: 60%;
height: 150px;
margin: 0 auto;
background-color: pink;
}
section div:nth-child(1) {
width: 100px;
height: 150px;
background-color: red;
}
section div:nth-child(2) {
flex: 1;
background-color: slategray;
}
section div:nth-child(3) {
width: 100px;
height: 150px;
background-color: skyblue;
}
</style>
</head>
<body>
<section>
<div></div>
<div></div>
<div></div>
</section>
</body>
</html>
像这样中间灰色的盒子就将剩余空间分成一份。
align-self
:控制子项自己在侧轴上的排列方式。align-self
属性允许单个项目与其他项目不一样的对齐方式,可覆盖align-items
属性。- 默认值为auto,表示继承父元素的
align-items
属性,如果没有父元素,则等同于stretch。
span:nth-child(2) {
/* 设置自己在侧轴上的排列方式 */
align-self: flex-end;
}
order
属性:定义项目的排列顺序。- 数值越小,排列越靠前,默认为0。
- 注意:和z-index不一样。
rem适配布局
rem基础
- rem单位
- rem(root em)是一个相对单位,类似于em,em是父元素字体大小。
- 不同的是rem的基准是相对与html元素的字体大小。
- 比如,根元素(html)设置
font-size=12px;
非根元素设置width:2rem;
则会换成px表示就是24px。
- 优势:可以通过修改html里面的文字大小来改变页面中元素大小,可以整体控制。
媒体查询
-
什么是媒体查询?
- 媒体查询(Media Query)是CSS3新语法。
- 使用
@media
查询,可以针对不同的媒体类型定义不同的样式。 @media
可以针对不同的屏幕尺寸设置不同的样式。- 当你重置浏览器大小的过程中,页面也会根据浏览器的宽度和高度重新渲染页面。
- 目前针对很多苹果手机、Android手机、平板等设备都用得到多媒体查询。
-
语法规范:
- 用
@media
开头,注意@符号。 - mediatype媒体类型。
- 关键字 and not only。
- media feature媒体特性 必须有小括号包含。
- 用
@media mediatype and|not|only (media feature) {
CSS-Code;
}
- mediatype查询类型:
- 将不同的终端设备划分成不同的类型,称为媒体类型。
值 | 解释说明 |
---|---|
all | 用于所有设备 |
用于打印机和打印预览 | |
scree | 用于电脑屏幕、平板电脑、智能手机等 |
- 关键字:
- 关键字将媒体类型或多个媒体特性连接到一起作为媒体查询的条件。
- and:可以将多个媒体特性连接到一起,相当于"且"的意思。
- not:排除某个媒体类型,相当于"非"的意思,可以省略。
- only:指定某个特定的媒体类型,可以省略。
- 媒体特性:
- 每种媒体类型都具有各自不同的特性,根据不同类型的媒体特性设置不同的展示风格。我们暂且了解三个。注意他们要加小括号包含。
值 | 解释说明 |
---|---|
width | 定义输出设备中页面可见区域的宽度 |
min-width | 定义输出设备中页面最小可见区域的宽度 |
max-width | 定义输出设备中页面最大可见区域的宽度 |
/* 这句话的意思就是:在我们屏幕上,并且,最大的宽度是800像素 设置我们想要的样式 */
@media screen and (max-width: 800px) {
body {
background-color: pink;
}
}
/* 媒体查询可以根据不同的屏幕尺寸来改变不同的样式 */
@media screen and (max-width: 500px) {
body {
background-color: purple;
}
}
媒体查询+rem实现元素动态大小变化
- rem单位是跟着html来走的,有了rem页面元素可以设置冉大小尺寸。
- 媒体查询可以根据不同设备宽度来修改样式。
- 媒体查询+rem就可以涉嫌不同设备宽度,实现页面元素大小的动态变化。
引入资源(理解)
- 当样式比较繁多的时候,我们可以针对不同的媒体使用不同的stylesheets(样式表)。
- 原理,就是直接在link中判断设备的尺寸,然后引用不同的css文件。
- 一个建议,我们媒体查询最好的方法是从小到大。
<link rel="stylesheet" href="mystyle.css" media="scree and (min-width: 320px)">
<link rel="stylesheet" href="mystyle.css" media="scree and (min-width: 640px)">
less基础
-
less介绍:
- less(Learn Style Sheets的缩写)是一门CSS扩展语言,也成为CSS预处理器。
- 作为CSS的一种形式的扩展,它并没有减少CSS的功能,而是在现有的CSS语法上,为CSS加入编程式语言的特性。
- 它在CSS的语法基础上,引入了变量,Mixin(混入),运算以及函数等功能,大大简化了CSS的编写,并且降低了CSS的维护成本,就像它的名称所说的那样,Less可以让我们用更少的代码做更多的事情。
- Less中文网址
- 常见的CSS预处理器:Sass、Less、Stylus。
- 总结:Less是一门CSS预处理语言,它扩展了CSS的动态特性。
-
less使用:
-
我们首先新建一个后缀名为less的文件,在这个less文件里面书写less语句。
-
less变量:变量是指没有固定的值,可以改变的。因为我们CSS中的一些颜色和数值经常相等。
@变量名:值;
- 规范:必须有@为前缀;不能包含特殊字符;不能以数字开头;大小写敏感。
-
less编译:本质上less包含一套自定义的语法以及一个解析器。用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的CSS文件。所以,我们需要把我们的less文件,编译生成为css文件,这样我们的html页面才能使用。使用vscode的easy less插件可以转换。
-
less嵌套:使用方法如下,子元素的样式直接写到父元素里面就好了。如果有伪类、伪类选择器、交集选择器,我们内层选择器的前面需要加&。
.header { width: 200px; height: 200px; background-color: pink; a { color: red; &hover { color: blue; } } }
转化为css:
.header { width: 200px; height: 200px; background-color: pink; } .header a { color: red; } .header a:hover { color: blue; }
-
less运算:可以使用加减乘除算术运算。
- 注意:乘号(*)除号(/),运算符的左右两侧必须有空格隔开,两个数参与运算如果只有一个数有单位,则最后的结果就以这个单位为准,两个数都有单位且不一样,最后的结果以第一个单位为准。
-
rem适配方案
- 让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。
- 使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做尺寸单位,当html字体大小变化元素尺寸也会发生变化,从而达到等比缩放的适配。
- rem实际开发适配方案:
- 按照设计稿与设备宽度的比例,动态计算并设置html根标签的font-size大小(媒体查询)。
- CSS中,设计稿元素的宽、高、相对位置等取值,按照同等比例换算为rem为单位的值。
- rem适配方案技术使用(市场主流):
- 技术方案1:less、媒体查询、rem。
- 技术方案2(推荐):flexible.js、rem。
- 总结:两种方案现在都存在、方案2更简单。