• 响应式布局原理
  • 媒体查询应用
  • 响应式布局示例
  • 外部样式的引入方式

 一、响应式布局原理

1.1响应式布局特点:网页宽度自动调整、尽量少使用绝对宽度、字体的大小使用相对单位(rem、em)、布局尽量使用浮动(流式布局)。

1.2响应式布局核心技术:媒体查询(@media)。

@media是css的@规则语句:@ + 标识符

关于css的@规则可以参考:https://developer.mozilla.org/zh-CN/docs/Web/CSS/At-rule

更严谨的说@media是嵌套@规则,如果满足@media的媒介查询条件,则条件规则组里面的规则生效。通俗的解释就是当显示器的条件满足@media的某一个样式,就是用该条件下的css样式。

@media查询条件分为两种,一种是媒体类型,一种是媒体特性。(详细可以参考:http://css.doyoe.com/  --> 语法与规则 --> @media

 1 /* 媒体查询语法 */
 2 @media 媒体类型 {
 3     /* css样式 */
 4 }
 5 @media 媒体特性 {
 6     /* css样式 */
 7 }
 8 @media 媒体类型 and 媒体特性 {
 9     /* css样式 */
10 }
11 @import url('xxx.css') 媒体特性;

1.3媒体类型:

 all  所有设备。
 print  打印设备。
 screen  彩色的电脑屏幕。
 speech  听觉设备,应用于屏幕阅读器等发声设备。

 1.4媒体特性(这部分内容比较多,这里列举一些响应式布局可能用到的特性,详细内容可以参考:https://www.runoob.com/cssref/css3-pr-mediaquery.html):

   更详细的媒体查询解析文档可以看这个https://drafts.csswg.org/mediaqueries/

 width  宽度:页面的可见宽度。
 height  高度:页面的可见高度。
 min-width、max-width  最小宽度、最大宽度:页面的可见最小或最大宽度。
 min-height、max-height  最小高度、最大高度:页面的可见最小或最大高度。
 orientation  方向:页面可见区域高度是否大于或等于宽度。取值:landscape宽度大于高度(横屏);portrait高度大于宽度(竖屏)。
 aspect-ratio  宽高比
 -webkit-device-pixel-ratio  像素比(webkit内核私有的属性)

1.5逻辑运算符:

 and  合并多个媒体类型(并且的意思)
 ,  酦醅某个媒体查询(或者的意思)
 not  对媒体查询结果取反,不能单独使用(比如不能单独取all的反),也就是说对整体媒体查询结果取反。
 only  仅在媒体查询匹配成功后应用样式(防范老旧浏览器),这逻辑运算符主要用于解决老旧浏览器不能解析@media而直接将媒体查询作为普通样式直接作用。

 示例1:

 1 /* 所有设备、宽度必须大于700、横屏,这个三个条件同时满足才为true */
 2 @media all and (min-width:700px) and (orientation:landscape){
 3     /* 注意这里我遇到了选择器权重的问题,所以在媒体查询样式选择器添加了一个media类 */
 4     div.media{
 5         background-color: yellow;
 6     }
 7 }
 8 div{
 9     width: 200px;
10     height: 200px;
11     background-color: red;
12 }

 示例2:

/* 所有设备、宽度必须大于800或者竖屏的时候,true */
@media all and (min-width:800px),(orientation:portrait){
    div.media{
        background-color: yellow;
    }
}

示例3:

//对示例2的整个媒体查询取反
@media not all and (min-width:800px),(orientation:portrait){
    div.media{
        background-color: yellow;
    }
}

最后强调一下,@media是css3的功能,在来旧浏览器中会直接将媒体查询内的样式直接解析出来,为了防止这种情况,可以使用only解决,虽然现在的浏览器普片都能使用css3的语法了,但如果需要非常严谨的处理一些样式的话,还是需要用到only。

 二、媒体查询应用

//html
<div class="media"></div>

//css
div{
    padding: 50px 0;
    border: 1px solid #000000;
}
div::after{
    content: "这是一个房子";
}
@media all and (max-width:1000px){
    div.media{
        background-color: #1177bb;
    }
    div.media::after{
        content: "哇,好大的房子";
    }
}
@media all and (max-width:800px){
    div.media::after{
        background-color: #aeaeae;
    }
    div.media::after{
        content: "喔,房子变小了";
    }
}
@media all and (max-width:500px){
    div.media{
        background-color: #46ae46;
    }
    div.media::after{
        content: "哎,房子更小了";
    }
}

 三、响应式布局示例

1.github链接(含图片):https://github.com/SnowElves/mediaLayout

2.代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <meta http-equiv="X-UA-Compatible" content="IE=edge">
 6         <title></title>
 7         <meta name="description" content="">
 8         <meta name="viewport" content="width=device-width, initial-scale=1">
 9         <link rel="stylesheet" href="index.css">
10     </head>
11     <body>
12         <div class="overall">
13             <!-- 头部 -->
14             <ul class="headNav media">
15                 <li class="logo"><a href="https://baidu.com" target="_blank"></a></li>
16                 <li class="search">
17                     <input type="text" placeholder="请输入搜索内容">
18                 </li>
19                 <li class="title">
20                     <a href="#">HTML</a>
21                     <a href="#">CSS</a>
22                     <a href="#">JavaScript</a>
23                     <a href="#">ES6</a>
24                     <a href="#">Node</a>
25                 </li>
26                 <li class="userInfo">
27                     <div class="imgUser">
28                         <img src="./image/user.png" alt="">
29                     </div>
30                     <div class="text">他乡踏雪</div>
31                     <div class="imgList">
32                         <img src="./image/userList.png" alt="">
33                     </div>
34                 </li>
35                 <li class="leftNavIocn"><img src="./image/leftNavIocn.png" alt=""></li>
36             </ul>
37         </div>
38     </body>
39 </html>
html代码

相关文章: