课程地址
https://www.imooc.com/video/16490
该文章通过慕课网教程《移动web开发适配秘籍Rem》编写而成,大体上的内容与课程一致。
移动端开发有如下的特点
- 跑在手机端的web页面(H5页面);
- 跨平台;
- 基于webview;
- 告别IE拥抱webkit;
- 更高的适配和性能要求。
常见移动web适配方法
(1)PC端
- 960px/1000px居中;
- 盒子模型,定宽,定高;
- display:inline-block。
(2)移动web
- 定高,宽度百分比;
- flex;
- Media Query(俗称媒体查询,和flex组合被称为响应式布局)。
Media Query详解
(1)基本语法
@media 媒体类型 and (媒体特性){
/css样式/
}
媒体类型:screen,print。。。
媒体特性:maxwidth,max-height,min-width,min-height。。。
(2)基本案例
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MediaQuery</title> <style> * { margin: 0; padding: 0; } .box { 100%; background-color: red; } .inner:nth-child(1) { background-color: red; } .inner:nth-child(2) { background-color: blue; } .inner:nth-child(3) { background-color: yellow; } .inner:nth-child(4) { background-color: green; } @media screen and (max- 320px) { .inner { height: 100px; 25%; float: left; } } @media screen and (min- 321px) { .inner { height: 100px; 100%; } } </style> </head> <body> <div class="box"> <div class="inner"></div> <div class="inner"></div> <div class="inner"></div> <div class="inner"></div> </div> </body> </html>
rem原理与简介
(1)rem是一种字体单位,值根据html根元素大小而定,同样可以作为宽度,高度等单位;
(2)适配原理是将px替换成rem,动态修改html的font-size适配;
(3)兼容IOS6以上和Android2.1以上,基本覆盖所有流行的手机系统。
(4)rem原理代码分析
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" /> <title>Rem</title> <style> html { font-size: 17px; } .box { height: 10rem; 10rem; background-color: red; } .text { color: #fff; font-size: 16px; } /* 1rem = 17px = html的font-size(默认为16px) 10rem = 170px * */ </style> </head> <body> <div class="box"> <p class="text">hello rem</p> </div> </body> </html>
动态修改HTML中fontsize
方式一:使用media
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> html, body { margin: 0; padding: 0; } div { height: 4rem; 100%; background-color: black; font-size: 1rem; color: white; text-align: center; } @media only screen and (min- 360px) and (max- 860px) { html { font-size: 300px; } div { color: red; } } @media only screen and (min- 860px) { html { font-size: 200px; } div { color: green; } } </style> </head> <body> <div>hello rem</div> </body> </html>
方式二:采用JavaScript的方式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> html, body { margin: 0; padding: 0; } div { height: 4rem; 100%; background-color: black; font-size: 1rem; color: white; text-align: center; } </style> </head> <body> <div>hello rem</div> <script> // 获取视窗的宽度 let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth console.log(htmlWidth) // 获取视窗对象 let htmlDom = document.getElementsByTagName('html')[0] console.log(htmlDom) // 设置html的font-size htmlDom.style.fontSize = htmlWidth / 10 + 'px' </script> </body> </html>
rem进阶
(1)rem基准值的计算:1rem = html的font-size
(2)rem数值计算与构建:
(3)rem与scss结合使用:
@function px2rem($px) { $rem: 37.5px; @return ($px/$rem) + rem; } .demo { px2rem(75px); height: px2rem(37.5px); } // 编译后的结果 .demo { 2rem; heigth: 1rem; }
(4)rem适配实战:采用rem高仿网易新闻H5版新闻列表页
- 步骤一:首先得安装好node和webpack,相关教程请上网自行百度,安装成功的结果是输入
node -v
、npm -v
和webpack -v
能够出现相应的版本号; - 步骤二:命令行进入项目的目录,然后执行
npm init
,在项目中创建一个package.json文件; - 步骤三:将课程中package.json文件里面中dependciess这部分代码copy进去;
"dependencies": { "css-loader": "^0.28.9", "node-sass": "^4.7.2", "sass-loader": "^6.0.6", "style-loader": "^0.20.2", "url-loader": "^0.6.2" }
注意: 由于我是全局安装webpack,因此在dependencies中少了一处配置。
项目实战适配的原理分析
首先使用css预编译语言写好样式代码
@function px2rem($px) { // iphone6的宽度除以10 $rem: 37.5px; @return ($px / $rem)+rem; } html { background-color: #f8f8f8; } .header { height: px2rem(40px); 100%; background-color: #6170b1; padding-left: px2rem(32px); box-sizing: border-box; .header-item { list-style-type: none; float: left; color: #D1DFB7; font-size: px2rem(16px); margin-right: px2rem(20px); line-height: px2rem(40px); &:nth-child(2) { color: #fff; font-size: px2rem(17px); } } }
接着将该样式require进一个js文件中,动态更改html的font-size
require("./index.scss"); // 获得屏幕的宽度 let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth; // 获得html的dom let htmlDOM = document.getElementsByTagName('html')[0]; // 设置html的fontsize htmlDOM.style.fontSize = htmlWidth / 10 + 'px';
可能需要用到的其他知识
移动端H5解惑—页面适配
Sass初入门
webpack和node简单安装使用
第一节 课程介绍
第二节