弹性布局、移动端布局、CSS3媒体查询实现响应式布局

弹性布局
两部分:
       1. 语法是添加到父容器上的?
           display : flex;
       1-1.(flex-direction用来控制子项整体布局方向,是从左往右还是从右往左,是从上往下还是从下往上。)
           flex-direction: row; 布局的排列方向 (主轴排列方向)
                row 默认值,显示为行。方向为当前文档水平流方向,默认情况下是从左往右。
                row-reverse  显示为行。但方向和row属性值是反的
                column  显示为列
                column-reverse 显示为列。但方向和column属性值是反的
       1-2. (flex-wrap用来控制子项整体单行显示还是换行显示。)
           flex-wrap : nowrap; 是否进行换行处理。
                nowrap; 默认值,不换行处理
                wrap; 换行处理
                wrap-reverse; 反向换行
       1-3.(flex-flow属性是flex-direction和flex-wrap的缩写,表示flex布局的flow流动特性。第一个值表示方向,第二个值表示换行,中间用空格隔开。)
           flex-flow : flex-direction flex-wrap 复合写法 (是有顺序的)。
       1-4.(justify-content属性决定了主轴方向上子项的对齐和分布方式。)
           justify-content ; 属性决定了主轴方向上子项的对齐和分布方式。  
               flex-start : 子项都去起始位置对齐。
               flex-end : 子项都去结束位置对齐。
               center : 子项都去中心位置对齐。
               space-between : 表现为两端对齐。between是中间的意思,意思是多余的空白间距只在元素中间区域分配。 
               space-around : around是环绕的意思,意思是每个flex子项两侧都环绕互不干扰的等宽的空白间距,最终视觉上边缘两侧的空白只有中间空白宽度一半。
               space-evenly : evenly是匀称、平等的意思。也就是视觉上,每个flex子项两侧空白间距完全相等。
        1-5.(align-items中的items指的就是flex子项们,因此align-items指的就是flex子项们相对于flex容器在侧轴方向上的对齐方式)
           align-items : 每一行中的子元素上下对齐方式。
               flex-start;
               center;
               flex-end;
         1-6.(align-content可以看成和justify-content是相似且对立的属性,如果所有flex子项只有一行,则align-content属性是没有任何效果的。)
           align-content : 跟justify-content相反的操作。侧轴的对齐方式。(最少需要两行才能看出效果,因为他是多行的一个上下对齐方式)
               默认:多行下,有几行就会把容器划分为几部分,默认就是stretch拉伸的。
               值跟justify-content取值是相同的。

   	2.作用在flex子项上的CSS属性
   		order:可以通过设置order改变某一个flex子项的排序位置。所有flex子项的默认order属性值是0。
   		 flex-grow:属性中的grow是扩展的意思,扩展的就是flex子项所占据的宽度,扩展所侵占的空间就是除去元素外的剩余的空白间隙。默认值为0。
   		flex-shrink:属性中的shrink是“收缩”的意思,flex-shrink主要处理当flex容器空间不足时候,单个元素的收缩比例。默认值是1。
   		flex-basis:flex-basis定义了在分配剩余空间之前元素的默认大小。
   		flex:flex属性是flex-grow,flex-shrink和flex-basis的缩写
   		align-self:align-self指控制单独某一个flex子项的垂直对齐方式。

   
   注:默认情况下,在弹性盒子中的子元素的左右排列的。
   注:默认情况下,当宽高不写的时候,宽度由内容决定,高度由父容器决定。

   注:当子项的总宽度大于父容器的时候,会自动收缩的(弹性的优先级是大于自身固定大小的)
   注:当子项的内容已经达到了父容器最小宽高的时候,就会出现溢出的现象。
