移动 Web 开发布局(二)——rem布局、响应式布局

目录

一.rem 布局

1.rem 基础

2.媒体查询

3.less 基础

4.rem 适配方案

5.苏宁首页制作

二.响应式布局

1.响应式开发

2.Bootstrap 前端开发框架

3.Bootstrap 栅格系统

4.阿里百秀首页制作


一.rem 布局

1.rem 基础

  • rem(root em)是一个相对单位,相对于 html 的字体大小。
  • 页面用 rem 进行布局,不同屏幕下只需要修改 html 的字体大小,页面就会同步变化。
html {
   font-size: 12px;  /* 根 html 为 12px */    }
div {
    font-size: 2rem;  /* div 字体大小是 24px */    }

2.媒体查询

2.1 媒体查询定义

  • 媒体查询(Media Query)是CSS3语法,使用 @media,可以实现 根据不同屏幕适配不同样式 。
  • 语法结构为:@media screen and (max-width:800px)  { css样式 }

2.2 媒体查询 + rem 实现元素动态大小变化

  • 为了防止混乱,媒体查询要按照 从小到大 或者 从大到小 的顺序来写。

  • 原理:后面会层叠前面的样式。
/* 注意 屏幕宽度 顺序 从小到大 ! */
/* 页面用 rem 进行布局,不同屏幕下只需要修改 html 的字体大小,页面就会同步变化 */
@media screen and (min-width: 320px) {
            html {
                font-size: 50px;
            }
        }
@media screen and (min-width: 640px) {    /* 通过 媒体查询 动态改变 html字体大小 */
            html {
                font-size: 100px;
            }
        }    
        .top {
            height: 1rem;     /* 注意页面用 rem 布局 */
            font-size: .5rem;
            background-color: green;
            color: #fff;
            text-align: center;
            line-height: 1rem;
        }
    </style>
</head>
<body>
    <div class="top"> 媒体查询 + rem 实现元素动态大小变化 </div>
</body>

2.3 媒体查询引入资源

  • <link> 标签的 media="" 属性 → 引入资源: 针对于不同的屏幕尺寸 调用不同的css文件。
/* 当屏幕大于等于 320px,小于 640px,让div一行显示1个,即 width:100%; */
<link rel="stylesheet" href="style320.css" media="screen and (min-width:320px)">
/* 当屏幕大于等于 640px,让div 一行显示2个,即 width:50%;  */
<link rel="stylesheet" href="style640.css" media="screen and (min-width:640px)">

3.less 基础

3.1 CSS 弊端

  • CSS 没有计算能力,冗余度高,不方便维护、扩展及复用。
  • 比如如果单独写了很多颜色语句,这些颜色语句都设置同一颜色,修改需要改很多条语句。
  • less 这种 css预处理器,可以将 这种颜色 设置为一种变量,这样只需改变变量,而不用改变许多条语句。

3.2 less 介绍及安装

3.2.1 介绍 less(LeanerStyle Sheets):

  • CSS扩展语言、CSS预处理器(常见的有:Sass、Less、Stylus),扩展CSS动态特性。

3.2.2 安装 less

  • ① 安装node.js,可选择版本(8.0),网址:http://nodejs.cn/download/
  • ② 检查是否安装成功,使用cmd命令(win10是window+r 打开运行输入cmd) ---输入“node –v”查看版本
  • ③ 基于nodejs在线安装less,使用cmd命令“npm install -g less”
  • ④ 检查是否安装成功,使用cmd命令“ lessc -v ”查看版本

3.3 less 使用

3.3.1 less变量: @变量名:值;

注意:①必须有@前缀  ②无特殊字符  ③不用数字开头  ④大小写敏感

less代码 的注释 都是//; css代码 的注释 都是/**/。

@color: pink;  // 定义一个 粉色 的变量
@font14: 14px;  // 定义了一个 字体为14像素 的变量
@bcgreen:green;  // 定义一个 绿色背景颜色 的变量
body {
    background-color: @bcgreen;
}
div {
    color: @color;
    font-size: @font14;
}
a {
    font-size: @font14;
}

