# 今日学习任务

  • [ ] 01-移动Web入门

    • [ ] a.知道如何使用谷歌浏览器打开移动Web网页
    • [ ] b.知道meta标签的作用是设置移动端视口
    • [ ] c.知道移动端图片通常使用二倍图
    • [ ] d.了解物理像素与css逻辑像素的区别
  • [ ] 02-流式布局

    • [ ] a.流式布局:宽度使用百分比,高度使用px
    • [ ] b.border-box属性介绍
  • [ ] 03-案例:京东首页

# 01-移动Web入门

# 1.1-移动Web初体验

学习目标 学习总结
什么是移动Web Web:网页
移动:移动设备(手机,平板等)
移动web : 运行在移动设备上的网页
==如何运行移动Web== 1. 按F12打开开发者工具
2.点击左下角 PC/移动设备 切换图标
3.刷新网页
如何模拟手指缩放 ALT+SHIFT+鼠标拖拽

# 1.1.1 移动Web的概念介绍

  • 1.什么是移动Web
    • 运行在移动设备的网页(web),称之为移动端网页(移动web)。所谓的移动设备泛指:手机,平板。
  • 2.如何调试移动web网页
    • a.真机调试:现阶段由于没有学习服务器相关知识,所以暂时不接触真机调试
    • b.chrome浏览器调试:和PC端网页一样,首先按F12打开开发者工具,然后点击做下表手机图标即可(见下图)
      • 移动端网址特点:以m开头
        • 例如:PC端的京东首页是<www.jd.com>,那么移动端京东首页就是<www.m.jd.com>
        • 小技巧:在PC端进入任何网页之后,切换到移动web页面刷新网页,就会自动打开移动端网页

1555244694703

1555245119681

  • 3.移动Web的发展历史
    • 从2014年HTML5正式定稿后移动web就迎来了飞速的发展 因为使用HTML5技术可以更方便 更快捷的开发现代web应用程序

    • 而移动端的手机浏览器都是比较新的 HTML5在移动端的浏览器支持情况都比较好

    • 所以HTML5主要应用就是在移动端 移动web

    • 直到2015 - 2016 - 2017 - 至今 移动web已经发展了很多年 各方面的技术都比较成熟稳定 网上的教程也比较完整成熟 所以现在的web已经到全民移动web的时代了

# 1.2.1-移动端布局特点介绍(暂时了解)

  • 1.移动端网页与PC端网页区别
    • (1)多机型适配
      • pc端布局无需考虑机型适配,但是移动设备(手机,平板)机型尺寸种类特别多,需要考虑不同的机型尺寸适配
    • (2)页面结构简单
      • 相比而言,由于移动设备的屏幕远小于PC端的屏幕,所以移动Web的页面结构比PC端简单
        • 手机性能有限,所以网页一般不会做的太复杂
          • 常见的移动Web页面结构(从上往下):广告栏banner、搜索栏、轮播图、导航栏、商品列表、底部tabbar
  • ==2.移动Web布局核心思想==
    • 1.不允许网页出现横向滚动
      • 移动端一般只适配宽度盛满整个屏幕,高度从上往下滚动
        • pc端布局一般都是使用固定宽度,水平居中且两边留白的方式来布局,所以pc端不用考虑显示屏的宽度,而移动端布局是采用全屏的方式布局,既然是全屏,就要考虑屏幕的适配,因为不同的手机的屏幕宽度是不一样的
    • 2.页面盛满屏幕,盒子宽度与屏幕一致 100%
    • 3.让盒子的内容宽高width/height包含padding与border,避免出现横向滚动条
  • 3.移动Web布局方式介绍
    • (1)流式布局(百分比布局)
      • px不写死,使用%百分比实现比例布局
    • (2)flex伸缩布局(弹性布局)
    • (3)rem布局
      • 以html元素字体大小作为单位. 1rem = html字体大小
    • (4)响应式布局
    • ==注意:以上的布局方式不是每种页面只能使用一种,而是根据实际需求灵活搭配,只要能实现产品经理的需求,使用任何方式都可以(不管黑猫白猫,抓到老鼠就是好猫)==
      • 每种布局方式没有优劣之分,只是各自特点不同,所适用的场景不同而已
      • 例如:能使用百分比就使用百分比,如果百分比不能用,就使用rem,如果rem不能用,就使用固定宽高,总之怎么舒服怎么来。

1555254144385

# 1.3-课后了解:移动端私有前缀

  • 1.什么是私有前缀

    • 浏览器厂商通常都是在属性名称前添加厂商的私有前缀,来测试这些尚未成为标准的特性。 因此,可以借助私有前缀,来解决浏览器对CSS3的兼容性问题。
    • 在移动端,仅有四个独立的浏览器内核,分别为微软的Trident、火狐的Gecko、开源内核Webkit、Opera的Presto。 目前微软的Trident在移动终端上主要为WP7、8系统内置浏览器。Opera的Presto内核主要为 Opera Mobile、OperaMini、欧朋浏览器以及欧朋HD Beta版。Webkit内核的适用范围则较为广泛,Android原生浏览器、苹果的Safari、谷歌Chrome(Android4.0使用) 都是基于Webkit开源内核开发的。
    • UC、Android内置、Chrome、Safari、QQ Browser都是webkit内核,从图上看占了绝大部分的市场份额。 所以一定要伺候好-webkit-。 有的公司干脆只兼容-webkit-,别的兼容比如-ms-都不写
    内核 前缀 主要浏览器
    Trident -ms- Internet Explorer
    Gecko -moz- Firefox
    Webkit -webkit- Chrome、Opera、Safari、Android
    Presto -o- 早期Opera
    .box{
        -webkit-transition:all 1s; 
        -moz-transition:all 1s; 
        -ms-transition:all 1s; 
        -o-transition:all 1s; 
        transition:all 1s; 
    }
    

1555917421876

# 1.2-视口属性介绍