弹性导航
  • flex-shrink: 0;使nav导航不收缩实现一行排列多余溢出
  	<style>
      *{margin: 0;padding: 0;}
      a{text-decoration: none;}
      .main{width: 750px;margin: 30px auto;border-bottom: 1px gray;background: #161618;}
      .main .nav{height: 70px;font-size: 20px;line-height: 70px;display: flex;}
      .main .nav a{color: #999999;margin: 0 10px;flex-shrink: 0;position: relative;}
      .main .nav a.active{color: #c8a06a;}
      .main .nav a.active::after{background: #c8a06a;content: "";width: 50%;height: 6px;display: block;border-radius: 4px;position: absolute;left: 50%; bottom: 10px;transform: translateX(-50%);}
  </style>
</head>
<body>
  <div class="main">
      <div class="nav">
          <a class="active" href="#">精选</a>
          <a class="active" href="#">vip</a>
          <a href="#">电影</a>
          <a href="#">电视剧</a>
          <a href="#">综艺</a>
          <a href="#">精选</a>
          <a href="#">vip</a>
          <a href="#">电影</a> 
          <a class="active" href="#">电视剧</a>
          <a href="#">综艺</a>
          <a href="#">精选</a>
          <a href="#">vip</a>
          <a href="#">电影</a>
          <a href="#">电视剧</a>
          <a href="#">综艺</a>
      </div>
  </div>
</body>
使用弹性布局制作骰子、3d
<style>
        *{margin: 0;padding: 0;}
        /* box1 */
        .box1{background: red; width: 200px;height: 200px;border-radius: 15px; display: flex;justify-content: center;align-items: center;position: absolute;left: 0px;top: 0px;}
        .box1 div{width: 40px;height: 40px;background: black;border-radius: 50%;}
        /* box2 */
        .box2{background: greenyellow; width: 200px;height: 200px;border-radius: 15px; display: flex;justify-content: space-evenly; align-items: center;position: absolute;left: -200px;top: 0px;transform-origin: right;transform: rotateY(-90deg);}
        .box2 div{width: 40px;height: 40px;background: black;border-radius: 50%;}
        /* box3 */
        .box3{background: indigo; width: 200px;height: 200px;border-radius: 15px; display: flex;justify-content: space-evenly;position: absolute;right: -200px;top: 0;transform-origin: left;transform: rotateY(90deg);}
        .box3 div{width: 40px;height: 40px;background: black;border-radius: 50%;margin: 15px;}
        .box3 div:nth-of-type(2){align-self: center;}
        .box3 div:nth-of-type(3){align-self:flex-end;}
        /* box4 */
        .box4{background: cyan; width: 200px;height: 200px;border-radius: 15px; display: flex;flex-direction: column;justify-content: center;position: absolute;left: 0;top: -200px;transform-origin: bottom;transform: rotateX(90deg);}
        .box4 div{display: flex;flex-direction: row;justify-content: space-evenly;}
        .box4 div span{display: block; width: 40px;height: 40px;background: black;border-radius: 50%;margin: 15px;}
        /* box5 */
        .box5{background: darkmagenta; width: 200px;height: 200px;border-radius: 15px; display: flex;flex-direction: column;justify-content: center;position: absolute;left: 0;top: 200px;;transform-origin: top;transform: rotateX(-90deg);}
        .box5 div{display: flex;flex-direction: row;justify-content: space-evenly;}
        .box5 div span{display: block; width: 40px;height: 40px;background: black;border-radius: 50%;margin: 15px;}
        /* box6 */
        .box6{background: darkred; width: 200px;height: 200px;border-radius: 15px; display: flex;flex-direction: column;justify-content: center;position: absolute;left: 0;top: 0;transform: translateZ(-200px);}
        .box6 div{display: flex;flex-direction: row;justify-content: space-evenly;}
        .box6 div span{display: block; width: 40px;height: 40px;background: black;border-radius: 50%;margin: 15px;}
        /* box */
        .box{width: 600px;height: 600px;border: 1px solid gray;margin: 20px auto;position: relative;perspective: 800px;perspective-origin:top;}
        /* transform-style: preserve-3d;transition: 4s linear; */
       
        .small{width: 200px;height: 200px;margin: 200px;position: relative;transform-style: preserve-3d;transition: 4s linear;transform-origin: center center -100px;}
         .box:hover .small{transform: rotateY(360deg);}

    </style>
</head>
<body>
    <div class="box">
        <div class="small">
            <!-- box1 -->
            <div class="box1">
                <div></div>
            </div>
            <!-- box2 -->
            <div class="box2">
                <div></div>
                <div></div>
            </div>
            <!-- box3 -->
            <div class="box3">
                <div></div>
                <div></div>
                <div></div>
            </div>
            <!-- box4 -->
            <div class="box4">
                <div>
                    <span></span>
                    <span></span>
                </div>
                <div>
                    <span></span>
                    <span></span>
                </div>
            </div>
            <!-- box5 -->
            <div class="box5">
                <div>
                    <span></span>
                    <span></span>
                </div>
                <div>
                    <span></span>
                </div>
                <div>
                    <span></span>
                    <span></span>
                </div>
            </div>
            <!-- box6 -->
            <div class="box6">
                <div>
                    <span></span>
                    <span></span>
                </div>
                <div>
                    <span></span>
                    <span></span>
                </div>
                <div>
                    <span></span>
                    <span></span>
                </div>
            </div>
        </div>
    </div>
</body>
弹性自适应网页布局
  • flex-grow:1;默认为0不扩展1扩展空间实现页面宽高自动收缩
<style>
        /* 左右排列 */
        html,body{height: 100%;}
        *{margin: 0;padding: 0;}
        .box{height: 500px;display: flex;}
        .box div:nth-of-type(1){width: 200px;background: cyan;}
        .box div:nth-of-type(2){flex-grow: 1; background: yellowgreen;}
        .box div:nth-of-type(3){width: 100px;background: green;} 
        /* 上下排列 */
        html,body{height: 100%;}
        *{margin: 0;padding: 0;}
        .box{height: 100%; display: flex;flex-direction: column;}
        .box div:nth-of-type(1){height: 200px;background: cyan;}
        .box div:nth-of-type(2){flex-grow: 1; background: yellowgreen;}
        .box div:nth-of-type(3){height: 200px;background: green;}
    </style>
</head>
<body>
    <div class="box">
        <div></div>
        <div></div>
        <div></div>
    </div>
</body>
网格布局grid
  • css flex属性
    • 让所有弹性盒模型对象的子元素都有相同的长度,且忽略它们内部的内容#main div{flex:1;}
2. grid网格布局?

   作用在容器上的:
       display : grid
       grid-template-columns : 设置列数
       grid-template-rows : 设置行数
           fr单位
           repeat()方法
           注:网格中提供了一个新的单位:fr ( 比例单位 )
       grid-template-areas : 划分区域的
           注:区域必须是矩形。
       grid-template:复合写法
           grid-template-rows
           grid-template-columns
           grid-template-areas

           grid-template: 
           "a1 a1 a1" 1fr
           "a3 a3 a2" 1fr
           "a3 a3 a2" 1fr
           /1fr 1fr 1fr;

       grid-column-gap : 列的间距
       grid-row-gap : 行的间距
       grid-gap : 复合写法
           grid-row-gap  grid-column-gap

       justify-items : 子项的水平居中方式
           默认 :  stretch 默认值,拉伸。表现为水平或垂直填充。
           start
           center
           end

       align-items : 子项的垂直居中方式
           默认 :  stretch 默认值,拉伸。表现为水平或垂直填充。
           start
           center
           end
       place-items : 复合写法
           align-items justify-items

       justify-content : 整体网格的水平对齐方式
            默认:stretch
            start
            end
            center
            space-between
            space-around
            space-evenly

       align-content : 整体网格的垂直对齐方式
           默认:stretch
            start
            end
            center
            space-between
            space-around
            space-evenly

       place-content : 复合写法
           align-content justify-content

   
   作用在子项上的:

       grid-area : 找指定的区域
           1.对应网格的名字
           2.写对应的线的数字:grid-area : 1 / 3 / span 2 / 4; 
               grid-row-start / grid-column-start / grid-row-end / grid-column-end

       grid-column-start  水平方向上占据的起始位置
       grid-column-end    水平方向上占据的结束位置
       grid-row-start     垂直方向上占据的起始位置
       grid-row-end       垂直方向上占据的结束位置
           注:只有在grid-column-end和 grid-row-end 中可以设置span操作。span去设置的不是结束位置,而是个数。 
               正常数字是位置,加上span是个数。

       grid-column:3 / 4;
           grid-column-start / grid-column-end
       grid-row:1 / span 2;
            grid-row-start / grid-row-end

       justify-self
       algin-self
       place-self
移动端布局
  • 底部导航navbar设置注意点

    • 1.position:fixed固定
    • 2.利用弹性flex:1;属性分配子div在父div中所占区域等分
  • 移动端布局方案
    1.流式布局
    好处: 大屏幕下显示更多的内容。
    坏处:宽屏下比例会有一些不协调。
    2. rem布局
    好处: 不同设备下看起来比较协调。
    坏处: 显示的内容并不会在大屏幕展示的内容多。
    em : 是一个相对单位,1em等于当前元素或父元素的font-size值。
    1em == 1个font-size的大小
    rem : 是一个相对单位,1rem等于根元素的font-size值。
    1rem == 1个根元素的font-size大小 就是 1个html标签的font-size大小
    rem -> root + em
    rem布局的原理
    页面中的元素采用rem作为尺寸或者间距的单位。
    想办法去动态改变html标签的font-size大小,这样就可以适配不同的设备进行等比缩放。
    如何做到font-size动态化?
    1. 通过JS (JavaScript)
    document.documentElement.clientWidth -> 获取布局视口的宽度。
    在iphone 6 -> document.documentElement.clientWidth -> 375
    在iphone 6 plus -> document.documentElement.clientWidth -> 414
    在iphone 6 -> font-size 100px ?
    document.documentElement.clientWidth(375) / 3.75 -> 100
    在iphone 6 plus -> font-size 大于 100px ?
    document.documentElement.clientWidth(414) / 3.75 -> 110.4
    2. 通过vw(vw是尺寸单位)
    vw -> view width
    vh -> view height
    相对单位:表示把屏幕自动分成了100vw宽和100vh高。
    vw / vh : 把屏幕分为100份,1vw等于屏幕宽的1%。
    假设屏幕是375px -> 100vw -> 1vw == 3.75px
    假设屏幕是414px -> 100vw -> 1vw == 4.14px
    iphone6 -> html的font-size ? -> 100px0
    1vw == 3.75px ? -> 多少个vw == 100px -> 26.66667vw -> 100px
    iphone6 plus -> html的font-size ? ->
    1vw == 4.14px ? -> 26.66667 * 4.14px ? -> 110.4px

    注:选择iphone6的html的font-size为100是为了好算。也可以用工具辅助开发。
    vsCode中去下载一个插件 -> px to rem -> 在设置把对应的font-size设置下。
    -> alt + z进行px转rem的操作。

    注:使用rem进行布局的时候,一定要在body中重置默认的font-size大小。

    实战rem布局:
    直接按一种设备去做。-> iphone 6 -> 版心375。
    注:在线px转rem:http://www.ofmonkey.com/front/rem
    注:做rem布局,心里只想着iphone 6一款设备,然后测量尺寸,换 算rem。
    5. UI设计师移动端的页面该怎么设计?
    设计师只会按照一种设备进行设计( iphone 6 或者 iphone 6 plus )
    前端会自己是适配不同的移动端设备。
    注:移动端所用到的图片,都是比要显示的区域要大。
    注:设计师一般会设计一套正常大小的设计图,还会设计一套2倍的设计图(方便获取大图)

响应式布局&CSS3媒体查询实现
  1. 响应式布局?
    用一套代码,去适配不同的设备。既可以运行在PC端,也可以运行在移动端。
    注:比较适合小网站,个人博客,产品介绍页…

  2. CSS3 媒体查询?
    即media queries,可以针对不同的媒体类型定义不同的样式,从而实现响应式布局 。也可以针对不同的分辨率设置不同的样式。

    1024分辨率以上:PC端
    1024 ~ 768 : pad pro
    768 ~ 450 : pad mini , mobile 横屏
    450分辨率以下: mobile 竖屏

  3. 媒体查询的语法?

    常见的媒体类型:
    all 用于所有设备
    print 用于打印机和打印预览。
    screen 用于电脑屏幕,平板电脑,智能手机等。
    speech 应用于屏幕阅读器等发声设备。

    @media all and (min-width:500px){ }
    @media all and (min-width:500px) and (max-width:800px){ }

    orientation:portrait : 竖屏
    orientation:landscape : 横屏
    @media all and (orientation:portrait){}
    注:这个横竖屏操作,只是针对移动端的。在PC端屏幕永远是竖屏的。

    注:空格是需要添加的,要符合规范。

    link的使用:
    <link rel="stylesheet" href="./hello.css" media="all and (min-width:600px)">

  4. 如何实现响应式布局呢?

    1. 先去适配手机端 -> 过渡到pad -> 过渡到pc (不是很推荐)
    2. 先去适配PC端 -> 过渡到pad -> 过渡到手机端 (推荐的)

    /* 正常的样式 , 针对PC端的 */
    100行CSS

    /* 针对pad pro */
    @media all and (max-width:1024px){ 50行CSS }

    /* 针对pad mini 和 mobile 横屏 */
    @media all and (max-width:768px){ }

    /* 针对 mobile 竖屏 */
    @media all and (max-width:450px){ }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值