3.3.2 Easy LESS 插件

保存一下less文件,会自动生成CSS文件。

/* 这是上面 less代码 保存后 自动生成的 css代码 */
body {
  background-color: green;
}
div {
  color: pink;
  font-size: 14px;
}
a {
  font-size: 14px;
}

3.3.3 less 嵌套

  • A. less嵌套 子元素的样式直接写到父元素里面
  • B. 如果有伪类、交集选择器、 伪元素选择器,选择器的前面加 &
//原版 less代码
.nav {
    .logo {        // 1. less嵌套 子元素的样式直接写到父元素里面
        color: green;
    }

    &::before {        // 2. 如果有伪类、交集选择器、 伪元素选择器,选择器的前面加 &
        content: "";
    }
}
//转换后的 css代码
.nav .logo {
  color: green;
}
.nav::before {
  content: "";
}

3.3.4 less 运算

@baseFont: 50px;
html {
    font-size: @baseFont;
}
img {
    width: 82rem / @baseFont;  //运算符两边有空格,单位不同以第一个数字单位为准。
}
  • 运算符中间左右 有个空格(一定要写!!) 隔开 1px + 5。
  • 两个不同的单位的值运算,运算结果取 第一个 值的单位。
  • 两个值之间只有一个值有单位,则运算结果就取该单位。

4.rem 适配方案

4.1 原理:使用 媒体查询 根据不同设备 设置 html 的字体大小,然后 页面元素 使用 rem 做尺寸单位,当 html 的字体大小变化,页面元素尺寸也会发生变化,从而达到等比缩放的适配。

  • 举例:① 选一套标准尺寸:750px
  • 屏幕尺寸(750px) ÷  划分的份数(15)= html 字体大小(50px)=  1rem
  • ③ 页面元素的 rem值 = 页面元素值 / html 字体大小 = 页面元素值(px) / (屏幕尺寸 / 划分的份数)
  • ④ 屏幕大小不一样,划分份数一样,所以最后 html 文字大小不一样,即 1rem 在不同的屏幕下大小不一样

4.2 技术方案(两种均存在)

  • A. less + rem + 媒体查询
  • B. lflexible.js + rem(更简单)

5.苏宁首页制作

5.0 技术选型

  • 采取 单独制作移动页面 方案。
  • 布局采取 rem 适配布局(less + rem + 媒体查询)技术。
  • 本设计图采用 750px 设计尺寸。

5.1 创建屏幕适配等公共样式

  • 新建 common.less 设置常见屏幕尺寸,利用 媒体查询 设置不同的 html 字体大小,除了首页其他页面也需要。
  • 照顾的尺寸有 320px、360px、375px、384px、400px、414px、424px、480px、540px、720px、750px 。
  • 划分的份数定为 15份。
  • PC端可以打开苏宁移动端首页,因此默认 html字体 大小为 50px,默认的 html 字体大小 写在最上面!
html {
    font-size: 50px;    // PC浏览器 默认的 HTML字体大小 一定要写到最上面!
}
@no: 15;    //此次定义的划分的份数 为 15

// 320px 尺寸的屏幕
@media screen and (min-width: 320px) {
    html {
        font-size: 320px / @no;    //求不同屏幕下的 html字体大小 方法:屏幕大小/份数
    }
}
...    //注意 屏幕大小 书写顺序 从小到大
// 750px 尺寸的屏幕
@media screen and (min-width: 750px) {
    html {
        font-size: 750px / @no;   
    }
}

5.2 @import 样式文件中导入样式

  • @import 导入(.less 中使用):可以把一个样式文件导入到另外一个样式文件里。
  • <link> 标签(.html 中使用):把一个样式文件引入到 html 页面里。
  • 如果在 index.less文件中引入前面写的 common公共样式文件,那么保存后 index.less 对应的 index.css 会自动添加 common公共样式文件的内容,在 index.html 文件中 不需要再用 <link>标签 引入 common公共样式文件。
