目录
1_移动端适配
1.1_移动端开发
移动端开发目前主要包括三类:
- 原生App开发(iOS、Android、RN、uniapp、Flutter等)
- 小程序开发(原生小程序、uniapp、Taro等)
- Web页面(移动端的Web页面,可以使用浏览器或者webview浏览)
目前移动端设备较多,所以需要进行一些适配。
有两个概念:
-
自适应:根据不同的设备屏幕大小来自动调整尺寸、大小;
-
响应式:会随着屏幕的实时变动而自动调整,是一种自适应;
1.2_视口viewport
视口的概念:
- 在一个浏览器中,可以看到的区域就是视口(viewport);
- fixed就是相对于视口来进行定位的;
- 在PC端的页面中,不需要对视口进行区分,因为布局视口和视觉视口是同一个;
在移动端,布局视口和视觉视口是不太一样的。
- 移动端的网页窗口往往比较小,但希望一个大的网页在移动端可以完整的显示;
- 所以在默认情况下,移动端的布局视口是大于视觉视口的;
移动端视口划分为三种情况:
- 布局视口(layout viewport)
- 视觉视口(visual layout)
- 理想视口(ideal layout)
这些概念的区分,来自ppk,他在移动端浏览贡献很大
https://www.quirksmode.org/mobile/viewports2.html
1.3_布局视口(layout viewport)
-
默认情况下,在PC端的网页在移动端的显示
-
第一,它会按照宽度为980px来布局一个页面的盒子和内容;
-
第二,为了显示可以完整的显示在页面中,对整个页面进行缩小;
-
-
相对于980px布局的这个视口,称之为布局视口(layout viewport);
- 布局视口的默认宽度是980px;
- 布局视口的默认宽度是980px;
1.4_视觉视口(visual viewport)
-
默认情况下,按照980px显示内容,右侧有一部分区域就会无法显示,所以手机端浏览器会默认对页面进行缩放以显示到用户的可见区域中;
-
显示在可见区域的这个视口,就是视觉视口(visual viewport)
-
在Chrome上按shift+鼠标左键可以进行缩放。
1.5_理想视口(ideal viewport)
-
如果所有网页按照980px在移动端布局,最终页面都会被缩放显示。
-
事实上这种方式是不利于移动端的开发,希望设置100px,那么显示的就是100px;
-
**如何做到?**通过设置理想视口(ideal viewport)
-
-
默认情况下的layout viewport并不适合进行布局;
-
可以对layout viewport进行宽度和缩放的设置,以满足正常在一个移动端窗口的布局;
-
这时可以设置meta中的viewport;
<!-- width: 设置布局视口的宽度 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
2_移动端适配方案
2.1_引入
移动端的屏幕尺寸通繁多,有时希望在不同的屏幕尺寸上显示不同的大小;
-
比如设置一个100x100的盒子
-
在375px的屏幕上显示是100x100;
-
在320px的屏幕上显示是(90+)x(90+);
-
在414px的屏幕上显示是(100+)x(100+);
-
-
其他尺寸也是类似,比如padding、margin、border、left,甚至是font-size等等;
多个方案来处理尺寸问题:
- 方案一:百分比设置【基本不用】
- 因为不同属性的百分比值,相对的可能是不同参照物,所以百分比往往很难统一;
- 所以百分比在移动端适配中使用是非常少的;
- 方案二:rem单位+动态html的font-size;
- 方案三:vw单位;
- 方案四:flex的弹性布局;
2.2_ 适配方案:rem单位+动态html的font-size
rem单位是相对于html元素的font-size来设置的,在不同的屏幕下有不同的尺寸,可以动态的修改html的font-size尺寸; 比如如下案例:
-
设置一个盒子的宽度是2rem;
-
设置不同的屏幕上html的font-size
这个方案在开发中,需要考虑两个问题:
-
问题一:针对不同的屏幕,设置html不同的font-size;html的font-size=(屏幕尺寸/10)
-
问题二:将原来要设置的尺寸,转化成rem单位
问题一:如何设置不同屏幕尺寸的font-size ?
- 方案一:媒体查询(通过媒体查询来设置不同尺寸范围内的屏幕html的font-size尺寸)
缺点:需要针对不同的屏幕编写大量的媒体查询;如果动态改变尺寸,不会实时的进行更新。
<style>
@media screen and (min-width: 320px) {
html {
font-size: 20px;
}
}
@media screen and (min-width: 375px) {
html {
font-size: 24px;
}
}
@media screen and (min-width: 414px) {
html {
font-size: 28px;
}
}
@media screen and (min-width: 480px) {
html {
font-size: 32px;
}
}
.box {
width: 5rem;
height: 5rem;
background-color: orange;
}
</style>
- 方案二:手动编写js代码(实时改变屏幕尺寸时,font-size也可以实时更改,可以通过js代码)
方法: 根据html的宽度计算出font-size的大小,并且设置到html上;监听页面的实时改变,并且重新设置font-size的大小到html上;
<script>
// 1.获取html的元素
const htmlEl = document.documentElement
function setRemUnit() {
// 2.获取html的宽度(视口的宽度)
const htmlWidth = htmlEl.clientWidth
// 3.根据宽度计算一个html的font-size的大小
const htmlFontSize = htmlWidth / 10
// 4.将font-size设置到html上
htmlEl.style.fontSize = htmlFontSize + "px"
}
// 保证第一次进来时, 可以设置一次font-size
setRemUnit()
// 当屏幕尺寸发生变化时, 实时来修改html的font-size
window.addEventListener("resize", setRemUnit)
</script>
<style>
body {
font-size: 16px;
}
.box {
width: 5rem;
height: 5rem;
background-color: orange;
}
</style>
- 方案三:lib-flexible库::GitHub上搜索lib-flexible,跟方案二做的事情是相同的,也可以直接引入它;
问题二:已设置不同屏幕尺寸的font-size,宽高如何转换成rem单位?
- 方案一:手动换算
比如在屏幕尺寸为375px中,有一个100px宽度和高度的盒子;计算根元素font-size=375px / 10=37.5px,然后将宽度高度100px转成对应的rem值; (100px)/(37.5px)=2.6667 rem,其他宽高也是相同的方法计算。
- 方案二:less/scss函数
编写一个less或者scss换算函数,需要宽高换算成rem时,带参数直接调用该函数。
//函数定义。@px是参数,是宽高原始的长度
.pxToRem(@px){
//换算公式。返回的结果是rem单位
result:1rem*(@px/@htnmFontSize)
}
.box{
//调用换算函数。直接得到结果
width: .pxToRem(100)[result];
font-size:.pxToRem(18)[result];
}
- 方案三:postcss-pxtorem(后续学习)
目前在前端的工程化开发中,借助于webpack的工具来完成自动的转化;
- 方案四:VSCode插件【px to rem】
这个插件,在编写时自动转化;但是要确认fontsize数值;
2.3_适配方案 vw
flexible库更推荐使用viewport的两个单位vw、wh
vw和rem的对比:
-
rem事实上是作为一种过渡的方案,利用的也是vw的思想。
-
前面rem方案,都是将1rem等同于设计稿的1/10,在利用1rem计算相对于整个屏幕的尺寸大小;
-
1vw等于屏幕的1/100, 而且相对于rem还更加有优势;
-
-
vw相比于rem的优势:
-
优势一:不计算html的font-size大小,不设置html的font-size;
-
优势二:不因设置html的font-size大小,而必须给body再设置一个font-size,防止继承;
-
优势三:不依赖font-size的尺寸,不担心某些原因html的font-size尺寸被篡改,页面尺寸混乱;
-
优势四:vw相比于rem更加语义化,1vw刚才是1/100的viewport的大小;
-
优势五:具备rem之前所有的优点;
-
-
将尺寸换算成vw的单位即可。目前相比于rem,更加推荐使用vw(但是理解rem依然很重要)
宽高如何转换成vw单位?
- 方案一:手动换算
比如在375px屏幕上,有一个100px宽度和高度的盒子;font-size=375px/100=3.75px ;
需要将100px转成对应的vw值;(100px)/(3.75px)=26.667 vw,其他也是相同的方法计算即可;
-
方案二:less/scss函数。参考转换成rem的函数,只需把1/10改成1/100。
-
方案三:postcss-px-to-viewport-8-plugin(后续学习)。 和rem一样,在前端的工程化开发中,可以借助于webpack的工具来完成自动的转化;
-
方案四:VSCode插件——px to vw。 这个插件,在编写时自动转化;
3_ grid布局
3.1_基础概念
Grid Container :元素设置 display:grid;
Grid Item:Grid Container 的直接子项
Grid Iine:构成网格的分割线,垂直线或水平线
Grid Track:两条相邻网格线之间的空间
Grid Area:四条网格线包围的总空间
3.2_常见属性
grid container常见属性:
display;grid template(grid-template-rows;grid-template-columns;grid-template-areas)
grid-gap(grid-colurmni-gap;grid-row-gap);place-items(justify-items;align-items);grid-area;place-content(justify-content;align-content);grid auto flowsgrid(grid-auto-colurnns;grid-auto-rows);grid;
grid item常见属性:
grid-column-start;grid-column-end;grid-row-start;grid-row-end;grid-column;justify-self;grid-row;align-self;place-self;
具体案例学习推荐网站:https://css-tricks.com/snippets/css/complete-guide-grid