目录
rem(root em)是一个相对的单位,类似于em。em随着父元素字体大小改变而改变,rem随着html元素字体大小改变而改变,比如html的font-size设置为12px后再设置一个div的宽度为2rem,那么div的宽度就为24px
好处是使用rem为单位,我们只需要修改html的字体大小,就可以改变所有元素的大小,而且是等比例改变
使用rem可以做到下面这些事情
媒体查询(Media Query)是CSS3新语法,使用媒体查询前要加入视口
我们可以使用媒体查询改变html的font-size,从而控制页面中所有元素的大小
媒体查询的语法是这样的

mediatype是媒体类型,主要有下面三个常用值
mediatype的and,not与only叫关键字
media feature是媒体特性,我们了解下面三个

我们下面做一个如果屏幕宽度小于800px时屏幕背景颜色变为青色,否则不变

当宽度小于800px时是这样的

大于800px时是这样的

可以对一个条件进行多次判断,我现在想让宽度小于500px时,背景变为红色,500-800px时变为青色,800px以上不设置背景颜色

宽度小于500px时

500-800之间

大于800

可以使用and连接多个判断条件,比如我现在想要
其余条件不设置背景颜色
那么我们可以在青色的判断条件中加入min-width

500px以下

500-550px

550-800px

800px以上


当宽度小于600px时,盒子是这样的

当宽度在600-700px之间的时候,盒子是这样的

当宽度大于700px时,盒子是这样的

语法是这样的
![]()
我们做个例子

red.css

cyan.css

当屏幕宽度小于650px时,盒子是红色的

大于650px时,盒子是青色的

首先先选择技术方案,两种技术方案原理类似

你会拿到一张原型图,基本只给你一张,如果有多张比例不同的就需要使用媒体查询进行多宽度判断

原型图的宽度基本以750px为准

之后我们定义750px时,html的font-size为50px
之后你在定义元素宽高的时候都使用rem作为单位,比如你在原型图上看到了一个宽150px,高200px的盒子,那么你给的时候就应该给width:3(150/50)rem,height:4(200/50)rem
最后定义媒体查询,比如你现在写一个宽度为320px的媒体查询,那么你应该把font-size修改为21.33px = 320 / (750/50)
苏宁移动端首页地址 苏宁易购(Suning.com)-家电家装成套购,专注服务省心购!

我做到了10个功能那里,下面直接用子绝父相去摆就可以了

项目中使用了less,less的简单用法可以看一下这个
我们关注这些像素值
![]()
media.less
- @diviend:15;
-
- @media screen and (max-width:320px) {
- html {
- font-size:(320px/@diviend);
- }
- }
-
- @media screen and (min-width:320px) and (max-width:360px) {
- html {
- font-size:(360px/@diviend) ;
- }
- }
-
- @media screen and (min-width:360px) and (max-width:375px) {
- html {
- font-size:(375px/@diviend) ;
- }
- }
-
- @media screen and (min-width:375px) and (max-width:384px) {
- html {
- font-size:(384px/@diviend) ;
- }
- }
-
- @media screen and (min-width:384px) and (max-width:400px) {
- html {
- font-size:(400px/@diviend) ;
- }
- }
-
- @media screen and (min-width:400px) and (max-width:414px) {
- html {
- font-size:(414px/@diviend) ;
- }
- }
-
- @media screen and (min-width:424px) and (max-width:480px) {
- html {
- font-size:(480px/@diviend) ;
- }
- }
-
- @media screen and (min-width:480px) and (max-width:540px) {
- html {
- font-size:(540px/@diviend) ;
- }
- }
-
- @media screen and (min-width:540px) and (max-width:720px) {
- html {
- font-size:(720px/@diviend) ;
- }
- }
-
- @media screen and (min-width:720px) and (max-width:750px) {
- html {
- font-size:(750px/@diviend) ;
- }
- }
-
- @media screen and (min-width:750px) {
- html {
- font-size:60px ;
- }
- }
index.less
- // @import 'media';
-
- @rate:25.6;
- body {
- height:3000px;
- }
- // 头部新人大礼包
-
- .header {
- height:(45rem/@rate);
- }
-
- .header img {
- width: 100%;
- height: 100%;
- }
-
- // 搜索框上部
- .up_search {
- display: flex;
- justify-content: space-between;
- align-items: center;
- height: (38rem/@rate);
- background-color: yellow;
- }
-
- .up_search span {
- width:(18rem/@rate);
- height:(30rem/@rate);
- background-size: (18rem/@rate) auto;
- background-repeat: no-repeat;
- margin: 0px 17px;
- }
-
- .up_search span:nth-child(1) {
- background-image: url(../images/class.png);
- }
-
- .up_search span:nth-child(3) {
- background-image: url(../images/mine.png);
- }
-
- .up_search img {
- width:(195rem/@rate);
- height:(38rem/@rate);
- }
-
- // 搜索框
-
- .search {
- position: relative;
- padding-top: (10rem/@rate);
- padding-bottom: (10rem/@rate);
- background-color: yellow;
- }
-
- .search input {
- position: relative;
- left: 50%;
- transform: translate(-50%,0);
- width: 95%;
- height:(35rem/@rate);
- border-radius:(22rem/@rate);
- text-indent: (40rem/@rate);
- font-size: (14rem/@rate);
- border:transparent solid 1px;
- }
-
- .search span {
- position:absolute;
- left:(25rem/@rate);
- line-height:(35rem/@rate);
- font-family: icomoon;
- font-size:(20rem/@rate);
- color:gray;
- z-index: 999;
- }
-
- // 轮播图
- .rotate {
- position: relative;
- overflow: hidden;
- height:(120rem/@rate);
- }
-
- .rotate img {
- position: absolute;
- left: 50%;
- transform: translate(-50%,0);
- width:95%;
- height: 100%;
- border-radius: (15rem/@rate);
- z-index: 999;
- }
-
- .rotate_background {
- position: relative;
- left: 50%;
- transform: translate(-50%,0);
- background-color: yellow;
- width:150%;
- height:(90rem/@rate);
- border-radius: 0 0 70% 70%;
- }
-
- // 免息广告
- .interest_free {
- height:(100rem/@rate);
- background:url(../upload/interset_free.gif);
- background-size: 100% 100%;
- }
-
- // 十个功能
- .ten_function {
- display: flex;
- justify-content: space-around;
- flex-wrap: wrap;
- margin-top: (15rem/@rate);
- }
-
- .ten_function a {
- display: flex;
- flex-direction: column;
- align-items: center;
- width: 20%;
- }
-
- .ten_function a img {
- width: (42rem/@rate);
- height: (42rem/@rate);
- }
-
- .ten_function p {
- font-size:(14rem/@rate);
- }
我手头没有原型图,我直接用iphone6显示出来的界面当作原型图,显示出来的宽度为375