// 首页样式 less文件 index.less
@import "common";    //将前面写的公共部分 common样式文件 的内容引入本 index.less样式文件

5.3 首页 body 样式设置

  • 给 body 添加 最小宽度min-width(重要),默认宽度 width,以及其他样式。
  • 添加 html字体大小变量 @baseFont: 50;  方便其他页面元素的换算(common文件里有写,这里再写一遍)
  • 页面元素的单位全部换算成 rem!(重要)。
@baseFont: 50;
body {
    min-width: 320px;
    width: 15rem;
    margin: 0 auto;
    ...
}

5.4 search-content 搜索模块

  • HTML结构:搜索模块分为左中右,左右部分用a包裹,中间搜索框用 div+form表单。
  • CSS样式①:大盒子采用 flex布局,绝对定位,居中,指定宽高(rem单位)。
.search-content {
    display: flex;
    position: fixed;
    top: 0;
    left: 50%;
    transform: translateX(-50%);
    width: 750rem / @baseFont;
    height: 88rem / @baseFont;    //后面都是 直接量出设计稿px,换单位,/html字体大小
    ...
  • CSS样式②:左侧和右侧利用 rem 动态计算固定的 width,中间利用 flex 占据剩余空间。
    .classify {    //左侧分类举例 宽高本固定 rem实现动态计算
        width: 44rem / @baseFont;
        height: 70rem / @baseFont;
        margin: 11rem / @baseFont 25rem / @baseFont 7rem / @baseFont 24rem / @baseFont;
        background: url(../images/classify.png) no-repeat;
        background-size: 44rem / @baseFont 70rem / @baseFont;     // 背景缩放
    }
    .search {    //中间搜索框部分 flex占据剩余空间一份
        flex: 1;
        input {    //作为搜索框子元素 在less文件中直接 嵌套 在父元素里
            width: 100%;
            height: 66rem / @baseFont;
            border-radius: 33rem / @baseFont;
            ... }}

5.5 banner 和广告模块制作

5.5.1 banner 模块

  • div 固定宽高 用rem实现动态改变,div里面的图片宽高100%随父即可。

5.5.2 ad 广告模块

  • HTML结构:ad-div 中嵌套三个带链接 a 的 img 图片,点击图片不同部分进入不同页面。
  • CSS样式:父盒子ad 采取 display:flex 布局,嵌套的三个a flex=1,a 中的img width:100%。
.ad {
    display: flex;
    a {
        flex: 1;
        img {
            width: 100%;
        }}}

5.6 nav 模块制作

  • HTML结构: nav 标签中 包含10个 a,a 中包含 img + span。
  • CSS样式:nav 中的a 采取浮动实现一行排列,a 中的图片转换为 块元素 + rem固定宽高。

5.7 rem 适配方案2:flexible.js + rem简介

  • 淘宝出的移动端适配库,flexible 默认将屏幕分为 10份。
  • 插件 cssrem:css大小 自动转化为 rem大小,记得改掉 插件默认的 html 字体大小!
  • 不需要再写不同屏幕的 媒体查询,因为里面 js 做了处理,所以要在 index.html 中引入对应的 .js 文件。
    <!-- 引入 flexible.js 文件 -->
    <script src="js/flexible.js"></script>
  • 假设当前设计稿是750px,当屏幕大于750px时,要手动通过 媒体查询 设置 html 字体大小,并且把权重提到最高
@media screen and (min-width: 750px) {
    html {
        font-size: 75px!important;
    }
}

5.8 综合效果展示

二.响应式布局

1.响应式开发

1.1 响应式开发布局原理

用 媒体查询 针对 不同宽度的设备 进行 布局样式 的设置。

<style>
        .container {
            height: 150px;    /* 布局容器一定 不要 单独指定宽度 下面会设置宽度 */
            ...
        }
        /* 1. 超小屏幕下  小于768px  布局容器的宽度为 100% */
        
        @media screen and (max-width: 767px) {
            .container {
                width: 100%;
            }}
        ...
        /* 4. 大屏幕下 大于等于1200px 布局容器的宽度为 1170px */
        @media screen and (min-width: 1200px) {
            .container {
                width: 1170px;
            }}
</style>
<body>
    <!-- 响应式开发里,首先需要一个布局容器 -->
    <div class="container"></div>
</body>

1.2 响应式布局容器

  • 响应式需要一个 父级container 做为布局容器。
  • 在不同的屏幕下 通过 媒体查询 改变布局容器(版心)的大小,进而改变里面子元素的排列方式和大小
  • 父容器版心的尺寸划分:
  1. 超小屏幕(手机,小于 768px):设置宽度为 100%
  2. 小屏幕(平板,大于等于 768px):设置宽度为 750px
  3. 中等屏幕(桌面显示器,大于等于 992px):宽度设置为 970px
  4. 大屏幕(大桌面显示器,大于等于 1200px):宽度设置为 1170px

1.3 响应式导航案例

  • 默认一行显示,所以默认父盒子设置 width:750px,子盒子浮动 + 固定宽度。
  • 利用媒体查询:当屏幕宽度小于 768px 时,父盒子占一整行width:100%,每个子盒子width:33.33%。
<style>
        .container {
            width: 750px;    /* 默认父盒子固定的宽度 */
            margin: 0 auto;
        }
        
        .container ul li {
            float: left;
            width: 93.75px;    /* 默认子盒子一行显示 固定的宽度 */
            ... }
        
@media screen and (max-width: 767px) {    /* 媒体查询判断屏幕是否小于767px */
            .container {
                width: 100%;    /* 符合条件 父盒子自动适应屏幕大小 宽度变为100% */
            }
            .container ul li {
                width: 33.33%;    /* 子盒子无法判断具体宽度 只能占据父盒子的33.33% */
            }}
    </style>
<body>
    <div class="container">
        <ul>
            <li>导航栏1</li>
            ...
            <li>导航栏8</li>
        </ul>
    </div>
</body>

效果展示:   →  

2.Bootstrap 前端开发框架

2.0 常用版本介绍

  • 3.x.x:目前使用最多、稳定,放弃了IE6-IE7。对 IE8 支持,但是界面效果不好。
  • 偏向用于开发响应式布局、移动设备优先的 WEB 项目。

2.1 使用方法

  • 创建 bootstrap 文件夹用来放 bootstrat 资源
  • 创建 html 骨架结构,引入相关样式文件
    <!DOCTYPE html>
    <html lang="zh-CN">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都 *必须* 跟随其后! -->
    
        <title>Bootstrap 101 Template</title>
    
        <!-- Bootstrap 核心样式 -->
        <link href="css/bootstrap.min.css" rel="stylesheet">
    
        <!--[if lt IE 9]>
          <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
          <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
        <![endif]-->
      </head>
    
      <body>
        <div class="container">123</div>
        <div class="container-fluid">123</div>
    
        <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
    
      </body>
    </html>

2.2  bootstrap 布局容器

Bootstrap 需要为 页面内容 和 栅格系统 包裹 container 或者.container-fluid 容器。

  • .container:容器宽度划分同上。
  • .container-fluid:
  1. 流式布局容器 百分百宽度
  2. 占据全部视口(viewport)的容器。

3.Bootstrap 栅格系统

3.1 栅格系统定义

  • 栅格系统 将 父元素 分成 12
  • 子元素的宽度:所占父元素份数决定
  • 例如:子元素占据 3 / 4 等份,相当于设置子元素 width:25%(3 / 12) /  width:33.333%(4 / 12)

3.2 栅格系统使用

  • 栅格系统分为 行 和 列。
  • 先写行,创建一 div 添加类名为 row ,row下面写的 div 为列。
  • 通过类名 决定 列宽 。
  1. col-xs-栅格的数量 (设置超小屏幕);
  2. col-sm-栅格的数量 (设置小屏幕);
  3. col-md-栅格的数量 (设置中等屏幕); 
  4. col-lg- 栅格的数量 (设置大屏幕)。
  • 如果 列的栅格数量 < 12 ,会出现空白部分。
        <!-- 如果孩子的份数相加 6+2+2+1 < 12 则占不满整个container 宽度 会有空白 -->
        <div class="row">
            <div class="col-lg-6">1</div>
            <div class="col-lg-2">2</div>
            <div class="col-lg-2">3</div>
            <div class="col-lg-1">4</div>
        </div>
  • 如果 列的栅格数量 > 12,会换行显示。
        <!-- 如果孩子的份数相加 6+2+2+3 > 12 则多于的那一列会 换行显示 -->
        <div class="row">
            <div class="col-lg-6">1</div>
            <div class="col-lg-2">2</div>
            <div class="col-lg-2">3</div>
            <div class="col-lg-3">4</div>
        </div>
  • 效果展示:
  •  列的类名 可以写多个如 class="col-md-4 col-sm-6" 在不同屏幕下就会有不同的样式。
 <!-- 看每列份数 和 12 的关系 判断每行显示的列数 -->
 <!-- 大屏幕时 一行显示;中等屏幕时 一行装3个 多的部分换行+留白 -->      
 <!-- 小屏幕时 一行装2个;超小屏幕时 一行装1个 -->      
 <div class="row">
            <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">1</div>
            <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">2</div>
            <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">3</div>
            <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">4</div>
        </div>
  • 效果展示: 
  • 每一列默认有左右15像素的 padding,可去除。

3.3 Bootstrap 列嵌套

 <div class="container">
        <div class="row">     <!-- container里面包含了一行row 一行row 包含 3列div -->

            <div class="col-md-4">
                <div class="row"><!-- 第一列div 中 又被四八分了两列 记得给这两列加 row -->
                    <div class="col-md-4">a</div>
                    <div class="col-md-8">b</div>
                </div>
            </div>

            <div class="col-md-4">2</div>
            <div class="col-md-4">3</div>
        </div>
    </div>

3.4 Bootstrap 列偏移

.col-xxx-offset-xxx 可以 将列向右偏移  【通过 为当前元素增加左边距(margin)】。
 <!-- 列偏移 -->
  <div class="row">
      <div class="col-lg-4">1</div>
      <div class="col-lg-4 col-lg-offset-4">2</div>
      <!-- 最终效果:|口  口|记住这两列偏移之前并不是重合的 -->
      <!-- 偏移的份数 就是 12 - 两个盒子的份数 = 6 -->
  </div>

3.5 Bootstrap 列排序

.col-xxx-push-xxx 和 .col-xxx-pull-xxx 改变列(column)的顺序。

 <!-- 列排序 左盒子占了 4份 右盒子占了 8份 左盒子移动 8格 右盒子移动 4格 实现换位 -->
  <div class="row">
      <div class="col-lg-4 col-lg-push-8">左侧</div>
      <div class="col-lg-8 col-lg-pull-4">右侧</div>
  </div>

3.6 Bootstrap 响应式工具

  • 利用 hidden-xs/ md/ sm/ lg  实现 不同屏幕模块的 隐藏。
  • 利用 visible-xs/ md/ sm/ lg  实现 不同屏幕模块的 显示。
<div class="col-xs-3 hidden-md hidden-xs">我会变魔术哦</div>
<span class="visible-lg">我会显示哦</span>

4.阿里百秀首页制作

4.1 技术选型

  • 方案:采取 响应式页面开发方案。
  • 技术:bootstrap框架。
  • 设计图: 采用 1280px 设计尺寸。

4.2 修改 container 最大宽度

效果图采取 1280px, 而 Bootstrap 里面 container 宽度最大为 1170px,因此需要手动改 container 宽度。
@media screen and (min-width: 1280px) {
    .container {
        width: 1280px;
    }}

4.3 整体布局 + logo 模块制作

  • 整体分三部分:<header>、<article>、<aside>  
  • 用栅格布局实现结构的划分:
<div class="container">
        <div class="row">
            <header class="col-md-2"> ... </header>
            <article class="col-md-7"> ... </article>
            <aside class="col-md-3"> ... </aside>
        </div>
</div>
  • <header> 中包含 logo 和 nav 两部分。
  • logo:在大中小屏幕中用图片展示  ,在超小屏幕中用 span 文字展示  
  • 思路:事先准备好一个盒子 在logo里面,它平时是隐藏起来的,只有在超小屏幕下显示。

        <a href="#">
            <!-- 超小屏幕隐藏 图片logo元素 -->
            <img src="images/logo.png" alt="" class="hidden-xs">
            <!-- 超小屏幕显示 文字logo元素 -->
            <span class="visible-xs">阿里百秀</span>
            </a>

4.4 nav 模块制作 + bootstrap 引入字体图标

  • 大中屏幕中 nav-li中的 a无需浮动,转换为块元素设置宽高即可:
  • 小和超小屏幕中 nav-li 中的 a 需要浮动在一行 并且每个宽度为20%:
@media screen and (max-width: 991px) {
    .nav li {
        float: left;
        width: 20%;
    }}
  • nav-li 中 a 的图标是通过 bootstrap 中的类名引入的字体图标,bootstrap 字体图标是加了个::before,调样式即可:
<li><a href="#" class="glyphicon glyphicon-camera">生活馆</a></li>
.nav a::before {
    vertical-align: middle;
    padding-right: 5px;
}

4.5 news 模块制作

  • <article> 包含 news新闻模块 和 publish发表模块 两个部分,前模块需要清除浮动防止影响后模块的布局。
  • HTML结构:ul-li-a-img-p ,一共五组,点击图片文字均可跳转。
  • CSS样式①:每个 li 浮动且占25%,第一个 li 单独设置占50%  
.news li {
    float: left;
    width: 25%;
    ...
}
.news li:nth-child(1) {
    width: 50%;
    ...
}
  • CSS样式②:p 用绝对定位定在 a 上,a 相对定位,转为 块元素 并使宽高100%充满 li,img 宽高100%充满 a
  • CSS样式③:当处于超小屏幕 news 第一个li 宽度为 100% , 剩下的小li  各 50%   
@media screen and (max-width: 767px) {
    .news li:nth-child(1) {
        width: 100%!important;
    }
    .news li {
        width: 50%!important;
    }}

4.6 publish 模块制作

  • publish模块 分为左右两部分,用栅格左文章占9份 右图片占3份。
  • 9、3划分只在小屏幕以上起作用,超小屏幕下右图片隐藏。
  • HTML结构:很多行row,每行row 包含两个div,div 分别包含p 和 img
                    <div class="row">
                        <div class="col-sm-9">    <!-- 文字占 9 份 -->
                            <h3></h3>
                            <p class="hidden-xs"></p>
                            <p> <span class="hidden-xs"></span> </p>
                        </div>
                        <!-- 超小屏幕下隐藏一部分 页面元素 包括图片、文字 -->
                        <div class="col-sm-3 hidden-xs">  <!-- 图片占 3 份 -->
                            <img src="" alt="">
                        </div>
                    </div>

4.7 aside 模块制作 

  • 这里面的按钮文字样式等等 都可以去 bootstrap 中寻找类名复制进来稍作修改:
<span class="btn btn-primary">热搜</span>
<h4 class="text-primary">欢迎加入中国博客联盟</h4>

4.8 效果展示 

大屏幕:

中小屏幕:

超小屏幕:

 

发布了29 篇原创文章 · 获赞 21 · 访问量 1657

猜你喜欢

转载自blog.csdn.net/Lyrelion/article/details/104897126