媒体查询,flex弹性盒布局,响应式布局

媒体查询

为适应移动端不同手机的屏幕尺寸,识别不同宽度匹配不同方案
@media常用参数

属性名称作用
width、height浏览器可视宽度、高度
device-width设备屏幕的宽度
device-height设备屏幕的高度
示例1

背景色的设置:根据不同的屏幕尺寸,设置不同的背景色
(把device-width改成width即浏览器尺寸)

/*screen是区分打印/屏幕显示,一般是屏幕显示,可以去掉*/
div {
  width: 150px;
  height: 200px;
}
/* 屏幕尺寸为100px~200px时背景色为红色 */
@media screen and (min-device-width:100px) and (max-device-width:200px){
  div {
    background-color: rgb(221, 39, 39);
  }

}

/* 屏幕尺寸为201px~300px时背景色为蓝色 */
@media screen and (min-device-width:201px) and (max-device-width:300px){
  div {
    background-color: rgb(39, 215, 221);
  }
  
}

示例2

div换行显示

body div{
  float:left;
  height:50px
}
body div:nth-child(1){
  background-color: rgb(240, 6, 6);
}
body div:nth-child(2){
  background-color: rgb(150, 240, 6);
}
body div:nth-child(3){
  background-color: rgb(6, 154, 240);
}
/* 一行显示3个 */
@media screen and (max-device-width:200px){
  body div{
    width: 100%;
  }
}

@media screen and (min-device-width:201px) and (max-device-width:300px){
  body div{
    width: 50%;
  }
}

@media screen and (min-device-width:301px){
  body div{
    width: 33.3%;
  }
}
媒体查询的其他引入方式
1.外部样式表

写在link标签中,有条件地引入外部样式表

  <link rel="stylesheet" href="style.css">

  <!-- 屏幕尺寸在100px~300px之间时引入 -->
  <link rel="stylesheet" href="style2.css" 
  media="(min-device-width:400px)">

  <!-- 屏幕尺寸301px~400px -->
  <link rel="stylesheet" href="style3.css" 
  media="(min-device-width:300px) and (max-device-width:399px)">
  <div id="div0">
    <div></div>
    <div></div>
    <div></div>
  </div>

style.css

#div0{
  width: 100%;
  height: 500px;
}
#div0 div{
  float:left;
  height: 100px;
  width: 100%;
}

#div0 div:nth-child(1){
  background-color: rgb(245, 12, 12);
}
#div0 div:nth-child(2){
  background-color: rgb(202, 245, 12);
}
#div0 div:nth-child(3){
  background-color: rgb(12, 198, 245);
}


style2.css

#div0 div{
  width: 33.3%;
}

style3.css

#div0 div{
  width: 50%;
}
2.内部样式表(在一个style中)
3.内部样式表(在多个style中)
 <!-- 公共样式 -->
  <style>
    div{
      width: 100%;
      height: 500px;
    }
    body div{
      float: left;
      height: 100px;
    }
    body div:nth-child(1){
      background-color: rgb(240, 6, 6);
    }
    body div:nth-child(2){
      background-color: rgb(150, 240, 6);
    }
    body div:nth-child(3){
      background-color: rgb(6, 154, 240);
    }
  </style>

  <!-- 屏幕尺寸为300px~399px时 -->
  <style media="(min-device-width:300px) and (max-device-width:399px)">
    body div{
      width: 50%;
    }
  </style>

  <!-- 屏幕尺寸为400px~499px时 -->
  <style media="(min-device-width:400px) and (max-device-width:499px)">
    body div{
      width: 33.3%;
    }
  </style>
</head>
<body>
  <div></div>
  <div></div>
  <div></div>
</body>
</html>

flex

flexibleBox即弹性盒子,用来进行弹性布局,配合rem处理尺寸的适配问题,任何容器都可指定为flex布局,在一些场合可以与block+定位的方式配合,增加灵活性。

以主元素的排列方式为基准,分为主轴和交叉轴,
盒子中元素横向排列时x轴为主轴,y轴为交叉轴;纵向排列时相反。
四个顶点分别为主轴/交叉轴的开始顶点,结束顶点

以下以横向图为例

在这里插入图片描述

flex-direction

决定子元素在父元素盒子中的排列方式,决定主轴是x轴还是y轴

属性值作用
row默认值。从左到右水平显示
row-reverse与row相同,但以相反顺序
column垂直显示,按从上到下的顺序
column-reverse与column相同,但以相反的顺序
  <div id="div0">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
  </div>
#div0 {
  width:500px;
  background-color: rgb(12, 208, 243);
  display: flex;
  flex-direction: column-reverse;
  /* 设置div0为弹性盒子 */
}

#div0 div{
  width: 100px;
  height: 100px;
  background-color: rgb(178, 253, 39);
}

flex-wrap

决定子元素在父元素中是否换行

属性值作用
nowrap默认值。不换行或不换列
wrap换行或换列
wrap换行或换列,但以相反的顺序

flex-flow

flex-direction 和 flex-wrap属性的简写形式
语法:flex-flow:< flex-direction > || < flex-wrap >

flex-flow: row wrap-reverse;

justify-content

存在剩余空间时,剩余空间调整为间距的间距设置方式

