响应式 Web 设计 -媒体查询
媒体(media)查询在 CSS3 上有介绍:CSS3 @media 查询。
使用 @media 查询,你可以针对不同的媒体类型定义不同的样式。
实例
如果浏览器窗口小于 500px, 背景将变为浅蓝色:
@media only screen and (max-width: 500px){
body{background-color:lightblue;}}
body{background-color:lightblue;}}
添加断点
在先前的教程中我们使用行和列来制作网页,它是响应式的,但在小屏幕上并不能友好的展示。
媒体查询可以帮我们解决这个问题。我们可以在设计稿的中间添加断点,不同的断点有不同的效果。
桌面设备
手机设备
使用媒体查询在 768px 添加断点:
实例
当屏幕 (浏览器窗口) 小于 768px, 每一列的宽度是 100%:
/* For desktop: */
.col-1{width:8.33%;}
.col-2{width:16.66%;}
.col-3{width:25%;}
.col-4{width:33.33%;}
.col-5{width:41.66%;}
.col-6{width:50%;}
.col-7{width:58.33%;}
.col-8{width:66.66%;}
.col-9{width:75%;}
.col-10{width:83.33%;}
.col-11{width:91.66%;}
.col-12{width:100%;}
@media only screen and (max-width: 768px){ /* For mobile phones: */
[class*="col-"] {width:100%;}}
.col-1{width:8.33%;}
.col-2{width:16.66%;}
.col-3{width:25%;}
.col-4{width:33.33%;}
.col-5{width:41.66%;}
.col-6{width:50%;}
.col-7{width:58.33%;}
.col-8{width:66.66%;}
.col-9{width:75%;}
.col-10{width:83.33%;}
.col-11{width:91.66%;}
.col-12{width:100%;}
@media only screen and (max-width: 768px){ /* For mobile phones: */
[class*="col-"] {width:100%;}}
为移动端优先设计
移动端优先意味着在设计桌面和其他设备时优先考虑移动端的设计。
这就意味着我们必须对 CSS 做一些改变。
我们在屏幕小于 768px 进行样式修改,同样在屏幕宽度大于 768px 时也需要修改样式。以下是移动端优先实例:
/* 为移动端设计: */
[class*="col-"]{width:100%;}
@media only screen and (min-width: 768px){ /* For desktop: */
.col-1 {width:8.33%;}
.col-2{width:16.66%;}
.col-3{width:25%;}
.col-4{width:33.33%;}
.col-5{width:41.66%;}
.col-6{width:50%;}
.col-7{width:58.33%;}
.col-8{width:66.66%;}
.col-9{width:75%;}
.col-10{width:83.33%;}
.col-11{width:91.66%;}
.col-12{width:100%;}}
[class*="col-"]{width:100%;}
@media only screen and (min-width: 768px){ /* For desktop: */
.col-1 {width:8.33%;}
.col-2{width:16.66%;}
.col-3{width:25%;}
.col-4{width:33.33%;}
.col-5{width:41.66%;}
.col-6{width:50%;}
.col-7{width:58.33%;}
.col-8{width:66.66%;}
.col-9{width:75%;}
.col-10{width:83.33%;}
.col-11{width:91.66%;}
.col-12{width:100%;}}
其他断点
你可以根据自己的需要添加断点。
我们同样可以为平板设备和移动手机设备设置断点。
桌面设备
平板设备
手机设备
在屏幕为 600px 时添加媒体查询,并设置新的样式(屏幕大于 600px 但小于 768px):
实例
注意两组类样式是相同的,但名称不同 (col- 和 col-m-):
/* For mobile phones: */
[class*="col-"]{width:100%;}
@media only screen and (min-width: 600px){ /* For tablets: */
.col-m-1 {width:8.33%;}
.col-m-2{width:16.66%;}
.col-m-3{width:25%;}
.col-m-4{width:33.33%;}
.col-m-5{width:41.66%;}
.col-m-6{width:50%;}
.col-m-7{width:58.33%;}
.col-m-8{width:66.66%;}
.col-m-9{width:75%;}
.col-m-10{width:83.33%;}
.col-m-11{width:91.66%;}
.col-m-12{width:100%;}}
@media only screen and (min-width: 768px){/* For desktop: */
.col-1 {width:8.33%;}
.col-2{width:16.66%;}
.col-3{width:25%;}
.col-4{width:33.33%;}
.col-5{width:41.66%;}
.col-6{width:50%;}
.col-7{width:58.33%;}
.col-8{width:66.66%;}
.col-9{width:75%;}
.col-10{width:83.33%;}
.col-11{width:91.66%;}
.col-12{width:100%;} }
[class*="col-"]{width:100%;}
@media only screen and (min-width: 600px){ /* For tablets: */
.col-m-1 {width:8.33%;}
.col-m-2{width:16.66%;}
.col-m-3{width:25%;}
.col-m-4{width:33.33%;}
.col-m-5{width:41.66%;}
.col-m-6{width:50%;}
.col-m-7{width:58.33%;}
.col-m-8{width:66.66%;}
.col-m-9{width:75%;}
.col-m-10{width:83.33%;}
.col-m-11{width:91.66%;}
.col-m-12{width:100%;}}
@media only screen and (min-width: 768px){/* For desktop: */
.col-1 {width:8.33%;}
.col-2{width:16.66%;}
.col-3{width:25%;}
.col-4{width:33.33%;}
.col-5{width:41.66%;}
.col-6{width:50%;}
.col-7{width:58.33%;}
.col-8{width:66.66%;}
.col-9{width:75%;}
.col-10{width:83.33%;}
.col-11{width:91.66%;}
.col-12{width:100%;} }
以上代码看起来很多余,但是他可以根据屏幕大小自动设置不同的样式,所以还是非常必要的。
HTML 实例
针对桌面设备:
第一和第三部分跨越 3 列。中间部分跨域 6 列。
针对平板设备:
第一跨域 3列,第二部分跨越 9 列,第三部分跨域 12 列:
<divclass="row">
<divclass="col-3 col-m-3">...</div>
<divclass="col-6 col-m-9">...</div>
<divclass="col-3 col-m-12">...</div>
</div>
<divclass="col-3 col-m-3">...</div>
<divclass="col-6 col-m-9">...</div>
<divclass="col-3 col-m-12">...</div>
</div>
方向:横屏/竖屏
结合 CSS 媒体查询,可以创建适应不同设备的方向(横屏 landscape、竖屏 portrait 等)的布局。
语法:
orientation:portrait | landscape
- portrait:指定输出设备中的页面可见区域高度大于或等于宽度
- landscape:除 portrait 值情况外,都是 landscape
实例
如果是横屏背景将是浅蓝色:
@media only screen and (orientation: landscape){
body{background-color:lightblue;}}
body{background-color:lightblue;}}