确定了以375px为基准,我们回到刚刚生成的媒体查询css,找到375px的字体大小

发现是25.6px,之后的所有元素大小,可以先用px看一下,看完之后把px改成rem,然后再除我们定义的rate,就可以适配大多数屏幕了
比如说我的这个分类按钮

在原型图中量出来是 18*30px,那么你就这样写

也不一定所有的单位都要用rem,比如我下面的margin用的就是17px,在一定范围内依然正常显示
html
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0">
- <link rel="stylesheet" href="css/initialization.css">
- <link rel="stylesheet" href="css/media.css">
- <link rel="stylesheet" href="css/index.css">
-
- <title>Documenttitle>
- head>
- <body>
- <section class="header"><img src="upload/new_one_199.gif" alt="">section>
-
- <section class="up_search">
- <span>span>
- <img src="upload/cool_summer.gif" alt="">
- <span>span>
- section>
-
- <section class="search">
- <span class="magnifier">span>
- <input type="text" placeholder="空调">
- section>
-
- <section class="rotate">
- <img src="upload/rotate.jpg" alt="">
- <div class="rotate_background">div>
- section>
-
- <section class="interest_free">section>
-
- <section class="ten_function">
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- <a href="#">
- <img src="images/ten_function/one.png" alt="">
- <p>家电p>
- a>
- section>
-
- body>
- html>
在稍微宽一点儿的屏幕中同样使用



上面使用的是技术方案一,现在我们走一下技术方案2中的流程,技术方案二中用到flexible.js
flexible.js项目地址 GitHub - amfe/lib-flexible: 可伸缩布局方案
解压后会有这些文件

我们复制方案一的代码,把media.css与media.less删掉,创建一个名为js的文件夹,然后将index.js放入js中

在index.html中屏蔽掉media.css,然后加入script那一行

在flexible.js除的是10,我们上面除的是15,我们的原型图是375px,所以要将index.less的rate改为37.5

如果这里你没有使用less,也不想用计算器一个一个算,那么你可以使用vscode中的插件cssrem,这个插件在你写px的时候,会自动帮你转换成rem,使用方式在这里有介绍 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动端前端视频教程_哔哩哔哩_bilibili

之后进入initialization.css中取消对body最大宽度与最小宽度的约束

如果你还是想要约束尺寸,你可以这样写

这样我们方案二就做完了,打开后我们可以改变宽度,在改变宽度的过程中会比较丝滑(不存在元素大小突变)