属性值作用
flex-start默认值。从左到右,挨着行的开头
flex-end从右到左,挨着行的结尾
center居中显示
space-between平均分布在该行上,两边不留间隔空间
space-around平均分布在该行上,两边留有一半的间隔空间
#div0 {
  /* 设置宽度为超过三个,但不足四个的情况 */
  width:380px;
  background-color: rgb(12, 208, 243);
   /* 设置div0为弹性盒子 */
  display: flex;
  /* flex-direction: row; */
  flex-flow: row wrap-reverse;
  justify-content:space-around;
}

align-items

设置每个flex属性在交叉轴上的默认对齐方式
交叉轴是区别主轴那条轴
align-items处理单行是指把每一行当成一个独立的个体

属性值作用
stretch默认值。自适应
flex-start位于容器的开头
flex-end位容器的结尾
center居中显示
#div0 {
  width:400px;
  /* 设置高度,这样才能显示交叉轴的排列情况 */
  height:400px;
  background-color: rgb(12, 208, 243);
   /* 设置div0为弹性盒子 */
  display: flex;
  /* row即主轴设置为x轴 */
  flex-flow: row wrap;
  justify-content:space-around;
  align-items:center;
}

align-content

设置每个flex元素在交叉轴上的默认对齐方式,
与align-items不同的是,align-content处理多行,是把多行里的内容当成一个整体处理

属性值作用
flex-start位于容器的开头
flex-end位于容器的结尾
center位于容器的中心
space-between之间留有空白
space-around两端都留有空白

其他属性,对子元素设置

属性值作用
flex-basis设置弹性盒子基准值
flex-grow设置弹性盒子的扩展比率
flex-shrink设置弹性盒子的缩小比率
flexflex-grow、flex-shrink、flex-basis的缩写(顺序:扩大,缩小,基准值)

基准值是指相对于主轴占的宽度,设置了flex-basis后,width将失效

flex-basis:33%;
#div0 div:nth-child(1){
  flex-basis:50px;
  flex-grow:1;
}
#div0 div:nth-child(2){
  flex-basis:100px;
  flex-grow:4;
}

把剩余元素分成三份,第一个子div拓展2份,第二个子div拓展1份
假设父元素400px
400-50-100 = 250
250/5 = 50
第一个子div:50+501 =100
第二个子div:100+50
4 = 300

flex-shrink是子元素太大时的缩小比率,和flex-grow相反

/* 假设父元素是400px
400-600 = 200
200/4 = 50
300-1*50 = 250
300-3*50 = 150
*/
#div0 div:nth-child(1){
  flex-basis:300px;
  flex-grow:1;
  flex-shrink:1;
}
#div0 div:nth-child(2){
  flex-basis:300px;
  flex-grow:4;
  flex-shrink:3;
}

简写方式
flex:flex-grow flex-shrink flex-basis(顺序:扩大,缩小,基准值)|

#div0 div:nth-child(1){
  /* flex-basis:300px;
  flex-grow:1;
  flex-shrink:1; */
  flex:1 1 300px;
}

给子元素设置伸缩的特殊写法

属性作用
flex:auto;flex:1 1 auto
flex:none;flex 0 0 auto
flex:0%;flex:1 1 0%
flex:100px;flex:1 1 100px
flex:1;flex:1 1 0%;

rem的使用方法

rem是一个度量单位,尺寸以根元素的字体大小作为依据

html{
  font-size: 10px;
}

div{
  font-size: 1rem;
}

与em的区别:
rem相对于根字体,r为route
em相对于父一级字体,父一级可能有多个,父一级字体可能是自己设计,也可能是级联继承。

使用js获取屏幕宽度更改字体尺寸

var c = () => {
  let w = document.documentElement.clientWidth;//获取屏幕宽度
  let n = (20 * (w / 320) > 40 ? 40 +"px":(20 * (w / 320) + "px"));
  //以苹果尺寸320px为标准,可自行更改,假设基准大小是20
  document.documentElement.style.fontSize = n;
}
//初始化效果
window.addEventListener("load",c);
//屏幕尺寸发生改变后
window.addEventListener("resize",c);

自适应布局

两个特点:不同设备对应不同的html文件;局部自适应

使用js判断是什么设备,再转到不同html文件中

var redirect = () => {
    //获取设备信息
    let userAgent = navigator.userAgent.toLowerCase();
    //正则表达式判断设备类型
    let device = /ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/;
    if(device.test(userAgent)){
      //跳转移动端设备
      window.location.href = "move.html";
    }else {
      //跳转pc端设备
      window.location.href = "pc.html";
    }
  }
  redirect();

局部自适应配合媒体查询

<div id="div0">
    <div></div>
    <div></div>
    <div></div>
  </div>
#div0{
      display:flex;
    }
    #div0 div:first-child{
      height: 50px;
      background-color: rgb(229, 233, 29);
      flex:0 0 50px;
    }
    #div0 div:nth-child(2){
      background-color: rgb(243, 8, 8);
      flex:1 1 auto;
    }
    #div0 div:nth-child(3){
      flex:0 0 50px;
      background-color: rgb(202, 247, 4);
    }
    @media (min-device-width:400px) and (max-device-width:500px){
      #div0 div:nth-child(2){
        background-color: rgb(14, 232, 240);
      }
    }
    @media (min-device-width:501px) and (max-device-width:700px){
      #div0 div:nth-child(2){
        background-color: rgb(162, 8, 252);
      }
    }

响应式布局

布局特点:确保一个页面在所有终端上,都能显示出令人满意的效果
主要是css的代码编写
设计思路:使用%或者rem为单位

rem弹性布局

为了保证在各种屏幕上的不失真,就要根据实际屏幕宽度做等比例换算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值