学习目标 学习总结
1.什么是视口? 视口 : 手机网页的大小
2.如何设置视口 <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
3.视口属性的作用 content="width=device-width" : 设置网页大小与当前手机设备屏幕一致
initial-scale=1.0:设置视口初始化缩放为1(不缩放)
user-scalable=no:设置视口不允许用户缩放(绝大多数手机网页都是不能缩放的)
  • 视口:手机网页的大小

  • <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">

    • name:要设置的属性,viewport表示视口
    • content:要设置的内容
    • width=device-width:设置视口宽度与设备宽度一致
    • initial-scale=1.0:设置视口初始化缩放为1(不缩放)
    • user-scalable=no:设置视口不允许用户缩放(绝大多数手机网页都是不能缩放的)
    • 其他属性介绍
      • maximum-scale=5.0:设置视口最大缩放比例为5,如果禁止缩放该属性设置无效
      • m-scale=0.5:设置视口最小缩放比例为0.5
    • 小技巧: 在vscode中设置视口快捷键meta:vp + tab键
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 兼容IE浏览器 -->
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <!--
        1.pc端网页大小 : 可以随意改变
        2.移动端网页大小: 不能改变,取决于手机屏幕大小

        3.视口:移动端网页布局大小
            name:viewport 视口
            content:视口内容属性
                width=device-width:让移动端网页宽度和当前手机屏幕一致
                initial-scale=1.0 : 设置视口默认不缩放
                user-scalable=no : 设置不允许缩放
     -->
    <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">

    <!-- 小技巧:在vscode中输入:  meat:vp   然后tab键可以快速设置移动端视口 -->
    <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> -->
    <title>Document</title>
    <style>
        body{
            margin: 0px;
            padding: 0px;
        }

        .box{
            width: 320px;
            height: 375px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div class="box">班长</div>
</body>
</html>

# 视口单位vh与vw介绍(课外了解)

  • vh与vm与我们第四天将要学习的rem作用非常类似,最大的区别是vh与vm的浏览器兼容性不如rem,所以实际开发中还是rem使用较多
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }

        html{
            height: 100%;
        }

        body{
            height: 300px;
        }

        div{
            background-color: red;


            /* 1.百分比:参照父元素 */
            /* width: 100%;
            height: 100%; */

            /* 2.视口单位  
            vw : 视口宽度百分之一    1vm = %1视口宽度
            vh : 视口高度百分之一    1vh = 1%视口高度 
            vmin: 视口最小值的百分之一 
            vmax:视口最大值百分之一
                竖屏: 1vmin = 1vw  1vmax = 1vh 
                横屏:  1vim = 1vh   1vmax = 1vw
             */
            
            /* 盒子宽高与屏幕宽高一致
            width: 100vw;
            height: 100vh; 
            */

            /* 盒子宽高相等 = 屏幕宽度
            width: 100vw;
            height: 100vw; 
            */

            width: 50vmin;
            height: 50vmax; 
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

# 1.3-高清屏图像适配(2倍图)

学习目标 学习总结
1. 了解分辨率指的是手机屏幕发光点数量
2. 了解图片的尺寸单位是分辨率
==3. 了解移动端 DPr = 2 (1px = 2发光点)== 解释: 图片大小为200*200,代码应该写 100px * 100px
总结 : 移动端图片尺寸(分辨率)需要除以2

# 1.2-屏幕像素介绍(了解)

  • 1.手机屏幕尺寸及ppi
    • 手机屏幕的尺寸一般是采取手机对角线的长度(单位是英寸,1英寸=2.54厘米)作为手机屏幕的尺寸,手机还有一个ppi的参数指的是手机每英寸包含的像素点,这个像素指的是物理像素,ppi越大,手机的像素密度越高。

1555263661160

  • 2.物理像素(设备像素Device Pixel、分辨率)
    • 指的是手机屏幕设备的像素点,可以理解成手机屏幕上的一个发光点,无数的发光点组成了手机屏幕
  • 3.逻辑像素(设备独立像素Device Independent Pixel、css像素)
    • 代表可以通过程序控制使用的虚拟像素
    • css像素:逻辑像素也可以叫做css像素,它指的是组成图像的最小单位,我们知道,图像是由不同颜色像素点组成的。而图像要在屏幕上显示出来,需要通过屏幕的物理像素点显示,在一般的屏幕,一个物理像素点刚好显示一个图像上的css像素,但是,如果是ppi很高的屏幕,那就是多个物理像素显示一个css像素。

1555264086123

  • 4.手机分辨率、开发尺寸、倍率(设备像素比)
    • 手机分辨率:指的就是手机在水平和垂直方向的物理像素点个数
      • 例如iphone5的分辨率为640*1136,表示屏幕水平方向有640个发光点,垂直方向有1136个发光点
        • 这是设备出厂就已经确定的,无法更改,也不能用代码来控制
    • 开发尺寸:指的是手机在水平和垂直方向的显示逻辑像素的个数
      • 例如iphone逻辑像素为320*568,表示如果我使用代码设置一个元素的宽度为320px,则元素宽度与屏幕宽度位置(前提是网页视口与设备宽高一致,否则渲染视口的时候会自动缩放)
    • 倍率DPR(devicePixelRatio): 手机分辨率(物理像素)/开发尺寸(逻辑像素)
      • 课后了解,js代码获取当前设备倍率:window.devicePixelRatio
      • 普通屏幕: DPR为1,表示代码1px对应屏幕上面1个发光点
      • 高清屏幕:DPR为2,表示代码1px对应屏幕上面4个发光点
        • 如果一个设备的ppi超过300,那么此时人的肉眼无法观察到物理像素发光点,所以这种屏幕又称之为retina屏幕 (视网膜高清屏)

1555265050473

1555267057427

  • 需求:在页面展示一张200px*140px的图片

    • 当DRP为1的普通屏幕:由于一个逻辑像素(css像素,图像最小单位)对应一个设备像素(屏幕发光点),此时可以正常显示

    • 当DPR为2的高清屏:由于一个css像素对应4个设备像素,所以图片像素首先会被拉伸放大(造成图像失真),然后加载到手机屏幕,就会导致图像变得模糊。

      • ==图片从小到大会模糊失真,但是由大到小不会==
      • 课后了解,js代码获取当前设备倍率:window.devicePixelRatio
  • 解决方案:如果设备DPR为2,则将图片做成清晰的2倍图400px*280px,然后设置img标签宽高为200px*140px,这样就不会失真

    • DPR为3:同理,正规公司UI会切3倍图,但是由于人的肉眼无法观察,所以很多小公司仍然使用2倍图来适配DPR为2的高清屏。

1555267777086

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 
        1.分辨率(物理像素):手机屏幕的发光点,代码无法控制
        2.css像素(逻辑像素): 1px = 1css像素
        3.dpr: 屏幕发光点(分辨率)/ 屏幕尺寸(css像素)   像素比

        devicePixelRatio:1  1px屏幕会有1个发光点
        devicePixelRatio:2  1px屏幕会有2个发光点
        devicePixelRatio:3  1px屏幕会有3个发光点

        4.图片的 1像素 = 屏幕1发光点(物理像素)
            * pc端:   由于dpr固定为1.   所以  图片是多大,css尺寸就写多大
            * 移动端: 大多数手机dpr为2. 所以  图片是多大,css尺寸就应该除以2
        
        思考题: 假设UI妹子想要显示一个图标 是200px * 200px,她应该切一张多大的图片?
            * 400 * 400

     -->

     <style>
         img{
             /* img标签设置宽度,高度会自动等比例缩放 */
             width: 200px;
         }
     </style>
</head>
<body>
    <img src="images/pic.png" alt="">
    <img src="images/pic_2x.png" alt="">
    <!-- 图片大小 400 280, 对应css像素 应该是 200px * 140px -->
</body>

</html>

<script>
    console.log(window.devicePixelRatio);
    
</script>

# 1.4-移动端布局注意点

  • 学习目标1 : 移动端布局注意点

1.水平方向不能出现滚动条

​ a. 禁止用户缩放

​ b. 元素宽度不能超过视口宽度

2.只适配宽度(使用百分比单位),高度使用固定px

​ * 百分比布局(流式布局):水平方向使用百分比单位,高度使用固定px

3.盒子宽度不能受到padding和margin影响(避免出现滚动条)

​ * 解决方案:设置内减盒子 box-sizing: border-box;

  • 学习目标2 : 内减盒子

    ​ box-sizing: border-box;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <!-- 视口:移动端适配 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <!--移动端布局核心
        1.水平方向不能出现滚动条
            a. 禁止用户缩放
            b. 元素宽度不能超过视口宽度
        2.只适配宽度(使用百分比单位),高度使用固定px
            * 百分比布局(流式布局):水平方向使用百分比单位,高度使用固定px
        3.盒子宽度不能受到padding和margin影响(避免出现滚动条)
            * 解决方案:设置内减盒子 box-sizing: border-box;

     -->

     <style>
         body{
             padding: 0;
             margin: 0;
         }

         .box{
             width: 100%;
             height: 50px;
             background-color: red;

             border: 10px solid green;
             padding: 50px;

             /* box-sizing :盒子真实尺寸 = content + padding + border 
             1.pc端默认值: content-box   width = content 
                * 外扩盒子 : 盒子宽度受padding和border的影响。
             2.移动端一般设置:border-box   width = content + padding + border 
                * 内减盒子    盒子宽度不受padding和border的影响。content会自动内减
              */

             box-sizing: border-box;/*  */
         }
     </style>
</head>
<body>
    <div class="box"></div>
</body>
</html>

1555307962030

1555308158452

1555308324679

  • 3.流式布局经典案例: 两端固定,中间伸缩
    • 思路介绍
      • a.父盒子father,宽度为100%,铺满屏幕,且box-sizing为box-border
      • b.设置父盒子的左右padding为60px
      • c.中间center子盒子宽度为100%
        • 子元素的宽度百分比是相对于父元素的内容(width-padding)
          • 如果不设置center的盒子宽度,思考一下它的默认宽度是多少?
            • 块元素的宽度默认等于父级的宽度减去padding
      • d.左右两边盒子通过绝对定位来实现
        • 子元素绝对定位相对于父元素的内边框左上角

1555310813285

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        body {
            padding: 0;
            margin: 0;
        }

        .father {
            width: 100%;
            height: 50px;
            background-color: pink;
            /* border: 10px solid red; */
            padding: 0px 60px;
            box-sizing: border-box;
        }

        
        .left {
            position: absolute;
            left: 0;
            top: 0;
            width: 60px;
            height: 50px;
            background-color: red;
        }

        .center {
            /* 块元素的宽度默认等于父级的宽度减去padding */
            width: 100%;
            height: 50px;
            background-color: yellow;  
        }

        .right {
            position: absolute;
            right: 0;
            top: 0;
            width: 60px;
            height: 50px;
            background-color: green;  
        }

    </style>
</head>

<body>
    <div class="father">
         <div class="left"></div>
        <div class="center"></div>
        <div class="right"></div>
    </div>
</body>

</html>

# 02-案例:京东首页(流式布局)

1555752891267

# 1.1-移动端初始化css

  • 移动端初始化css与pc端基本一致,不同点如下
    • a.移动端需要设置所有的元素为内减模型(避免padding和border导致出现滚动条)
    • b.移动端字体大小一般为12px
      • pc端默认是16px
    • c.移动端默认a标签点击背景有蓝色高亮,需要取消
* {
    margin: 0px;
    padding: 0px;
    /* 1.内减盒子 */
    box-sizing: border-box;
}

body {
    /* 2.移动端默认字体一般是12px */
    font-size: 12px;
}

li {
    list-style: none;
}

img{
    vertical-align: middle;/* 图片居中 */
}

a {
    color: #000;
    /* 取消a标签默认下划线 */
    text-decoration: none;
    /* 3.移动端点击a链接出现蓝色背景问题解决 */
    -webkit-tap-highlight-color: transparent;
}

input {
    border: 0 none;
    outline-style: none; /*取消轮廓线*/
}

/* 清除浮动 */
.clearfix:after {
    content: "";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
}

.celarfix {
    zoom: 1;
}

# 1.2-布局思路分析

  • 思路分析(盒子模型,最外部版心盒子container)
    • 1.搜索栏:search_bar
      • 流式布局核心:宽度使用百分比,高度尽量使用内容自动撑开
      • 左右两个a标签可以使用padding+绝对定位来实现
      • 精灵图也需要注意二倍图适配,设置background-size为图片的一半
    • 2.banner栏
      • 图片一般只设置宽度,高度自动根据视口大小缩放
    • 3.导航栏:nav_bar
      • 设置li元素浮动之后,别忘记清除ul的浮动。否则ul没有高度
      • 文字居中可以使用text-align:center
      • 图片居中,可以利用快级元素的margin属性
        • 先设置图片display为block
        • 然后设置margin:0 auto;
    • 4.京东快报:jd_news
      • 背景精灵图可以通过设置偏移来模拟padding效果
    • 5.活动广告:adv_show
      • 三个li元素宽度分别为 50% 25% 25%
      • img宽度100%,display为block
      • 间隔线可以设置border-left: 1px solid #e0e0e0
    • 6.商品列表:good_list
    • 7.底部栏:bottom_bar
      • 注意清除ul的浮动
      • 思考:固定定位脱标之后遮挡了标准流的元素内容如何解决?

# 1.3-布局技巧总结

/* css书写顺序

1.定位属性 : position float display left top 2.盒子模型 : width/height padding border margin background 3.文字属性 : color font-size 4.文字样式: text-align line-height 5.css3新增样式: border-radius */

  • 1.宽度适配技巧

    • div宽度使用百分比,高度使用px或者由内容撑开
    • 图片设置宽度为百分比,高度自动等比例缩放
  • 2.子元素浮动之后千万不要忘记清除父元素浮动

  • 3.居中技巧

    • 快级元素:margin:0 auto
    • 行内元素水下居中:display:block margin:0 auto
    • 文字水平居中:text-align:center

# 1.4-开发流程

# 1-搜索栏

1555754888513

<!-- 1-搜索栏 -->
<div class="top-bar">
    <a href="" class="menu"></a>
    <input type="text" placeholder="商品名称">
    <a href="" class="login">登录</a>
</div>
/* 1-搜索栏 */
.top-bar{
    position: fixed;
    top:0;
    width: 100%;
    height: 44px;
    background-color: #E72E27;
    padding: 0px 50px;
}

.top-bar .menu{
    position: absolute;
    left: 14px;
    top:14px;
    width: 20px;
    height: 18px;
    background: url(../images/jd_icons.png) no-repeat;
    background-size: 250px 200px;
}

.top-bar input{
    width: 100%;
    height: 30px;
    margin-top: 7px;
    padding-left: 10px;
    border-radius: 15px;
}

.top-bar .login{
    position: absolute;
    top: 14px;
    right: 14px;
    color: #fff;
}

# 2-banner栏

1555754963169

 <!-- 2.banner栏 -->
        <div class="banner">
            <img src="images/slide.png" alt="">
        </div>
/* 2-banner栏 */
.banner{
    width: 100%;
    /* 注意点:固定定位fixed会脱标
       解决方案:设置元素margin撑开脱标的高度
    */
    margin-top: 44px;
}

.banner img{
    width: 100%;
}

# 3-导航栏

1555755053299

<!-- 3.导航栏 -->
        <div class="nav_bar">
            <ul class="clearfix">
                <li><a><img src="images/nav01.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav02.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav03.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav04.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav05.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav06.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav07.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav08.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav09.png" alt=""><span>京东超市</span></a></li>
                <li><a><img src="images/nav10.png" alt=""><span>京东超市</span></a></li>
            </ul>
        </div>
/* 3.导航栏 */

.nav-bar{
    width: 100%;
    height: 175px;
}


.nav-bar ul{
    width: 100%;
}

.nav-bar ul>li{
    float: left;
    width: 20%;
    text-align: center;
}

.nav-bar ul>li img{
    display: block;
    width: 40px;
    height: 40px;
    margin: 10px auto 5px;
}

# 3-京东快报

<!-- 4.京东快报 -->
        <div class="jd-news">
            <span><span>热门&nbsp;&nbsp;</span>价格太贵买不起</span>
            <a href="">更多</a>
        </div>
/* 4.京东快报 */
.jd-news{
    width: 100%;
    height: 16px;
    background: url(../images/jd_icons.png) no-repeat 8px -22px;
    background-size: 250px 200px;
    text-align: center;
}

.jd-news>span>span{
    color: red;
}

.jd-news a{
    float: right;
    padding: 0px 5px;
    border-left: 1px solid #E0E0E0;
}

# 5-活动广告

<!-- 5.活动列表 -->
        <div class="adv-list clearfix">
            <a href=""><img src="images/adv01.jpg" alt=""></a>
            <a href=""><img src="images/adv02.jpg" alt=""></a>
            <a href=""><img src="images/adv03.jpg" alt=""></a>
        </div>
/* 5.活动列表 */
.adv-list{
    width: 100%;
    margin: 10px 0px;
}

.adv-list a{
    display: block;
    float: left;
    width: 50%;
    padding: 0px 5px;
}

.adv-list a:nth-child(n+2){
    width: 25%;
    border-left: 1px solid #e0e0e0;
    
}

.adv-list a img{
    width: 100%;
}

# 6-商品列表

<!-- 6.商品列表 -->
<div class="good-list">
    <div class="good-title"><img src="images/goods_title.jpg" alt=""></div>
    <div class="good-list01 clearfix">
        <a href="" class="clearfix">
            <span>二手寻宝</span>
            <span>跳蚤市场逛一逛</span>
            <img src="images/goods.jpg" alt="">
            <img src="images/goods.jpg" alt="">
        </a>
        <a href="" class="clearfix">
            <span>二手寻宝</span>
            <span>跳蚤市场逛一逛</span>
            <img src="images/goods.jpg" alt="">
            <img src="images/goods.jpg" alt="">
        </a>
    </div>
    <div class="good-list02 clearfix">
        <a href="">
            <span>爱是一道光</span>
            <span>绿到你发慌</span>
            <img src="images/goods.jpg" alt="">
        </a>
        <a href="">
            <span>爱是一道光</span>
            <span>绿到你发慌</span>
            <img src="images/goods.jpg" alt="">
        </a>
        <a href="">
            <span>爱是一道光</span>
            <span>绿到你发慌</span>
            <img src="images/goods.jpg" alt="">
        </a>
        <a href="">
            <span>爱是一道光</span>
            <span>绿到你发慌</span>
            <img src="images/goods.jpg" alt="">
        </a>
    </div>
</div>
/* 6.商品列表 */

.good-list{
    width: 100%;
    /* 解决底部栏固定定位脱标问题 */
    margin-bottom: 44px;
}

/* 商品头部 */
.good-list .good-title{
    width: 100%;
    height: 35px;
    background-color: #F5F5F5;
}

.good-list .good-title img{
    display: block;
    height: 100%;
    margin: 0 auto;
}

/* 商品列表01 */
.good-list .good-list01{
    width: 100%;
}

.good-list .good-list01 a{
    display: block;
    float: left;
    width: 50%;
    text-align: center;
}

.good-list .good-list01 a:nth-child(2){
    border-left: 1px solid #e0e0e0;
}

.good-list .good-list01 a span{
    display: block;
}

.good-list .good-list01 a span:nth-child(1){
    font-size: 16px;
}

.good-list .good-list01 a span:nth-child(2){
    color: #779CFF;
}

.good-list .good-list01 a img{
    float: left;
    width: 50%;
    padding: 5px;
}

/* 商品列表02 */

.good-list .good-list02{
    width: 100%;
    border-top: 1px solid #e0e0e0;
    border-bottom: 1px solid #e0e0e0;
}

.good-list .good-list02 a{
    display: block;
    float: left;
    width: 25%;
    text-align: left;
    padding: 5px;
}

.good-list .good-list02 a:nth-child(n+2){
    border-left: 1px solid #e0e0e0;
}

.good-list .good-list02 a span{
    display: block;
}

.good-list .good-list02 a span:nth-child(1){
    font-size: 16px;
}

.good-list .good-list02 a span:nth-child(2){
    color: green;
}

.good-list .good-list02 a img{
    width: 100%;
}

# 7-底部栏

1555755407827

<!-- 7.底部栏 -->
<div class="bottom-bar clearfix">
    <a href=""><img src="images/icon_index.png" alt=""></a>
    <a href=""><img src="images/icon_category.png" alt=""></a>
    <a href=""><img src="images/icon_center.png" alt=""></a>
    <a href=""><img src="images/icon_shopping.png" alt=""></a>
    <a href=""><img src="images/icon_mime.png" alt=""></a>
</div>
/* 7.底部栏 */
.bottom-bar{
    position: fixed;
    bottom: 0px;
    width: 100%;
    height: 44px;
    background-color: #fff;
}

.bottom-bar a{
    float: left;
    width: 20%;
}

.bottom-bar a img{
    width: 44px;
    height: 44px;
    display: block;
    margin: 0 auto;
}

# 完整的html代码

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <!-- 移动端视口适配 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>京东首页</title>
    <link rel="icon" href="favicon.ico">
    <link rel="stylesheet" href="css/base.css">
    <link rel="stylesheet" href="css/index.css">
</head>

<body>
    <!-- 版心容器 -->
    <div class="container">
        <!-- 1-搜索栏 -->
        <div class="top-bar">
            <a href="" class="menu"></a>
            <input type="text" placeholder="商品名称">
            <a href="" class="login">登录</a>
        </div>
        <!-- 2-banner栏 -->
        <div class="banner">
            <img src="images/slide.png" alt="">
        </div>
        <!-- 3.导航栏 -->
        <div class="nav-bar">
            <ul class="clearfix">
                <li><a href=""><img src="images/nav01.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav02.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav03.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav04.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav05.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav06.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav07.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav08.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav09.png" alt=""><span>京东超市</span></a></li>
                <li><a href=""><img src="images/nav10.png" alt=""><span>京东超市</span></a></li>
            </ul>
        </div>
        <!-- 4.京东快报 -->
        <div class="jd-news">
            <span><span>热门&nbsp;&nbsp;</span>价格太贵买不起</span>
            <a href="">更多</a>
        </div>
        <!-- 5.活动列表 -->
        <div class="adv-list clearfix">
            <a href=""><img src="images/adv01.jpg" alt=""></a>
            <a href=""><img src="images/adv02.jpg" alt=""></a>
            <a href=""><img src="images/adv03.jpg" alt=""></a>
        </div>
        <!-- 6.商品列表 -->
        <div class="good-list">
            <div class="good-title"><img src="images/goods_title.jpg" alt=""></div>
            <div class="good-list01 clearfix">
                <a href="" class="clearfix">
                    <span>二手寻宝</span>
                    <span>跳蚤市场逛一逛</span>
                    <img src="images/goods.jpg" alt="">
                    <img src="images/goods.jpg" alt="">
                </a>
                <a href="" class="clearfix">
                    <span>二手寻宝</span>
                    <span>跳蚤市场逛一逛</span>
                    <img src="images/goods.jpg" alt="">
                    <img src="images/goods.jpg" alt="">
                </a>
            </div>
            <div class="good-list02 clearfix">
                <a href="">
                    <span>爱是一道光</span>
                    <span>绿到你发慌</span>
                    <img src="images/goods.jpg" alt="">
                </a>
                <a href="">
                    <span>爱是一道光</span>
                    <span>绿到你发慌</span>
                    <img src="images/goods.jpg" alt="">
                </a>
                <a href="">
                    <span>爱是一道光</span>
                    <span>绿到你发慌</span>
                    <img src="images/goods.jpg" alt="">
                </a>
                <a href="">
                    <span>爱是一道光</span>
                    <span>绿到你发慌</span>
                    <img src="images/goods.jpg" alt="">
                </a>
            </div>
        </div>
        <!-- 7.底部栏 -->
        <div class="bottom-bar clearfix">
            <a href=""><img src="images/icon_index.png" alt=""></a>
            <a href=""><img src="images/icon_category.png" alt=""></a>
            <a href=""><img src="images/icon_center.png" alt=""></a>
            <a href=""><img src="images/icon_shopping.png" alt=""></a>
            <a href=""><img src="images/icon_mime.png" alt=""></a>
        </div>
    </div>
</body>

</html>

# 完整的CSS代码



/* 版心 */
.container{
    width: 100%;
    /* 限制pc端版心范围 */
    min-width: 320px;
    max-width: 750px;
    margin: 0 auto;
}

/* 1-搜索栏 */
.top-bar{
    /* 固定定位相对于页面,想要居中显示也要限制版心范围 */
    min-width: 320px;
    max-width: 750px;
  
    position: fixed;
    top:0;
    width: 100%;
    height: 44px;
    background-color: #E72E27;
    padding: 0px 50px;
}

.top-bar .menu{
    position: absolute;
    left: 14px;
    top:14px;
    width: 20px;
    height: 18px;
    background: url(../images/jd_icons.png) no-repeat;
    background-size: 250px 200px;
}

.top-bar input{
    width: 100%;
    height: 30px;
    margin-top: 7px;
    padding-left: 10px;
    border-radius: 15px;
}

.top-bar .login{
    position: absolute;
    top: 14px;
    right: 14px;
    color: #fff;
}

/* 2-banner栏 */
.banner{
    width: 100%;
    /* 注意点:固定定位fixed会脱标
       解决方案:设置元素margin撑开脱标的高度
    */
    margin-top: 44px;
}

.banner img{
    width: 100%;
}

/* 3.导航栏 */

.nav-bar{
    width: 100%;
    height: 175px;
}


.nav-bar ul{
    width: 100%;
}

.nav-bar ul>li{
    float: left;
    width: 20%;
    text-align: center;
}

.nav-bar ul>li img{
    display: block;
    width: 40px;
    height: 40px;
    margin: 10px auto 5px;
}

/* 4.京东快报 */
.jd-news{
    width: 100%;
    height: 16px;
    background: url(../images/jd_icons.png) no-repeat 8px -22px;
    background-size: 250px 200px;
    text-align: center;
}

.jd-news>span>span{
    color: red;
}

.jd-news a{
    float: right;
    padding: 0px 5px;
    border-left: 1px solid #E0E0E0;
}

/* 5.活动列表 */
.adv-list{
    width: 100%;
    margin: 10px 0px;
}

.adv-list a{
    display: block;
    float: left;
    width: 50%;
    padding: 0px 5px;
}

.adv-list a:nth-child(n+2){
    width: 25%;
    border-left: 1px solid #e0e0e0;
    
}

.adv-list a img{
    width: 100%;
}

/* 6.商品列表 */

.good-list{
    width: 100%;
    /* 解决底部栏固定定位脱标问题 */
    margin-bottom: 44px;
}

/* 商品头部 */
.good-list .good-title{
    width: 100%;
    height: 35px;
    background-color: #F5F5F5;
}

.good-list .good-title img{
    display: block;
    height: 100%;
    margin: 0 auto;
}

/* 商品列表01 */
.good-list .good-list01{
    width: 100%;
}

.good-list .good-list01 a{
    display: block;
    float: left;
    width: 50%;
    text-align: center;
}

.good-list .good-list01 a:nth-child(2){
    border-left: 1px solid #e0e0e0;
}

.good-list .good-list01 a span{
    display: block;
}

.good-list .good-list01 a span:nth-child(1){
    font-size: 16px;
}

.good-list .good-list01 a span:nth-child(2){
    color: #779CFF;
}

.good-list .good-list01 a img{
    float: left;
    width: 50%;
    padding: 5px;
}

/* 商品列表02 */

.good-list .good-list02{
    width: 100%;
    border-top: 1px solid #e0e0e0;
    border-bottom: 1px solid #e0e0e0;
}

.good-list .good-list02 a{
    display: block;
    float: left;
    width: 25%;
    text-align: left;
    padding: 5px;
}

.good-list .good-list02 a:nth-child(n+2){
    border-left: 1px solid #e0e0e0;
}

.good-list .good-list02 a span{
    display: block;
}

.good-list .good-list02 a span:nth-child(1){
    font-size: 16px;
}

.good-list .good-list02 a span:nth-child(2){
    color: green;
}

.good-list .good-list02 a img{
    width: 100%;
}

/* 7.底部栏 */
.bottom-bar{
    position: fixed;
    bottom: 0px;
    width: 100%;
    height: 44px;
    background-color: #fff;
}

.bottom-bar a{
    float: left;
    width: 20%;
}

.bottom-bar a img{
    width: 44px;
    height: 44px;
    display: block;
    margin: 0 auto;
}









# 今日学习任务

  • [ ] 01-flex伸缩布局
    • [ ] 主轴方向flex-direction
    • [ ] 主轴排列方式justify-content
    • [ ] 次轴排列方式align-items
    • [ ] 主轴换行方式aflex-wrap
    • [ ] 多行排列方式:align-content
  • [ ] 02-案例:携程网

# 01-flex伸缩布局

  • 课外学习传送门:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool (opens new window)

  • 以下这些属性是给父盒子设置

    属性 语法 描述
    flex display:flex 父盒子成为伸缩盒子(加buff,变得比以前的盒子更牛逼)
    flex-direction flex-direction:cloumn (排列方式)让子盒子垂直方向排列(默认水平)
    ==justify-content== justify-content:center (对齐方式)让子盒子主轴方向居中对齐(主轴默认水平)
    ==align-items== align-items:center (对齐方式)让子盒子次轴方向居中对齐(次轴默认垂直)
    ==flex-wrap== flex-wrap:wrap 当子盒子总宽度>父盒子宽度,允许换行(默认不会换行,而是自动按比例分配)
    align-content align-content:center (对齐方式)每一行垂直方向居中对齐(只对多行有效,一行是无效的)
  • 以下这些属性是给子盒子设置

属性 语法 描述
aligin-self aligin-self:center 单独设置某一个子盒子的次轴对齐(vip特殊化)
order order:1 单独设置子盒子的排列顺序(数字越大越靠后,默认都是0)
flex flex:1 设置子盒子主轴方向尺寸 (1flex = 父元素宽度 / 子元素总flex。 类似于几个人切蛋糕,我要几份的意思。如果某个子元素设置了独立的width,则父盒子分蛋糕会先减去这个width)

# 1.1-flex伸缩盒子布局介绍

  • 1.什么是伸缩布局(弹性布局Flexible Boxes)

    • Flexible意为可伸缩的,Boxes意为盒子。是CSS3中一种新的盒子模型-伸缩盒子模型,由CSS3规范 (opens new window)提出,这是在原有的大家非常熟悉的block, inline-block, inline的基础上延伸出的新一代布局模式
      • display:flex:让一个盒子变成伸缩盒子,这种布局方式叫做伸缩布局
        • 说人话:给一个盒子增加buff,让它功能变得更加强大
  • 2.伸缩布局特点

    • a.伸缩盒子最大的特点(优点)就是把空间以最合理高效的方式分配给每一个子盒子

      • ps:人人都有房子住,不会让你暴露街头(而overflow会让这个盒子多余的部分隐藏)
    • b.当伸缩盒子中所有的子元素总宽高大于flex伸缩盒子宽高时,子元素并不会超出

      ​ flex盒子,flex盒子会自动按照每一个子元素的宽高比例合理分配

  • 需求:父盒子中有三个子盒子,这三个子盒子的宽度为父元素的三分之一

    • 1.设置父盒子的display:flex,变成伸缩盒子
    • 2.设置三个子元素的flex:1,表示盒子在排列方向尺寸比例为1

    1555341977602

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .wrap{
            width: 600px;
            height: 300px;
            border: 1px solid red;
            margin: 50px auto;
            /* 设置父盒子为伸缩(弹性)盒子 */
            display: flex;

            /* 1.伸缩盒子最大的特点(优点)就是把空间以最合理高效的方式分配给每一个子盒子
                    * ps:人人都有房子住,不会让你暴露街头(overflow)
               2.当伸缩盒子中所有的子元素总宽高大于flex伸缩盒子宽高时,子元素并不会超出
               flex盒子,flex盒子会自动按照每一个子元素的宽高比例合理分配。     
            */
        }

        .wrap>div{
            /* 盒子在排列方向尺寸比例为1 */
            flex: 1;
        }

        .box1{
            background-color: red;
        }

        .box2{
            background-color: yellow;
        }

        .box3{
            background-color: green;
        }

    </style>
</head>
<body>
    <div class="wrap">
        <div class="box1">1</div>
        <div class="box2">2</div>
        <div class="box3">3</div>
    </div>
</body>
</html>

# 1.2-flex伸缩盒子组成部分介绍

1555342387564

  • 第一眼接触伸缩盒子的时候,会觉得很多概念名词和属性特别多,难以理解和记忆

    • 这一切都在老师意料之中,所以我们换一种方式来介绍flex伸缩盒子的内容
  • 1.有一个好人坤哥在深圳买了一套公寓楼(flex伸缩盒子)分给哪些无家可归的人来居住,带阳台的大单间。(脑部一下我们自己住的公寓楼)

    • ==伸缩盒子三要素==
      • 子盒子item:住户的房间
      • 主轴main axis:房间的排列方向
      • 次轴(交叉轴)cross axis:房间阳台的排列方向
    • ==注意点:主轴和次轴一定是垂直的==
  • 2.坤哥的能力有限,只能买得起1000*200(父盒子大小)平米的公寓楼,但是我也不确定住户有多少,不管怎么样大家都不容易,如果住的人少那每个人分的空间多一些,剩下的作为公摊面积,如果住的人多那每个人分的空间少一些,原则是:来了就是深圳人,来了就有房子住

    • ==伸缩盒子最大特点:按照比例合理分配==
      • 在主轴方向上,如果子元素的总宽高超过父元素宽高时,并不会超出。而是父元素(flex伸缩盒子)会按照比例合理分配。
        • 例如:坤哥的公寓只有1000*200,住进来了三个人,1号房间班长,2号房间副班长,3号房间班花
          • a.班长要住100 x 50平米盒子,副班长要住100 x 50平米盒子,班花要住100 x 50平米盒子
            • 坤哥的1000 x 200公寓楼够他们住,多出来的部分就作为公摊面积,所以最终结果1班长100*50,2副班长100*50,3班花100*50
          • b.班长要住800 x 500的房子,副班长要住800 x 300房子,班花要住400 x 100房子。
            • 坤哥发现班长和副班长房子宽度一致,都是班花的两倍,于是将我那1000分成5份,班长占2份,副班长占2份,班花占1份。而高度虽然我的房子只有200,但是我可以把阳台改长一点尽量满足住户,于是最终结果是1班长400*500,2副班长400*300,3班花200*100

1555345342871

1555345819802

  • 3.flex伸缩盒子常用属性
    • (1)有住户投诉,房间朝向不好,住的不舒服
      • 设置主轴方向:flex-direction
        • 注意:主轴和次轴一定是垂直的,例如设置主轴为水平方向,次轴就是垂直方向。设置主轴垂直方向,次轴就是水平方向
    • (2)有住户投诉,房间挨得太近,没有隐私空间(希望调整房间排列方式)
      • 设置主轴排列方式:justify-content
    • (3)有住户投诉,阳台位置不合理,看不到外面风景(希望调整阳台排列方式)
      • 设置次轴排列方式:align-items
    • (4)有住户投诉,一排的房间太多了,住的不爽(希望能多排住)
      • 设置主轴换行方式:flex-wrap
    • (5)有住户请苏哥洗脚,希望能住上VIP房间(房间排列特殊化)
      • 某个子元素单独设置对齐方式:align-self

# 1.3-flex主轴与次轴flex-direction

1555347575363

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .wrap{
            width: 600px;
            height: 300px;
            border: 1px solid red;
            margin: 50px auto;
            /* 设置父盒子为伸缩(弹性)盒子 */
            display: flex;
            /*1.默认情况下,html中的块级元素排列方向为垂直方向,行内元素排列方向为水平方向
             2.在flex伸缩布局中,可以通过flex-direction属性来设置元素排列方向
                * 不想默认水平从左往右分房,想换个方向分房子就可以用这个属性
             */

             /* a.默认:主轴方向为: 水平方向,从左往右  (此时垂直方向是次轴)*/
             /* flex-direction: row; */

             /* b.主轴方向为: 水平方向,从右往左   */
             /* flex-direction: row-reverse; */
            
            /* c.主轴方向为: 垂直方向,从上往下 (此时水平方向是次轴)*/
            /* flex-direction: column; */

            /* d.主轴方向为: 垂直方向,从下往上 */
            flex-direction: column-reverse;

        }

        .wrap>div{
            /* 盒子在排列方向尺寸比例为1 */
            flex: 1;
        }

        .box1{
            background-color: red;
        }

        .box2{
            background-color: yellow;
        }

        .box3{
            background-color: green;
        }

        .box4{
            background-color: purple;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="box1">1</div>
        <div class="box2">2</div>
        <div class="box3">3</div>
        <div class="box4">4</div>
    </div>
</body>
</html>

# ==1.4-flex主轴排列方式justify-content==

1555347681600

1555347698680

1555347707590

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .wrap{
            width: 600px;
            height: 300px;
            border: 1px solid red;
            margin: 50px auto;
            /* 1.设置父盒子为伸缩(弹性)盒子 */
            display: flex;
            /* 2.默认:主轴方向为: 水平方向,从左往右  (此时垂直方向是次轴)*/
             flex-direction: row;
            /*
             3.justify-contents:设置子盒子在主轴方向的对齐方式
                * 默认flex会按照比例分配把大房子全部挤满,毫无隐私。
            如果希望房子定额分配(固定面积),多出来的部分作为公共区域则可以使用这个属性
                * 如果设置了父盒子这个属性,则子元素不能设置flex属性,否则会失效
             */
            
            /* start:主轴起始方向  end:主轴结束方向 */
            
             /* a.默认:左对齐 */
             /* justify-content: flex-start; */

             /* b.右对齐 */
             /* justify-content: flex-end; */

             /* c.居中 */
             /* justify-content: center; */

             /* d.两端对齐,元素间隔相等 */
             /* justify-content:space-between; */

             /* e.每个元素左右两边间隔相等(中间元素就是两倍间隔) */
             justify-content: space-around;
        }

        .wrap>div{
            width: 100px;
            height: 50px;
        }

        .box1{
            background-color: red;
        }

        .box2{
            background-color: yellow;
        }

        .box3{
            background-color: green;
        }

        .box4{
            background-color: purple;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="box1">1</div>
        <div class="box2">2</div>
        <div class="box3">3</div>
        <div class="box4">4</div>
    </div>
</body>
</html>

# ==1.5-flex次轴排列方式align-items==

1555347623579

1555347640733

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .wrap{
            width: 600px;
            height: 300px;
            border: 1px solid red;
            margin: 50px auto;
            /* 1.设置父盒子为伸缩(弹性)盒子 */
            display: flex;
            /* 2.默认:主轴方向为: 水平方向,从左往右  (此时垂直方向是次轴)*/
             flex-direction: row;
            /*3.justify-contents:设置子盒子在主轴方向的对齐方式*/
             /* 两端对齐,元素间隔相等 */
             justify-content: space-between;
             /*4.align-items:设置子盒子在次轴方向的对齐方式 
             
              */
              /* a.默认值:作用是如果子盒子没有设置高度则拉伸至父盒子高度 */
              /* align-items: stretch; */

              /* b.从次轴起始方向对齐,默认顶部 */
              align-items: flex-start;

              /* c.从次轴结束方向对齐,默认底部 */
              align-items: flex-end;

              /* d.中心对齐 */
              align-items: center;

              /* e.第一行文字基线对齐(了解即可) */
              align-items: baseline;
        }

        .wrap>div{
            width: 100px;
            height: 50px;
        }

        .box1{
            background-color: red;
        }

        .box2{
            background-color: yellow;
        }

        .box3{
            background-color: green;
        }

        .box4{
            background-color: purple;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="box1">1</div>
        <div class="box2">2</div>
        <div class="box3">3</div>
        <div class="box4">4</div>
    </div>
</body>
</html>

# ==1.6-flex主轴换行方式flex-wrap==

1555347866317

1555347879612

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .wrap{
            width: 600px;
            height: 300px;
            border: 1px solid red;
            margin: 50px auto;
            /* 1.设置父盒子为伸缩(弹性)盒子 */
            display: flex;
            /* 2.默认:主轴方向为: 水平方向,从左往右  (此时垂直方向是次轴)*/
             flex-direction: row;
            /*3.justify-contents:设置子盒子在主轴方向的对齐方式*/
             justify-content: flex-start;
             /*4.align-items:设置子盒子在次轴方向的对齐方式 */
              align-items: stretch;

              /* 5.flex-wrap:设置子盒子在主轴方向的对齐方式
                    * 设置flex-wrap换行后,每个子元素上下会有默认间距
                        * 解决方案:设置父盒子高度 = 子盒子高度 * 行数
              */
              /* a.默认值:子盒子强制一行显示 */
              flex-wrap: nowrap;
              /* b.wrap:换行,第一行在上方 */
              flex-wrap: wrap;
              /* c.wrap-reverse:换行,第一行在下方 */
              flex-wrap: wrap-reverse;
        }

        .wrap>div{
            width: 100px;
            height: 150px;
        }

        .box{
            background-color: green;
            border: 2px solid red;
            box-sizing: border-box;
        }

    </style>
</head>
<body>
    <div class="wrap">
        <div class="box">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
        <div class="box">6</div>
        <div class="box">7</div>
        <div class="box">8</div>
        <div class="box">9</div>
        <div class="box">10</div>
    </div>
</body>
</html>

# 1.7-flex多行排列方式align-content

  • 该属性只对多行子元素起作用,如果只有一行则设置无效

1555347965500

1555347983980

1555347992310

# 1.8-flex其他属性介绍(aligen-self、order)

  • align-self与order属性都不是给flex盒子设置的,而是给它的子盒子
    • align-self:设置单个子元素在次轴方向的对齐方式,作用是覆盖父元素的align-items
    • order:设置子元素的排序方式,默认值都是0,从小到大排序

1555348016680

1555348037254

1555349080563

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .wrap{
            width: 600px;
            height: 300px;
            border: 1px solid red;
            margin: 50px auto;
            /* 1.设置父盒子为伸缩(弹性)盒子 */
            display: flex;
            /* 2.默认:主轴方向为: 水平方向,从左往右  (此时垂直方向是次轴)*/
             flex-direction: row;
            /*3.justify-contents:设置子盒子在主轴方向的对齐方式*/
             justify-content: flex-start;
             /*4.align-items:设置子盒子在次轴方向的对齐方式 */
              align-items: stretch;
              /* 5.flex-wrap:设置子盒子在主轴方向的对齐方式*/
              flex-wrap: wrap;
              /* 6.align-content:设置多行子盒子在次轴方向的对齐方式 */
              align-content: stretch;
              /* 7.align-self:设置单个子元素对齐方式
                    * 改属性不是给flex盒子设置的,而是给子元素设置
                        * 作用:覆盖父元素的对齐方式align-items
              */

              /* 8.order:用于子元素的排序
                规则:默认都是0,从小到大排序
                这个属性也是给子元素设置的
              */
        }

        .wrap>div{
            width: 100px;
            height: 50px;
        }

        .box{
            background-color: green;
            border: 2px solid red;
            box-sizing: border-box;
        }

    </style>
</head>
<body>
    <div class="wrap">
        <div class="box" style="order:2">1</div>
        <div class="box">2</div>
        <div class="box">3</div>
        <div class="box">4</div>
        <div class="box">5</div>
        <div class="box" style="order:1">6</div>
        <div class="box">7</div>
        <div class="box">8</div>
        <div class="box">9</div>
        <div class="box" style="align-self:flex-end">10</div>
    </div>
</body>
</html>

# 1.9-子盒子flex属性介绍

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <style>
        .wrap{
            width: 1000px;
            height: 300px;
            border: 1px solid red;
            margin: 100px auto;

            /* 1.伸缩布局: 本质就是给盒子加buff,专治不服:百分比+浮动实现比较麻烦的需求
                如何使用: 设置盒子display 为flex

                2.伸缩布局三要素
                    子元素:住户
                    主轴:住户排列方式(默认水平)
                    次轴:阳台方向
            */
            display: flex;

        }

       
           
        

        .box1{
            /* 1flex = 父元素宽度 / 子元素总flex
            注意:设置了flex,设置宽度没用
            */
            background-color: red;
            flex: 2;/* 子元素宽度比例:切蛋糕 */
        }

        .box2{
            background-color: green;
            flex: 1;
            width: 100px;/* 无效 */
        }

        .box3{
            background-color: hotpink;
            width: 100px;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="box1"></div>
        <div class="box2"></div>
        <div class="box3"></div>

    </div>
</body>
</html>

# 02-伸缩布局案例:携程首页

1560570343292

# 1.1-background-size属性详解

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <style>
        a{
            width: 180px;
            height: 180px;
            display: block;
            border:  1px solid black;

            background: url(hotal.png) no-repeat center bottom ;
            
            /* contain:图片都不会拉伸,会等比例缩放(图片一定会全部显示,但是盒子会有空白) 
            盒子尺寸 < 图片尺寸: 图片等比缩小
            盒子尺寸 > 图片尺寸: 图片等比放大

            常用
            */
            background-size: contain;

            /* corver:图片都不会拉伸,会等比例缩放(图片一定会铺满盒子,但是图片部分区域不可见)    */ 
            /* background-size: cover; */
        }
    </style>
</head>
<body>
    <a href=""></a>
</body>
</html>

# 1.2-携程首页

1557306505855

1557306518004

# 完整html代码

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <link rel="stylesheet" href="css/base.css">    <link rel="stylesheet" href="css/style.css">    <link rel="stylesheet" href="css/index.css"></head><body>    <div class="container">        <!-- 1-搜索栏 -->        <div class="top-bar">            <div>                <i class="icon-search"></i>                <input type="text" placeholder="搜索:目的地">            </div>            <a href="">                <i class="icon-user"></i>                <span>我的</span>            </a>        </div>        <!-- 2.banner栏 -->        <div class="banner">            <a href=""><img src="images/banner.png" alt=""></a>        </div>        <!-- 3.导航栏 -->        <div class="nav-bar">            <a href="">                <span class="icon"></span>                <span>一日游</span>            </a>            <a href="">                <span class="icon"></span>                <span>一日游</span>            </a>            <a href="">                <span class="icon"></span>                <span>一日游</span>            </a>            <a href="">                <span class="icon"></span>                <span>一日游</span>            </a>            <a href="">                <span class="icon"></span>                <span>一日游</span>            </a>        </div>        <!-- 4.网格栏 -->        <div class="grid">            <div class="item">                <div class="left">                    <a href="">酒店</a>                </div>                <div class="right">                    <a href="">酒店</a>                    <a href="">酒店</a>                </div>                <div class="right">                    <a href="">酒店</a>                    <a href="">酒店</a>                </div>            </div>            <div class="item">                <div class="left">                    <a href="">酒店</a>                </div>                <div class="right">                    <a href="">酒店</a>                    <a href="">酒店</a>                </div>                <div class="right">                    <a href="">酒店</a>                    <a href="">酒店</a>                </div>            </div>            <div class="item">                <div class="left">                    <a href="">酒店</a>                </div>                <div class="right">                    <a href="">酒店</a>                    <a href="">酒店</a>                </div>                <div class="right">                    <a href="">酒店</a>                    <a href="">酒店</a>                </div>            </div>        </div>        <!-- 5.热门活动 -->        <div class="adv-list">            <a href=""><img src="images/1.jpg" alt=""></a>            <a href=""><img src="images/2.jpg" alt=""></a>            <a href=""><img src="images/3.jpg" alt=""></a>            <a href=""><img src="images/4.jpg" alt=""></a>        </div>    </div></body></html>

# 完整css代码

.container{    width: 100%;}/* 1.顶部搜索栏 */.top-bar{    position: fixed;    top: 0px;    width: 100%;    height: 44px;    background-color: #eee;    padding: 5px;    /* 设置父元素为伸缩盒子 */    display: flex;}.top-bar div{    flex: 1;    background-color: #fff;    border-radius: 22px;    padding-left: 10px;}.top-bar input{    /* 细节:input有一个默认宽度,一般会设置父元素的90%(不能超过圆角)*/    width: 90%;    height: 100%;}.top-bar a{    width: 50px;    display: block;    /* 文字水平居中 */    text-align: center;}.top-bar a>i{    background-color: #2eaae0;    border-radius: 12px;    font-size: 24px;    color: #fff;}.top-bar span{    display: block;    color: #2eaae0;}/* 2-banner栏 */.banner{    width: 100%;}.banner img{    width: 100%;}/* 3.导航栏 */.nav-bar{    width: 100%;    /* 设置父元素为伸缩盒子 */    display: flex;}.nav-bar a{    display: block;    flex: 1;    text-align: center;}.nav-bar a .icon{    width: 32px;    height: 32px;    display: block;    margin: 10px auto 5px;    background: url(../images/nav_local.png) no-repeat;    background-size: 32px 160px;}/* 选中第二个a元素 中的 icon */.nav-bar a:nth-child(2) .icon{    background-position-y: -32px;}.nav-bar a:nth-child(3) .icon{    background-position-y: -64px;}.nav-bar a:nth-child(4) .icon{    background-position-y: -96px;}.nav-bar a:nth-child(5) .icon{    background-position-y: -128px;}/* 4-网格栏 */.grid{    width: 100%;    padding: 10px;    }.grid .item{    width: 100%;    height: 88px;    background: linear-gradient(to right,#fa5956,#fa9b4d);      display: flex;}.grid .item div{    /* 宽度方向等分 */    flex: 1;    height: 100%;    }.grid .item div a{    height: 50%;    display: block;    text-align: center;    color: #fff;    line-height: 44px;}.grid .item .left{    background: url(../images/hotel.png) no-repeat center bottom;    background-size: contain;    }.grid .item div:nth-child(1) a{    height: 100%;    display: block;}.grid .item div:nth-child(n+2) a{    border-left: 1px solid #fff;    border-bottom: 1px solid #fff;}/* 下面两个item */.grid .item:nth-child(2){    background: linear-gradient(to right,#4b8fe6,#53bced);    margin-top: 5px;}.grid .item:nth-child(2) .left{    background: url(../images/flight.png) no-repeat center bottom;    background-size: contain;}.grid .item:nth-child(3){    margin-top: 5px;    background: linear-gradient(to right,#34c2aa,#6cd557);}.grid .item:nth-child(3) .left{    background: url(../images/travel.png) no-repeat center bottom;    background-size: contain;}/* 5.热门活动 */.adv-list{    width: 100%;    /* 设置父盒子为伸缩盒子 */    display: flex;    /*    1.发现问题 : 每一个a标签宽度50%失效    2.分析问题 : 伸缩盒子子元素总宽度 > 父元素宽度,会合理分配(挤一挤)    3.解决方案: 设置 flex-wrap允许换行      */    flex-wrap: wrap;}.adv-list a{    display: block;    width: 50%;}.adv-list a img{    width: 100%;}

# 今日任务

# 网页布局 - 第5天

以 UI 设计稿为参考,基于媒体查询和长度单位相关知识编写适应多种屏幕尺寸的网页,样式编写中应用预处理器提升开发效率降低维护成本。

  • 能够利用媒体查询动态调整页面样式
  • 知道 CSS 中常见的长度单及特征
  • 能够结合媒体查询和长度单位归纳适配方案
  • 掌握 Less 的基础语法及使用

# 一、媒体查询

了解媒体查询的基本特征,能利用媒体查询的特征编写响应式网页样式

所谓的媒体查询本质上是有条件的执行 CSS 样式,条件满足则执行 CSS 样式,否则不会被执行。

# 1.1 术语

  1. 媒体类型

媒体是用来区分设备类型的,如屏幕设备、打印设备等,其中手机、电脑、平板都属于屏幕设备。

类型名称 描述
屏幕 screen 带屏幕的设备
打印预览 print 打印预览模式
阅读器 speech 屏幕阅读模式
不区分类型 all 默认值,包括以上3种情形
  1. 媒体特性

媒体特性主要用来描述媒体类型的具体特征,如当前屏幕的宽高、分辨率、横屏或竖屏等。

特性名称 属性
视口的宽和高 width、height 数值
视口最大宽或高 max-width、max-height 数值
视口最小宽或高 min-width、min-height 数值
屏幕方向 orientation portrait 或 landscape
  1. 逻辑符

连接媒体和媒体特性的固定词语,分别为 not、only、and。

# 1.2 语法

通过 @media 来定义媒体查询的条件:

/* 媒体查询完整语法 */
@media 逻辑词 媒体类型 and (媒体特性) and (媒体特性) {
  /* 任意 css 样式 */
}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>媒体查询 - 语法</title>
  <style>
    /*
      这段代码的含义是:
      媒体类型只能为 screen
    	并且视口的宽度为 640px
    	body 的背景色为粉色
    */
    @media only screen and (width: 640px) {
      body {
        background-color: pink;
      }
    }
    
    /*
      这段代码的含义是:
      媒体类型除了 screen
    	并且视口的宽度为 640px
    	body 的背景色为粉色
    */
    @media not screen and (width: 640px) {
      body {
        background-color: pink;
      }
    }
    
    /* not 和 only 可以被省略!!! */
    
    /* 媒体类型可以被省略 */
    @media (width: 640px) {
      body {
        background-color: pink;
      }
    }
  </style>
</head>
<body>
  
</body>
</html>
  1. 检测视口的宽度和高度
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>媒体查询 - 语法</title>
  <style>
    /*
      这段代码的含义是:
      当视口宽度为 640px 且 高度为 720px,body 的背景色为蓝色
    */
    @media only screen and (width: 640px) and (height: 720px) {
      body {
        background-color: blue;
      }
      
      /* 在些还可以更多其它任意的 css */
    }
    
    /* only screen 可以被省略 */

    /* 在移动端使用时,注意视口默认的宽度为 980px */
    /* 要满足媒体查询条件需要设置适合的视口 */
  </style>
</head>
<body>
  
</body>
</html>
  1. 检测视口的最大宽度和高度
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>媒体查询 - 视口的最大宽度和高度</title>
  <style>
    /*
      这段代码的含义是:
      当视口宽度小于等于 640px 且 高度小于等于 720px,body 的背景色为蓝色
    */
    @media only screen and (max-width: 640px) and (max-height: 720px) {
      body {
        background-color: blue;
      }
      
      /* 在些还可以更多其它任意的 css */
    }
    
    /* only screen 可以被省略 */

    /* 在移动端使用时,注意视口默认的宽度为 980px */
    /* 要满足媒体查询条件需要设置适合的视口 */
  </style>
</head>
<body>
  
</body>
</html>
  1. 检测视口的最小宽度和高度
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>媒体查询 - 视口的最小宽度和高度</title>
  <style>
    /*
      这段代码的含义是:
      当视口宽度大于等于 640px 且 高度大于等于 720px,body 的背景色为蓝色
    */
    @media only screen and (min-width: 640px) and (min-height: 720px) {
      body {
        background-color: blue;
      }
      
      /* 在些还可以更多其它任意的 css */
    }
    
    /* only screen 可以被省略 */

    /* 在移动端使用时,注意视口默认的宽度为 980px */
    /* 要满足媒体查询条件需要设置适合的视口 */
  </style>
</head>
<body>
  
</body>
</html>
  1. 检测屏幕的方向
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>媒体查询 - 视口的最小宽度高度</title>
  <style>
    /*
      这段代码的含义是:
      当屏幕坚屏状态时,背景色为蓝色
    */
    @media only screen and (orientation: portrait) {
      body {
        background-color: blue;
      }
      
      /* 在些还可以更多其它任意的 css */
    }
    
    /*
      这段代码的含义是:
      当屏幕横屏状态时,背景色为红色
    */
    @media only screen and (orientation: landscape) {
      body {
        background-color: red;
      }
      
      /* 在些还可以更多其它任意的 css */
    }
    
    /* only screen 可以被省略 */
  </style>
</head>
<body>
  
</body>
</html>

注:实际应用中大部分情况只需要检测视口的宽度,检测高度的情形比较少,另外检测视口最大宽和最小宽比直接检测宽度更灵活。

# 二、长度单位

了解 CSS 中不同长度单位的特征,基于 rem 长度单位的特征结合媒体查询归纳移动屏幕适配方案。

CSS 中提供了许多长度的单位,如 pxemremvwvh等。

# 2.1 em

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>长度单位 - em</title>
  <style>
    .em {
      width: 10em;
      height: 5em;
      padding: 0.5em;
      background-color: pink;
      font-size: 18px;
    }
  </style>
</head>
<body>
  <h4>长度单位 em</h4>
  <div class="em">em长度单位参考当前元素字号的大小</div>
</body>
</html>

特征:em 长度单位大小参照当前元素字号的大小。

# 2.2 rem

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>长度单位 - rem</title>
  <style>
    .rem {
      width: 10rem;
      height: 4rem;
      padding: 1rem;
      background-color: pink;
    }
  </style>
</head>
<body>
  <h4>长度单位 rem</h4>
  <div class="rem">rem长度单位始始参考html写号的大小</div>
</body>
</html>

特征:rem 长度单位大小始终参照 html 元素字号的大小。

# 2.3 vw/vh

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>长度单位 - vw/vh</title>  <style>    .vw {      width: 50vw;      height: 2vw;      padding: 1vw;      background-color: pink;    }    .vh {      width: 60vh;      height: 3vh;      padding: 1vh;      background-color: pink;    }  </style></head><body>  <h4>长度单位 vw</h4>  <div class="vw">vw 相对于当前视口宽度的百分之一。</div>  <h4>长度单位 vh</h4>  <div class="vh">vh 相对于当前视口高度的百分之一。</div></body></html>

特征:vwvh 长度单位分别参照视口的宽度和高度。

# 2.4 移动适配

开发中 UI 会提供某个固定尺寸的设计稿,前端人员基于这个设计稿编写网页,保证网页在不同的尺寸屏幕下显示的比例关系一致!

rem 长度单位始终以 html 字号大小为参考,结合媒体查询为不同视口宽度的屏幕指定不同的字号大小,这样便可以保证网页元素依据视口的变化而自动切换大小尺寸了,如下代码所示:

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1">  <title>移动适配</title>  <style>    /* 结合媒体查询 为不同大小的视口设置不同的字号 */    @media (min-width: 320px) {      html {        font-size: 20px;      }    }    @media (min-width: 375px) {      html {        font-size: 24px;      }    }    @media (min-width: 414px) {      html {        font-size: 28px;      }    }    @media (min-width: 750px) {      html {        font-size: 32px;      }    }    .box {      width: 10rem;      height: 10rem;      padding: 1rem;      background-color: pink;    }  </style></head><body>  <h3>移动适配</h3>  <p>结合媒体查询和长度单位归纳总结手机适配方案,保证网页根据手机屏幕大小自动调整元素的尺寸。</p>  <!-- 在模拟器切换手机型号,此盒子大小会自动调整 -->  <div class="box"></div></body></html>

总结:

  1. 为了保证移动设备网页正常显示必须设置 viewport
  2. 屏幕适配基本的原则是大屏幕的 html 设置较大的字号,小屏幕的 html 设置较小的字号
  3. 基于固定尺寸的设计稿确定比例系数,然后基于该系数计算 rem 的值
  4. 企业开发中移动端 UI 设计稿尺寸以 750px 为标准

注:vw 长度单位的大小依据视口的宽度,实际上 vw = rem + 媒体查询。

# 三、css预处理器

学习预处理器的基本语法及使用,为 CSS 扩展处理逻辑的能力,提升开发效率。

预处理器能够为 CSS 提供创建变量以及运算、嵌套、混入等逻辑处理的能力,能够提升 CSS 的开发效率,降低维护成本,常见的预处理器有 lesssass,我们本次课以 less 为重点展开学习。

Less 是 CSS 预处理器的一种,要编写 Less 只需创建以 .less 的文件即可。

# 3.1 编译

浏览器并不能直接识别 .less 文件中的 css 代码,在使用 less 之前必须先将 .less 文件转换为 .css 文件,这需要借助于 VS Code 插件实现。

  1. 创建 .less 结尾的文件
  2. 在 VS Code 中安装 Easy LESS 插件
  3. 简单配置 Easy Less 插件

# 3.2 变量 存储数据

在 Less 中创建变量能够提高样式编写的灵活度。

// 创建变量@color: 'red';@width: 100px;body {  // 引用变量  color: @color;}.box {  // 基于变量的运算  width: @width * 2;  height: 100 / 2px;  border: 1px solid @color;}

总结:

  1. @ 是 Less 中创建变量的标识
  2. Less 中能够支持加减乘除的运算
  3. Less 中百分百支持原生 CSS
  4. Less 中 // 为注释符号

# 3.3 嵌套

在 Less 中依据 CSS 选择器的层级关系进行嵌套,明确样式编写的结构性,降低码的维护成本。

.nav {  width: 400px;  height: 40px;  a {    text-decoration: none;    color: #333;    &:hover {      color: #000;    }  }}

总结:

  1. 以 CSS 选择器的层级关系为依据确定 Less 中的嵌套关系
  2. & 符号特指当前层级的选择器

# 3.4 混合

LESS 中的混合允许将样式代码进行封装。

// 混合.box-radius(@radius: 5px) {  -webkit-border-radius: @radius;  -ms-border-radius: @radius;  border-radius: @radius;}.panel {  width: 600px;  height: 30px;  border: 1px solid #ccc;  .box-radius(10px);}

总结:

  1. 混入可根据需要封装任何样式代码
  2. 使用混入时允许传参数

# 3.5 导入

@import 关键字导入公共独立的 .less 文件。

@import './base.less';@import './adapter.less';

扩展:Sass 也是预处理器的一种,Sass 的基本语法与 Less 类似。

# 四. 动态修改html字体大小为屏幕 1/10

  • 在实际开发中,一般公司都会设置 1rem = 1/10屏幕宽度

    • 也有的公司会设置1rem = 1/20屏幕宽度

    • 也有的公司会设置1rem = 1/100 屏幕宽度

    • 这个rem的值无论是多少,都不影响它本身的作用:同时适配宽度和高度。所以还是那句话,怎么舒服怎么来

      • 这里是淘宝内部解释为什么淘宝的开发团队将rem设置为 1/10 屏幕宽度(其实是为了以后能够兼容vw和vh)

        • https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html
  • rem布局注意点

    • a.一般使用rem布局,都需要设置html字体大小
    • b.实际开发中,一般设置 html字体大小 = 1/10 屏幕宽度

    ​ 也就是说,通过动态设置html字体大小,实现 1rem = 1/10 屏幕宽度

    • c.动态设置html字体大小为手机当前屏幕 1/10的两种方式
      • 1.使用js代码(推荐)
      • 2.使用css媒体查询
        • 由于实际开发中一般使用js代码来动态设置html字体大小,实现1rem = 1/10 屏幕宽度,
          • 由于暂时未接触js语言,所以这里老师提前写好一个js文件,我们开发时只需要导入即可

# 今日学习任务

  • [ ] 01-响应式布局
    • [ ] 响应式布局原理
    • [ ] 媒体查询
    • [ ] 练习:媒体查询实现响应式布局
  • [ ] 02-案例:Bootstrap官网
    • [ ] 响应式布局思路

# 01-响应式布局与媒体查询

​ 1.响应式布局介绍 :一个HTML页面适配多个不同的设备(手机,ipad,PC)

​ 优点 : 全适配 (一个HTML文件就可以适配所有的屏幕 )

​ 缺点 : 不便于维护(响应式布局其实是把多个页面的css写在了一个HTML中,造成css代码冗余)

​ 2.响应式布局核心原理 : 使用媒体查询技术 根据不同的设备尺寸 加载不同的样式

​ 3.媒体查询语法

​ a.标准语法 : @media screen and (设备尺寸){ css样式 }

​ 简写: @media(设备尺寸){ css样式 }

​ b.区间查询

​ 设备尺寸>=区间 : @media(min-width:1200px){ css样式 }

​ 设备尺寸<=区间 : @media(max-width:1200px){ css样式 }

​ c.常见的四种设备尺寸

​ 大PC >=1200px body红色

​ 小pc/ipad pro 992-1200px body橙色

​ 平板(ipad) 768-992 body黄色

​ 手机(iphne) <768 body绿色

​ 4.响应式布局应用场景 :

​ a. 页面复杂 : 不推荐使用响应式 (电商类)

​ b. 页面简单 : 推荐使用响应式 (技术博客类 bootstrap官网)

​ 5.实际开发响应式布局流程 :

​ (1)先写1200px的默认样式 (响应式布局以PC端为准)

​ (2)使用媒体查询根据设备尺寸覆盖默认样式

# 1.1-响应式布局介绍

  • 1.响应式布局:一个页面适配多个不同终端(pc、移动端、平板端)

  • 2.响应式布局核心原理:根据不同的屏幕尺寸加载不同的样式

  • 3.响应式布局的优缺点及适用场景

    • 优缺点
      • 优点:全适配:可以制作全适配的网页,就是一个网页可以同时适配PC端和移动端,而不同写两套页面。
      • 缺点:不便于维护:需要写大量的css代码,相当于把PC端和移动端的css代码写到一个文件中,然后根据屏幕尺寸加载对应的代码。
    • 适用场景
    • 如何区分一个网站是否使用了响应式布局:谷歌控制台切换到移动端,然后刷新网页
      • 如果PC端和移动端网址一样:说明使用了响应式布局
      • 如果PC端和移动端网址不一样:说明没有使用响应式布局,而是做两套页面匹配PC端和移动端
  • # 媒体查询

    • 1.作用:媒体查询@media是css3中新增的功能,它的作用是可以针对不同的媒体类型定义不同的样式
    • 2.语法: @media 媒体类型 and (媒体特征){ css样式代码 }
      • 例如: @media screen and (width:700px){ css样式代码}
        • 意思: 如果屏幕的宽度是700px,就加载大括号里面的css样式
      • 例如:@media screen and (max-width:700px){ css样式代码}
        • 意思:如果屏幕的最大宽度不超过700px(言外之意就是屏幕宽度 <= 700px),就加载大括号里面的css样式
      • 例如:@media screen and (min-width:1000px) and (max-width:1200px){ css样式代码}
        • 意思:如果屏幕宽度范围 在[1000到1200]之间,就加载大括号里面的样式
    • 3.语法注意点:==and左右两边的空格不能省略==
      • 媒体类型:具体可查询w3c文档,实际开发最最最常用的就是screen,表示屏幕
        • all:所有设备
        • print:打印设备,用于打印机以及打印预览
        • screen:用于电脑,平板电脑,手机的屏幕
      • 媒体特征:非常的多,但是常用的就下面这2个
        • max-width:宽度值
          • 意思:屏幕的宽度不超过设置的宽度值,也就是说 屏幕宽度 <= 宽度值
        • min-width:宽度值
          • 意思:屏幕的宽度不小于设置的宽度值,也就是说 屏幕宽度 >= 宽度值
      • 如果不设置媒体类型,则默认为screen,所以上面的语法可以简写成
        • @media(max-width:700px){ css样式代码 }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 
        1.流式布局 : 宽度适用百分比,高度使用px
            应用场景 : 只适配宽度
        2.伸缩布局 :  display:flex
            应用场景 : 多列布局(浮动+百分比搞不定)
        3.rem布局 :同时适配宽度 + 高度
            应用场景 : 需要适配高度 + 文字大小 
        4.响应式布局 :一个HTML页面适配多个不同的设备(手机,PC)

     -->

    <!-- 
        1.响应式布局介绍 :一个HTML页面适配多个不同的设备(手机,PC)
            优点 : 全适配 (一个HTML文件就可以适配所有的屏幕 )
            缺点 : 不便于维护(响应式布局其实是把多个页面的css写在了一个HTML中,造成css代码冗余)

        2.响应式布局核心原理 : 使用媒体查询技术  根据不同的设备尺寸 加载不同的样式
        3.媒体查询语法
            a.标准语法 : @media screen and (设备尺寸){ css样式 }
                简写城市: @media(设备尺寸){ css样式 }

            b.区间查询
                @media(min-width:尺寸){ >=尺寸 }
                @media(max-width:尺寸){ <=尺寸 }
            c.常见的四种设备尺寸
        4.响应式布局应用场景 :
            a. 页面复杂 : 不推荐使用响应式 (电商类)
            b. 页面简单 : 推荐使用响应式 (技术博客类 bootstrap官网)
        5.实际开发响应式布局流程 : 
     -->

    <style>

        /* 标准语法 */
        /* 当设备宽度 = 1200px时,大括号中的样式生效 */
        @media screen and (width:1200px){
            /* css样式 */
            body{
                background-color: red;
            }
        }

        /* 简写语法 */
        @media(width:1200px){
            /* css样式 */
            body{
                background-color: green;
            }
        }
    </style>
</head>
<body>
    
</body>
</html>

# 1.2-媒体查询语法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 
        1.流式布局 : 宽度适用百分比,高度使用px
            应用场景 : 只适配宽度
        2.伸缩布局 :  display:flex
            应用场景 : 多列布局(浮动+百分比搞不定)
        3.rem布局 :同时适配宽度 + 高度
            应用场景 : 需要适配高度 + 文字大小 

     -->

    <!-- 
        1.响应式布局介绍 :一个HTML页面适配多个不同的设备(手机,PC)
            优点 : 全适配 (一个HTML文件就可以适配所有的屏幕 )
            缺点 : 不便于维护(响应式布局其实是把多个页面的css写在了一个HTML中,造成css代码冗余)

        2.响应式布局核心原理 : 使用媒体查询技术  根据不同的设备尺寸 加载不同的样式
        3.媒体查询语法
            a.标准语法 : @media screen and (设备尺寸){ css样式 }
                简写城市: @media(设备尺寸){ css样式 }

            b.区间查询
                设备尺寸>=区间 :  @media(min-width:1200px){ css样式 }
                设备尺寸<=区间 :  @media(max-width:1200px){ css样式 }
                
            c.常见的四种设备尺寸
        4.响应式布局应用场景 :
            a. 页面复杂 : 不推荐使用响应式 (电商类)
            b. 页面简单 : 推荐使用响应式 (技术博客类 bootstrap官网)
        5.实际开发响应式布局流程 : 
     -->

    <style>

        /* a. 标准语法 */
        /* 当设备宽度 = 1200px时,大括号中的样式生效 */
        @media screen and (width:1200px){
            /* css样式 */
            body{
                background-color: red;
            }
        }

        /* b. 简写语法 */
        @media(width:1200px){
            /* css样式 */
            body{
                background-color: green;
            }
        }

        /* c.区间查询语法
        @media(min-width:1200px){ css样式 }:设备宽度最小值不小于1200px的时候生效(说人话:设备宽度>=1200px)
        @media(max-width:1200px){ css样式}: 设备宽度最大值不大于1200px的时候生效(说人话: 设备宽度<=1200px)
        */
        @media(min-width: 1200px){
            body{
                background-color: pink;
            }
        }

        @media(max-width:1200px){
            body{
                background-color: skyblue;
            }
        }



    </style>
</head>
<body>
    
</body>
</html>

# 1.3-媒体查询练习

  • 常见的媒体尺寸见下图(了解即可):实际开发以产品需求为准

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>

    <style>
        /* 实体开发中媒体查询的区别分别对应的是四种设备
        
        设备                   屏幕范围            媒体查询语法              需求
        大pc(台式机)           >= 1200px                                   红色
        小pc(笔记本,ipadPro)    992px-1200px                                橙色
        平板(ipad)              768px-992px                                  黄色
        手机(ihone)              <=768px                                      绿色
        */

        /* >= 1200px */
        @media(min-width:1200px){
            body{
                background-color: red;
            }
        }

        /* 992-1200 */
        @media(min-width:992px) and (max-width:1200px){
            body{
                background-color: orange;
            }
        }

        /* 768-992 */
        @media(min-width:768px) and (max-width:992px){
            body{
                background-color: yellow;
            }
        }

        /* <= 768 */
        @media(max-width:768px){
            body{
                background-color: green;
            }
        }
    </style>
</head>
<body>
    
</body>
</html>

# 1.4-响应式布局场景1:多列布局

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 
        1.响应式布局介绍 :一个HTML页面适配多个不同的设备(手机,ipad,PC)
            优点 : 全适配 (一个HTML文件就可以适配所有的屏幕 )
            缺点 : 不便于维护(响应式布局其实是把多个页面的css写在了一个HTML中,造成css代码冗余)

        2.响应式布局核心原理 : 使用媒体查询技术  根据不同的设备尺寸 加载不同的样式
        3.媒体查询语法
            a.标准语法 : @media screen and (设备尺寸){ css样式 }
                简写城市: @media(设备尺寸){ css样式 }

            b.区间查询
                设备尺寸>=区间 :  @media(min-width:1200px){ css样式 }
                设备尺寸<=区间 :  @media(max-width:1200px){ css样式 }
                
            c.常见的四种设备尺寸
                大PC                      >=1200px         body红色
                小pc/ipad pro             992-1200px       body橙色
                平板(ipad)                768-992           body黄色
                手机(iphne)                <768             body绿色
        4.响应式布局应用场景 :
            a. 页面复杂 : 不推荐使用响应式 (电商类)
            b. 页面简单 : 推荐使用响应式 (技术博客类 bootstrap官网)
        5.实际开发响应式布局流程 : 
            (1)先写1200px的默认样式 (响应式布局以PC端为准)
            (2)使用媒体查询根据设备尺寸覆盖默认样式
     -->

    <style>
        .container {
            width: 100%;
        }


        .container .box {
            float: left;
            width: 23%;
            height: 200px;
            margin: 50px 1%;
            background-color: green;
        }


        /* 992-1200 */
        /* 只要小于1200px : 3列
        注意点:
            (1)媒体查询覆盖样式 : 只需要覆盖不同的样式, 如果是一样的样式就不用覆盖
            (2)覆盖样式 : 需要注意权重问题
        */
        @media(max-width:1200px) {
            .container .box {
                width: 31.33%;
                background-color: orange;
            }
        }

        /* 768-992 */
        @media(max-width:992px){
            .container .box{
                width: 48%;
                background-color: yellow;
            }
        }

        /* <768 */
        @media(max-width:768px){
            .container .box{
                width: 60%;
                margin: 50px 20%;
                background-color: pink;
            }
        }
    </style>
</head>

<body>
    <!-- 需求 :
    >1200px    4列
    992-1200   3列
    768-992    2列
    <768       1列
    -->
    <div class="container">
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
        <div class="box"></div>
    </div>
</body>

</html>

# 1.5-响应式布局场景2 : 双版心布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 
        1.响应式布局介绍 :一个HTML页面适配多个不同的设备(手机,ipad,PC)
            优点 : 全适配 (一个HTML文件就可以适配所有的屏幕 )
            缺点 : 不便于维护(响应式布局其实是把多个页面的css写在了一个HTML中,造成css代码冗余)

        2.响应式布局核心原理 : 使用媒体查询技术  根据不同的设备尺寸 加载不同的样式
        3.媒体查询语法
            a.标准语法 : @media screen and (设备尺寸){ css样式 }
                简写城市: @media(设备尺寸){ css样式 }

            b.区间查询
                设备尺寸>=区间 :  @media(min-width:1200px){ css样式 }
                设备尺寸<=区间 :  @media(max-width:1200px){ css样式 }
                
            c.常见的四种设备尺寸
                大PC                      >=1200px         body红色
                小pc/ipad pro             992-1200px       body橙色
                平板(ipad)                768-992           body黄色
                手机(iphne)                <768             body绿色
        4.响应式布局应用场景 :
            a. 页面复杂 : 不推荐使用响应式 (电商类)
            b. 页面简单 : 推荐使用响应式 (技术博客类 bootstrap官网)
        5.实际开发响应式布局流程 : 
            (1)先写1200px的默认样式 (响应式布局以PC端为准)
            (2)使用媒体查询根据设备尺寸覆盖默认样式
                a. 只需要覆盖 不同的样式 (一样的样式不需要)
                b. 覆盖样式需要注意权重问题
     -->
    <style>
        /* 先写1200px公共样式 */
        .container{
            width: 100%;
        }

        .left{
            float: left;
            width: 30%;
            height: 2000px;
            background-color: red;
        }

        .right{
            float: left;
            width: 70%;
            height: 2000px;
            background-color: green;
        }

        /* 媒体查询覆盖样式 */
        @media(max-width:992px){
            /* 隐藏左边的版心 */
            .left{
                display: none;
            }

            .right{
                width: 100%;
            }
        }
    </style>
</head>
<body>
    <!-- 需求:  (1)设备尺寸>992 显示左右两个版心  (2)设备尺寸<=992 显示一个版心 -->
    <div class="container">
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>
</html>

# 02-案例:Bootstrap官网

  • 1.小技巧:

    • 背景与与渐变颜色共存:注意两个属性之间用逗号隔开
      • *background*:url(../imgs/bs.png) repeat center,linear-gradient(45deg, #100a34, #5d2b4c) ;
    • 解决margin塌陷的三种方式
      • 1.border
      • 2.overflow: hidden
      • 3.padding
  • 2.实际开发中响应式布局思路

    ​ 1.先写 1200px pc端的公共样式(不使用媒体查询,在任何尺寸屏幕下样式生效)

    ​ 2.使用媒体查询@metia来适配其他的三个样式

    ​ 992 <= 大平板/小屏电脑 < 1200

    ​ 768 <= 平板 < 992

    ​ 手机 < 768

# 1-先写1200px的样式

# 2-通过媒体查询适配992<=屏幕<1200样式

1.版心宽度变成970px

2.顶部top_bar的ul列表中隐藏第二个li元素

3.底部商品列表宽高变成300*350

​ 由于使用了伸缩盒子且允许换行,所以当父盒子宽度变小之后,子盒子会自动换行(970/300 取整得到3)

/* 媒体查询实现响应式布局 */
 @media(min-width: 992px) and (max-width:1200px){
    .container{
        width: 970px;
        margin: 0 auto;
    }

    .top-bar ul li:nth-child(2){
        display: none;
    }

    .project-list .item a{
        width: 300px;
        height: 350px;
    }
}

# 3-通过媒体查询适配768<=屏幕<992样式

  • 1.版心宽度变成750px

    2.顶部top_bar的ul列表中隐藏第一个li元素和第二个li元素

    3.顶部top_bar隐藏右边的关于按钮

    4.底部商品列表宽高变成300*350

    ​ 由于使用了伸缩盒子且允许换行,所以当父盒子宽度变小之后,子盒子会自动换行(750px/300 取整得到2)

@media(min-width: 768px) and (max-width:992px){
    .container{
        width: 750px;
        margin: 0 auto;
    }

    .top-bar ul li:nth-child(1){
        display: none;
    }

    .top-bar ul li:nth-child(2){
        display: none;
    }

    .top-bar ul .about{
        display: none;
    }

    .project-list .item a{
        width: 300px;
        height: 350px;
    }
}

# 4-通过媒体查询适配 屏幕<768样式

1.版心宽度变成100%(手机端水平铺满)

2.顶部top_bar

​ 只显示ul列表第一个li,其他隐藏

​ 关于按钮隐藏,显示menu菜单图标

注意:默认menu使用行内属性设置隐藏display:none

如果在css中想要覆盖行内属性,则可以使用顶级权重 !

@media(max-width:768px){
    .container{
        width: 100%;
        margin: 0 auto;
        padding: 0px 5px;
    }

    .top-bar ul li:nth-child(n+2){
        display: none;
    }

    .top-bar ul .menu{
        display: block !important;
        float: right;
        margin-right: 0px;
    }

    .project-list .item a{
        width: 300px;
        height: 350px;
    }
}

# 完整HTML代码

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <link rel="stylesheet" href="./css/base.css">    <link rel="stylesheet" href="./css/index.css"></head><body>    <!-- 1.顶部栏 -->    <div class="top-bar">        <div class="container">            <ul class="clearfix">                <li><a href="">Bootstrap中文网</a></li>                <li><a href="">Bootstrap2中文文档</a></li>                <li><a href="">Bootstrap3中文文档</a></li>                <li><a href="">Bootstrap4中文文档</a></li>                <li><a href="">Less 教程</a></li>                <li><a href="">jQuery API</a></li>                <li><a href="">网站实例</a></li>                <li class="about"><a href="">关于</a></li>                <li class="menu" style="display: none"><a href=""><img src="./imgs/menu.jpg" alt=""></a></li>            </ul>        </div>    </div>    <!-- 2.banner栏 -->    <div class="banner">        <div class="container">            <h1>Bootstrap</h1>            <h2>简洁、直观、强悍的前端开发框架,让web开发更迅速、简单</h2>            <a href="">Bootstrap3中文文档</a>        </div>    </div>    <!-- 3.列表栏 -->    <div class="list">        <div class="container">            <div class="item">                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>                <a href="">                    <img src="./imgs/nodejs.png" alt="">                    <span>Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。</span>                </a>            </div>        </div>    </div></body></html>

# 完整css代码

/* 一:响应式布局流程    1.先写1200px公共样式    2.使用媒体查询 根据不同设备 覆盖样式*//* 响应式布局 四种尺寸        设备名称     设备尺寸        版心        大pc      1200          1170px        小pc      992-1200      970px        平板      768-992       750        手机      <768          100%*/.container{    width: 1170px;    margin: 0 auto;}/* 1.顶部栏 */.top-bar{    width: 100%;    height: 44px;    background-color: #222222;    border-bottom: 2px solid black;}.top-bar ul{    width: 100%;}.top-bar ul li{    /* 细节:子元素浮动,父元素清除浮动 */    float: left;    margin-right: 30px;}.top-bar ul .about{    float: right;}/* 选中第一个li元素中的a标签 */.top-bar ul li:nth-child(1) a{    font-size: 20px;}.top-bar ul li a{    /* 文字水平居中 */    text-align: center;    /* 文字垂直居中 */    line-height: 44px;    /* 文字颜色 */    color: #888;}/* 2.banner栏 */.banner{    width: 100%;    height: 470px;    /* 背景图与渐变颜色共存 */    /*     1.发现问题 : 只能看到渐变颜色,不能看到背景图    2.分析问题 : 相同的属性,后者覆盖前者(背景图与背景渐变都是background)    3.解决方案 :        第一种(非常简单,但是百度没有) :            属性连接 :background : 背景图(先),渐变颜色(后)        第二种(稍微复杂,百度上面比较多的方案):使用伪元素    */    /* background : 背景图(先),渐变颜色(后) */    background: url(../imgs/bs.png) repeat center,linear-gradient(45deg,#020031,#6d3353);    /* 方案二:伪元素 */    /* background: linear-gradient(45deg,#020031,#6d3353); */    /* 子绝父相 */    /* position: relative; */    /* 解决margin塌陷三种方式    1.border    2.padding    3.overflow:hidden    */    overflow: hidden;}/* 伪元素一定要设置content属性需要定位*//* .banner::after{    content: '';    position: absolute;    width: 100%;    height: 100%;    background: url(../imgs/bs.png) repeat center;} */.banner h1{    margin-top: 100px;    font-size: 90px;    color: #fff;    text-align: center;}.banner h2{    margin-top: 20px;    font-size: 30px;    color: #fff;    text-align: center;}.banner a{    display: block;    width: 290px;    height: 50px;    margin: 35px auto;    background-color:#337AB7 ;    font-size: 20px;    text-align: center;    line-height: 50px;    color: #fff;    /* 圆角 */    border-radius: 8px;    /* 阴影 */    box-shadow: 5px 5px 2px #222222;}/* 3.列表栏 */.list{    width: 100%;}.list .item{    width: 100%;    /* 伸缩布局 */    display: flex;    /* 允许换行 */    flex-wrap: wrap;    /* 主轴排列方式:水平方向对齐方式 */    justify-content: space-between;}.list .item a{    /* 伸缩布局:默认会把行内子元素变成行内块(与浮动类似的) */    width: 260px;    height: 330px;    border: 1px solid red;    padding: 5px;    margin-top: 10px;}.list .item a img{    width: 100%;}/* 响应式布局第二步:使用媒体查询覆盖样式 *//* 992-1200    a.  顶部栏第二个li元素隐藏    b.  列表尺寸  290*330*/@media(max-width:1200px){    .container{        width: 970px;    }    .top-bar ul>li:nth-child(2){        display: none;    }    .list .item a{        width: 290px;        height: 330px;    }}/* 768-992    a.顶部栏  第一个  第二个  第八个隐藏    b.列表尺寸  310*360*/@media(max-width:992px){    .container{        width: 750px;    }    .top-bar ul>li:nth-child(1){        display: none;    }    .top-bar ul>li:nth-child(2){        display: none;    }    .top-bar ul>li:nth-child(8){        display: none;    }    .list .item a{        width: 310px;        height: 360px;    }}/* 手机: <768    a.顶部栏:只显示第一个li  ,后面7个li元素隐藏    b.顶部栏最右边显示一个图表(菜单)        思路1:给一个li元素(放图片,默认一直隐藏)        思路2:<768的时候显示即可(注意点: 使用顶级权重!important才能覆盖行内样式)    c.列表栏居中显示*/@media(max-width:768px){    .container{        width: 100%;    }    .top-bar ul>li:nth-child(1){        display: block;        margin-left: 10px;    }    /* n从0开始 */    .top-bar ul>li:nth-child(n+2){        display: none;    }    /* 列表栏居中 */    .list .item a{        width: 60%;        margin: 10px 20%;    }    /* 显示menu菜单栏    细节:默认隐藏是行内权重,需要使用顶级权重    */    .top-bar ul>li.menu{        display: block !important;        float: right;    }}

# 今日学习任务

  • [ ] 01-bootstrap第三方框架学习
    • [ ] 1.bootstrap介绍
    • [ ] 2.bootstrap初始化模板
    • [ ] ==3.bootstrap全局CSS样式==
    • [ ] ==4.bootstrap组件==
    • [ ] ==5.bootstrap栅格系统==
  • [ ] 02-bootstrap案例:boostrap官网制作

# 01-bootstrap响应式布局框架学习

1556355603436

# 1.1-bootstrap介绍

  • 1.什么是Bootstrap:Bootstrap是一个响应式布局的框架

    • Bootstrap作用场景:做响应式布局网页
    • 框架:就是别人提前写好的css和js文件。
      • 框架作用:提高开发人员的工作效率(ctrl + c/v 复制粘贴即可)
  • 2.如何使用Bootstrap框架(该流程适用于所有的第三方框架)

    • a.进官网:http://www.bootcss.com/ (opens new window)
      • 下载别人写好的代码,然后在我们自己的文件导入
    • b.查文档(三大核心技术):
    • c.复制粘贴
    • ==本阶段所有代码均来自官网复制粘贴,所以千万不要死记硬背==
      • 课堂上老师只会介绍我们以后常用的一些功能,剩下的功能有个印象即可,以后用到了来官网复制粘贴即可(授人以鱼不如授人以渔)
  • 3.bootstrap环境配置

    • 目前bootstrap有三个版本,分别是 2.x、3.x、4.x,2.x是旧的版本,3.x是新的稳定版本,4.x还在完善中,所以我们目前使用的是3.x版本。 这个框架就是别人已经写好的css和JavaScript,我们要使用它,首先需要把这些样式和javascript相关文件下载下来,然后在我们的页面中引用这些文件就可以使用这个框架了,直接在这个网站下载,下载地址为:https://v3.bootcss.com/getting-started/#download。 (opens new window)
    • 下载之后,会得到一个安装包,我们只需要将安装包中的css font js 这三个文件夹放到项目目录即可
    • 下载jquery:由于bootstrap这个框架里面的js代码使用的是一个js框架叫做jquery,所以我们还需要单独下载jquery,它的下载地址是:https://code.jquery.com/jquery-1.12.4.min.js (opens new window)

1556355728477

1556355878537

# 1.2-bootstrap初始化html模板

  • 所有的第三方框架在使用时都需要导入依赖包

    • 类似于字体图标一样,使用时需要导入style.css
  • bootstrap需要导入三个依赖包

    • <script src="js/jquery-1.12.4.min.js"></script>
    • <script src="js/bootstrap.min.js"></script>
    • <link rel="stylesheet" href="css/bootstrap.min.css">
  • 初始化模板:就是官网里面教你在创建html的时候需要导入哪些依赖包

    • bootstrao官方模板:不推荐使用,太过于冗余,有些用不上的也写上了
    • 自定义bootstrap模板:推荐使用,简洁明了
  • 官方模板

<!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="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
    <!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
    <!--[if lt IE 9]>
      <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
      <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <h1>你好,世界!</h1>

    <!-- jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
    <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
  </body>
</html>
  • 自定义模板
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <!-- 要使用bootstrap,需要导入三个文件 -->
  <script src="js/jquery-1.12.4.min.js"></script>
  <script src="js/bootstrap.min.js"></script>
  <link rel="stylesheet" href="css/bootstrap.min.css">
</head>

<body>
    <!-- 官网复制粘贴一段代码测试一下模板是否生效 -->
  <div class="h1">你好,世界</div>
  <div class="progress">
    <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="45" aria-valuemin="0"
      aria-valuemax="100" style="width: 45%">
      <span class="sr-only">45% Complete</span>
    </div>
  </div>
</body>

</html>
{
	"Bootstrap template": {
	  "prefix": "boot",
	  "body": [
		"<!DOCTYPE html>",
		"<html lang=\"zh-CN\">",
		"<head>",
		"\t<meta charset=\"UTF-8\">",
		"\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=0\">",
		"\t<meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">",
		"\t<title>Bootstrap Template</title>",
		"\t<!-- 使用bootstrap需要导入三个文件 -->",
		"\t<script src=\"js/jquery-1.12.4.min.js\"></script>",
		"\t<script src=\"js/bootstrap.min.js\"></script>", 
		"\t<link href=\"css/bootstrap.min.css\" rel=\"stylesheet\">", 
		"</head>",
		"<body>",
		"\t$1\n",
		"</body>",
		"</html>"
		],
	  "description": "Bootstrap template"
	}
}

# ==1.3-bootstrap全局CSS样式==

  • 记住bootstrap中几个经典的类名后缀对应的颜色

    • default:默认 纯白色
    • link:链接 a标签默认颜色
    • success: 淡绿色(成功/确定) #dff0d81556357442474
    • info:天蓝色(信息) #5bc0de 1556357508632
    • warning:橘橙色(提示/警告) #f0ad4e 1556357595976
    • danger:酒红色(失败/错误) #d9534f 1556357646484
    • primary:青色(重要) #337ab7 1556357772027
  • 记住bootstrap中几个经典的尺寸类名后缀

  • lg: 大尺寸,对应大屏pc ,在栅格系统响应式布局中对应的屏幕是 >= 1200px

  • md:中尺寸,对应大屏平板ipadPro和小屏pc,在栅格系统响应式布局中对应的屏幕是 [992,1200)

  • sm:小尺寸,对应平板ipad,在栅格系统响应式布局中对应的屏幕是 [768,992)

  • xs:超小尺寸,对应手机移动端,在栅格系统响应式布局中对应的屏幕是<= 768

# 1-按钮button

1556358356552

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 要使用bootstrap,需要导入三个文件 -->
    <script src="js/jquery-1.12.4.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">

    <!-- 这个是未压缩版的bootstrap源码,学习的时候建议导入这个可以查看源码 -->
    <link rel="stylesheet" href="css/bootstrap.css">

</head>

<body>

    <a class="btn btn-default btn-sm" href="#" role="button">a标签</a>
    <button class="btn btn-default btn-lg btn-primary" type="submit">button标签</button>
    <button class="btn btn-default btn-lg btn-success" type="submit">button标签</button>
    <button class="btn btn-default btn-lg btn-info" type="submit">button标签</button>
    <input class="btn btn-default btn-xs btn-warning" type="button" value="Input标签">
    <input class="btn btn-default btn-danger" type="submit" value="Submit标签">

</body>

</html>

# 2-表格table

1556358411491

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 要使用bootstrap,需要导入三个文件 -->
    <script src="js/jquery-1.12.4.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
</head>

<body>
    <table class="table table-bordered table-condensed table-hover">
        <thead>
            <tr>
                <th >姓名</th>
                <th>年龄</th>
                <th>性别</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td class="primary">1</td>
                <td class="info">11</td>
                <td class="success">111</td>
            </tr>
            <tr class="danger">
                <td>2</td>
                <td>22</td>
                <td>222</td>
            </tr>
            <tr>
                <td>3</td>
                <td>33</td>
                <td>333</td>
            </tr>
            <tr>
                <td>4</td>
                <td>44</td>
                <td>444</td>
            </tr>
            <tr>
                <td>5</td>
                <td>55</td>
                <td>555</td>
            </tr>
        </tbody>

    </table>

</body>

</html>

# 3-表单form/input

1556358453868

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 要使用bootstrap,需要导入三个文件 -->
    <script src="js/jquery-1.12.4.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
</head>

<body>
    <form>
        <div class="container">
            <div class="form-group">
                <label for="exampleInputEmail1">Email address</label>
                <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Email">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">Password</label>
                <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
            </div>
            <div class="form-group">
                <label for="exampleInputFile">File input</label>
                <input type="file" id="exampleInputFile">
                <p class="help-block">Example block-level help text here.</p>
            </div>
            <div class="checkbox">
                <label>
                    <input type="checkbox"> Check me out
                </label>
            </div>
            <button type="submit" class="btn btn-default">Submit</button>
    </form>
    </div>
</body>

</html>

# ==1.4-bootstrap组件==

# 1.字体图标

1556358516793

1556362512558

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Bootstrap Template</title>
    <!-- 使用bootstrap需要导入三个文件 -->
    <script src="js/jquery-1.12.4.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <link href="css/bootstrap.min.css" rel="stylesheet">
</head>

<body>
    <!-- 官网代码  -->
    <button type="button" class="btn btn-default" aria-label="Left Align">
        <span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
    </button>

    <button type="button" class="btn btn-success btn-lg">
        <span class="glyphicon glyphicon-star" aria-hidden="true"></span> Star
    </button>

    <!-- 其实字体图标就是一个span标签,想要哪个字体图标官网复制粘贴对应类名即可 -->
    <span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
</body>

</html>

# 2-按钮组件

1556362648445

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 要使用bootstrap,需要导入三个文件 -->
    <script src="js/jquery-1.12.4.min.js"></script>
    <script src="js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">

</head>

<body>
    <!-- 按钮组 -->
    <h3>按钮组</h3>
    <div class="btn-group" role="group" aria-label="...">
        <button type="button" class="btn btn-default">&lt;&lt;</button>
        <button type="button" class="btn btn-default">1</button>
        <button type="button" class="btn btn-default">2</button>
        <button type="button" class="btn btn-default">3</button>
        <button type="button" class="btn btn-default">&gt;&gt;</button>
    </div>
    <!-- 下拉菜单 -->
    <h3>下拉菜单</h3>
    <div class="btn-group">
        <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true"
            aria-expanded="false">
            商品分类 <span class="caret"></span>
        </button>
        <ul class="dropdown-menu">
            <a href="#"><button type="button" class="btn btn-success btn-block">手机</button></a>
            <li><a href="#">平板</a></li>
            <li><a href="#">笔记本</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">其他</a></li>
        </ul>
    </div>

</body>

</html>

# 3-进度条

1557307335663

<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Bootstrap Template</title>    <!-- 使用bootstrap需要导入三个文件 -->    <script src="js/jquery-1.12.4.min.js"></script>    <script src="js/bootstrap.min.js"></script>    <link href="css/bootstrap.min.css" rel="stylesheet">    <style>        .box{            width: 500px;            height: 10px;            margin: 0 auto;        }    </style></head><body>    <!-- bootstrap所有的样式都是通过类名来实现 -->    <div class="box">        <div class="progress">            <div class="progress-bar progress-bar-success progress-bar-striped progress-bar-striped active"                role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%;">                40%            </div>        </div>    </div>    <h3>堆叠进度条</h3>    <div class="progress">        <div class="progress-bar progress-bar-success" style="width: 35%">            <span class="sr-only">35% Complete (success)</span>        </div>        <div class="progress-bar progress-bar-warning progress-bar-striped" style="width: 20%">            <span class="sr-only">20% Complete (warning)</span>        </div>        <div class="progress-bar progress-bar-danger" style="width: 10%">            <span class="sr-only">10% Complete (danger)</span>        </div>    </div></body></html>

# ==1.5-bootstrap栅格系统(响应式布局)==

# 1-栅格系统介绍

  • 1.什么叫什么系统:以table表格的形式划分页面空间,从而实现布局。
  • 2.栅格的组成部分:
    • a.版心容器container(相当于html页面的container版心,相当于table表格)
      • b.row(相当于html页面的父盒子模型,相当于table中的tr)
        • c.col(相当于html页面的子盒子模型,相当于table中的tr)

1556372448889

  • 3.栅格样式的核心原理
    • a.版心容器(container是响应式版心,container-fluid是流式版心)
      • 他们两者唯一的区别是
        • container尺寸是固定的(1170,970,750,100%)
        • container-fluid的尺寸是铺满全屏: 100%
    • b.row:行
      • 默认没有高度,背景色、边框
      • 默认宽度为100%
        • 继承版心的宽度
      • 默认左右margin为 -15px (作用是抵消container左右的padding)
    • c.列col: 类名遵循固定的格式 col-s-x
      • s(screen):表示屏幕尺寸,他们有四个可选值
        • lg:大栅格,这种栅格在屏幕宽度大于等于1200时可以排成一行,小于1200时每个栅格独占一行
        • md:中栅格,这种栅格在屏幕宽度大于等于992时可以排成一行,小于992时每个栅格独占一行
        • sm:小栅格,这种栅格在屏幕宽度大于等于768时可以排成一行,小于768时每个栅格独占一行
        • xs:超小栅格,这种栅格所有屏幕宽度下都会排成一行
      • x(1-12之间的数字,尺寸比例):bootstrap将水平方向分为12份,每一份表示row宽度的 1/12
        • ==col列需要写在行row标签中,每一行的栅格整体宽度占据12份,大于12份就会换行==
    • 示例:(详细效果请参考下图与真实代码演示)
      • col-设备类型-数字(宽度比例 1 = 屏幕 1/12)
      • col-lg-6:表示该栅格在屏幕宽度大于等于1200时,占的宽度比例是6份( 6/12 = 0.5 相当于width:50%)。一旦屏幕宽度小于1200,单独一行(x的尺寸直接失效)
      • col-lg-3:表示该栅格在屏幕宽度大于等于1200时,占的宽度比例是3份( 3/12 = 0.25 相当于width:25%)。一旦屏幕宽度小于1200,单独一行(x的尺寸直接失效)
      • col-md-4:表示该栅格在屏幕宽度大于等于992时,占的宽度比例是4份( 4/12 = 0.33 相当于width:33.3% 三分之一)。一旦屏幕宽度小于992,单独一行(x的尺寸直接失效)
      • col-sm-2:表示该栅格在屏幕宽度大于等于768时,占的宽度比例是2份( 2/12 = 0.167 相当于width:16.7%,六分之一)。一旦屏幕宽度小于768,单独一行(x的尺寸直接失效)
      • col-xs-8:表示该栅格在任何屏幕下,占的宽度比例是8份( 8/12 = 0.667 相当于width:66.7%,三分之二)。
      • col-lg-3 col-md-4:(1)表示该栅格在屏幕宽度 >= 1200时,占3份(宽度四分之一),(2)在992<=屏幕宽度<1200时,占4份(宽度三分之一),(3) <=992 直接显示一行
      • col-lg-3 col-md-4 col-sm-6:(1)表示该栅格在屏幕宽度 >= 1200时,(2)占3份(宽度四分之一),(3)在992<=屏幕宽度<1200时,占4份(宽度三分之一), <=992,(4)在 768<= 屏幕宽度 < 992时,占6份(二分之一),(5) <768,直接显示一行

1556373357085

1556373376351

1556374467796

1556374528464

1556374622502

1556374700261

# 2-版心容器container

  • bootstrap中有两种版心容器可供使用者选择
    • container:响应式版心容器
      • 默认样式:
        • 没有高度、边框、颜色
        • 左右15px的padding
      • 宽度是响应式
        • 屏幕宽度 < 768 宽度100%
        • 768 <= 屏幕宽度 < 992 宽度750
        • 992 <= 屏幕宽度 < 1200 宽度970
        • 1200 <= 屏幕宽度 < 1200 宽度1170
    • container-fluid:流式版心容器
      • 默认样式:
        • 没有高度、边框、颜色
        • 左右15px的padding
        • 宽度100%

1556365619724

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <!-- 导入bootstrap -->    <!-- 1.jquery.js -->    <script src="./bootstrap/js/jquery-1.12.4.min.js"></script>    <!-- 2.bootsrap.js -->    <script src="./bootstrap/js/bootstrap.js"></script>    <!-- 3.bootstrap.css -->    <link rel="stylesheet" href="./bootstrap/css/bootstrap.css">    <!--         1.栅格系统 : 以表格形式 来 布局 网页结构        2.栅格系统三要素(重点)            a. 版心 : container      (相当于之前的版心)            b. 行   :  row             (相当于之前的父盒子  top-bar nav-bar)            c. 列   :  col-             (相当于之前的子盒子  li   a  item)        3.栅格系统其它功能(了解)     -->     <!--          (1)栅格系统 版心 : container            版心默认样式: 没有高度,左右有15px padding            a. 流式版心(网站不做响应式) :container-fluid                * 宽度:100%            b. 响应式版心(网站做响应式) : container                * >12000px(PC)  : 1170px                * 992-1200  :     970px                * 768-992  :      750px                * <768(手机)  :   100%         (2)栅格系统  行 : row         (3)栅格系统  列 : col-      -->      <style>          .container-fluid{              height: 100px;              background-color: red          }          .container{              height: 100px;              background-color: green;          }          /* 需求: 产品经理要求的版心与默认版心不一致?            (1)>1200  要求版心1100            (2)600 - 800之间  要求版心700            解决方案:使用媒体查询覆盖默认的版心          */          @media(min-width:1200px){              .container{                  width: 1100px;              }          }          @media(min-width:600px) and (max-width:800px){              .container{                  width: 700px;              }          }      </style></head><body>    <!-- 版心 -->    <div class="container-fluid"></div>    <div class="container"></div></body></html>

# 3-行row

1584873153698

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <!-- 导入bootstrap -->    <!-- 1.jquery.js -->    <script src="./bootstrap/js/jquery-1.12.4.min.js"></script>    <!-- 2.bootsrap.js -->    <script src="./bootstrap/js/bootstrap.js"></script>    <!-- 3.bootstrap.css -->    <link rel="stylesheet" href="./bootstrap/css/bootstrap.css">    <!--         1.栅格系统 : 以表格形式 来 布局 网页结构        2.栅格系统三要素(重点)            a. 版心 : container      (相当于之前的版心)            b. 行   :  row             (相当于之前的父盒子  top-bar nav-bar)            c. 列   :  col-             (相当于之前的子盒子  li   a  item)        3.栅格系统其它功能(了解)     -->     <!--          (1)栅格系统 版心 : container            版心默认样式: 没有高度,左右有15px padding            a. 流式版心(网站不做响应式) :container-fluid                * 宽度:100%            b. 响应式版心(网站做响应式) : container                * >12000px(PC)  : 1170px                * 992-1200  :     970px                * 768-992  :      750px                * <768(手机)  :   100%         (2)栅格系统  行 : row            默认样式: 没有高度,宽度100%, 左右-15px margin(目的:抵消版心的padding)         (3)栅格系统  列 : col-      -->      <style>          /* 版心 */          .container-fluid{              background-color: pink          }          /* 行:row */          .row{              height: 100px;              margin-top: 10px;              background-color: green;          }      </style></head><body>    <!-- 版心 -->    <div class="container-fluid">        <!-- 行:父元素(top-bar banner nav-bar list) -->        <div class="row"></div>        <div class="row"></div>        <div class="row"></div>        <div class="row"></div>    </div></body></html>

# 4-列col

1584873210751

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <!-- 导入bootstrap -->    <!-- 1.jquery.js -->    <script src="./bootstrap/js/jquery-1.12.4.min.js"></script>    <!-- 2.bootsrap.js -->    <script src="./bootstrap/js/bootstrap.js"></script>    <!-- 3.bootstrap.css -->    <link rel="stylesheet" href="./bootstrap/css/bootstrap.css">    <!--         1.栅格系统 : 以表格形式 来 布局 网页结构        2.栅格系统三要素(重点)            a. 版心 : container      (相当于之前的版心)            b. 行   :  row             (相当于之前的父盒子  top-bar nav-bar)            c. 列   :  col-             (相当于之前的子盒子  li   a  item)        3.栅格系统其它功能(了解)     -->     <!--          (1)栅格系统 版心 : container            版心默认样式: 没有高度,左右有15px padding            a. 流式版心(网站不做响应式) :container-fluid                * 宽度:100%            b. 响应式版心(网站做响应式) : container                * >12000px(PC)  : 1170px                * 992-1200  :     970px                * 768-992  :      750px                * <768(手机)  :   100%         (2)栅格系统  行 : row            默认样式: 没有高度,宽度100%, 左右-15px margin(目的:抵消版心的padding)         (3)栅格系统  列 : col-      -->      <style>          /* 版心 */          .container-fluid{              background-color: pink          }          /* 行:row */          .row{              /* 父盒子高度一般被内容撑开 */          }          /* 列: col-尺寸-比例   ( bootstrap将屏幕分为12份, 1 = 1/12 )                lg: 尺寸   >1200px                6 : 宽度比例     1 = 屏幕1/12    6 * 1/12 = 50%          (1) col-lg-6  : 当屏幕宽度>1200px, 宽度比例生效。 否则不生效(100%)          (2) col-md-3  :  当屏幕尺寸>992px,宽度比例生效。 否则不生效(100%)          (3) col-sm-2  :  当屏幕尺寸>768px,宽度比例生效。 否则不生效(100%)          (4) col-xs-4  :  任何屏幕尺寸, 宽度比例都会生效                          */          /* div[] : 属性选择器                class*="col-lg" : 类名只要包含 col-lg          */          div[class*="col-lg"]{            height: 50px;            background-color: red;            border: 1px solid black;          }          div[class*="col-md"]{            height: 50px;            background-color: orange;            border: 1px solid black;          }          div[class*="col-sm"]{            height: 50px;            background-color: yellow;            border: 1px solid black;          }          div[class*="col-xs"]{            height: 50px;            background-color: green;            border: 1px solid black;          }      </style></head><body>    <!-- 版心 -->    <div class="container-fluid">        <!-- 行:父元素(top-bar banner nav-bar list) -->        <div class="row">            <!-- 列:子元素 -->            <div class="col-lg-6">屏幕一半</div>            <div class="col-lg-3">屏幕四分之一</div>            <div class="col-lg-3">屏幕四分之一</div>        </div>        <!-- 父元素 -->        <div class="row">            <!-- 列:子元素 -->            <div class="col-md-3">四分之一</div>            <div class="col-md-3">四分之一</div>            <div class="col-md-3">四分之一</div>            <div class="col-md-3">四分之一</div>        </div>        <!-- 父元素 -->        <div class="row">            <!-- 列:子元素 -->            <div class="col-sm-2">六分之一</div>            <div class="col-sm-2">六分之一</div>            <div class="col-sm-2">六分之一</div>            <div class="col-sm-2">六分之一</div>            <div class="col-sm-2">六分之一</div>            <div class="col-sm-2">六分之一</div>        </div>        <!-- 父元素 -->        <div class="row">            <!-- 列:子元素 -->            <div class="col-xs-4">三分之一</div>            <div class="col-xs-4">三分之一</div>            <div class="col-xs-4">三分之一</div>        </div>    </div></body></html>

# 5-栅格系统练习

需求:

​ 1.pc端,屏幕尺寸>=1200,一行显示四个盒子

​ 2.大屏平板: 屏幕尺寸 992-1200,一行显示三个盒子

​ 3.平板: 屏幕尺寸768-992,一行显示两个盒子

​ 4.手机: 屏幕尺寸<768,一行显示一个盒子

<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Bootstrap Template</title>    <!-- 使用bootstrap需要导入三个文件 -->    <script src="js/jquery-1.12.4.min.js"></script>    <script src="js/bootstrap.min.js"></script>    <link href="css/bootstrap.min.css" rel="stylesheet">    <style>        div[class*="col-"] {            height: 100px;            /* padding: 20px; */            /* 通过padding来控制栅格之间的间距 */            /* padding: 10px; */        }        .box{            border: 1px solid black;            width: 100%;            height: 100%;            margin: 0 auto;            background-color: green;            box-sizing: border-box;        }    </style></head><body>    <div class="container-fulid">        <div class="row">            <div class="col-lg-3 col-md-4 col-sm-6">                <div class="box"></div>            </div>            <div class="col-lg-3 col-md-4 col-sm-6">                <div class="box "></div>            </div>            <div class="col-lg-3 col-md-4 col-sm-6">                <div class="box"></div>            </div>            <div class="col-lg-3 col-md-4 col-sm-6">                <div class="box"></div>            </div>        </div>    </div></body></html>

# 6-栅格偏移

  • 栅格默认是左浮动的,所有栅格默认是靠左对齐的,但是栅格在排列时也可以往右偏移一段距离,通过偏移的样式类就可以了,偏移的样式类和栅格一样,也分为四种

    1、.col-lg-offset-x x代表1~12的数字,它表示栅格偏移的宽度份数,在屏幕宽度大于等于1200起作用 2、.col-md-offset-x 在屏幕宽度大于等于992起作用 3、.col-sm-offset-x 在屏幕宽度大于等于768起作用 4、.col-xs-offset-x 在屏幕宽度小于768起作用

1584873418373

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <!-- 导入bootstrap -->    <!-- 1.jquery.js -->    <script src="./bootstrap/js/jquery-1.12.4.min.js"></script>    <!-- 2.bootsrap.js -->    <script src="./bootstrap/js/bootstrap.js"></script>    <!-- 3.bootstrap.css -->    <link rel="stylesheet" href="./bootstrap/css/bootstrap.css">    <!--         1.栅格系统 : 以表格形式 来 布局 网页结构        2.栅格系统三要素(重点)            a. 版心 : container      (相当于之前的版心)            b. 行   :  row             (相当于之前的父盒子  top-bar nav-bar)            c. 列   :  col-             (相当于之前的子盒子  li   a  item)        3.栅格系统其它功能(了解)            栅格偏移 : col-尺寸-offset-比例            栅格隐藏     -->     <!--          (1)栅格系统 版心 : container            版心默认样式: 没有高度,左右有15px padding            a. 流式版心(网站不做响应式) :container-fluid                * 宽度:100%            b. 响应式版心(网站做响应式) : container                * >12000px(PC)  : 1170px                * 992-1200  :     970px                * 768-992  :      750px                * <768(手机)  :   100%         (2)栅格系统  行 : row            默认样式: 没有高度,宽度100%, 左右-15px margin(目的:抵消版心的padding)         (3)栅格系统  列 : col-            col-尺寸-比例   ( bootstrap将屏幕分为12份, 1 = 1/12 )                lg: 尺寸   >1200px                6 : 宽度比例     1 = 屏幕1/12    6 * 1/12 = 50%                (1) col-lg-6  : 当屏幕宽度>1200px, 宽度比例生效。 否则不生效(100%)                (2) col-md-3  :  当屏幕尺寸>992px,宽度比例生效。 否则不生效(100%)                (3) col-sm-2  :  当屏幕尺寸>768px,宽度比例生效。 否则不生效(100%)                (4) col-xs-4  :  任何屏幕尺寸, 宽度比例都会生效      -->      <style>            /* 版心 */            .container-fluid{                background-color: pink            }            div[class*="col-lg"]{              height: 50px;              background-color: red;              border: 1px solid black;            }              div[class*="col-md"]{              height: 50px;              background-color: orange;              border: 1px solid black;            }              div[class*="col-sm"]{              height: 50px;              background-color: yellow;              border: 1px solid black;            }              div[class*="col-xs"]{              height: 50px;              background-color: green;              border: 1px solid black;            }        </style></head><body>    <!-- 版心 -->    <div class="container-fluid">            <!-- 行:父元素(top-bar banner nav-bar list) -->            <div class="row">                <!-- 列:子元素 -->                <div class="col-lg-6 col-lg-offset-3">屏幕一半</div>            </div>            <!-- 父元素 -->            <div class="row">                <!-- 列:子元素 -->                <div class="col-md-3 col-md-offset-2">四分之一</div>                <div class="col-md-3 col-md-offset-2">四分之一</div>            </div>            <!-- 父元素 -->            <div class="row">                <!-- 列:子元素 -->                <div class="col-sm-2">六分之一</div>                <div class="col-sm-2 col-sm-offset-3">六分之一</div>                <div class="col-sm-2 col-sm-offset-3">六分之一</div>            </div>            <!-- 父元素 -->            <div class="row">                <!-- 列:子元素 -->                <div class="col-xs-4">三分之一</div>                <div class="col-xs-4 col-xs-offset-4">三分之一</div>            </div>        </div></body></html>

# 7-栅格隐藏

在某个查询区间,将栅格隐藏,可以用隐藏的样式,这个样式包括四个: 1、.hidden-xs 在屏幕小于768时将栅格隐藏 2、.hidden-sm 在屏幕大于等于768小于992时将栅格隐藏 3、.hidden-md 在屏幕大于等于992小于1200时将栅格隐藏 4、.hidden-lg 在屏幕大于等于1200时将栅格隐藏

注意点

​ a:如果设置一个栅格隐藏样式为hidden-md:表示该栅格只会在 768 <= 屏幕尺寸 <992区间隐藏,如果屏幕尺寸 <= 768,则又会显示

​ b.如果希望一个栅格在屏幕尺寸 <= 992时隐藏,可以设置栅格隐藏样式为:hidden-sm hidden-xs

1556375574406

<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Bootstrap Template</title>    <!-- 使用bootstrap需要导入三个文件 -->    <script src="js/jquery-1.12.4.min.js"></script>    <script src="js/bootstrap.min.js"></script>    <link href="css/bootstrap.min.css" rel="stylesheet"></head><body>    <style>        /* 选择所有class名称包含“col-”的div标签 */        div[class*="col-"] {            height: 50px;            background-color: yellowgreen;            border: 1px solid #000;        }    </style>        <!-- 第三个栅格在宽度小于768时隐藏 -->    <div class="row">        <div class="col-lg-4 col-md-4 col-sm-6">.col-lg-4</div>        <div class="col-lg-4 col-md-4 col-sm-6">.col-lg-4</div>        <div class="col-lg-4 col-md-4 hidden-sm hidden-xs">.col-lg-4</div>    </div></body></html>

# 02-今日课后练习

  • 欢迎大家通过百度,来解决各种遇到的问题

  • 第一题 : 栅格系统实现双版心布局

<!-- 页面结构 :  两个版心  左边 : 3   右边: 9         需求: <768px 隐藏左边版心    -->

1584873659417

1584873672856

  • 第二题 : 栅格系统实现七列等分布局

1584873702345