让我们来学学css3 media queries的使用吧

这几天就是在折腾博客,换肤,使用pretty code,css3技巧,以及响应式布局实践。

不过,响应式布局确实挺费时间的。对此,把自己实践的经验分享下。内容将涉及如下:

  1. 语法
  2. 语法注意的事项
  3. 响应式适用的范围
  4. 一些实例演示
  5. 其他问题

好啦。这就是要讲的内容,不过,在开始之前,我们先热热身。

  1. 先声明html文档为html5的文档类型,即<!DOCTYPE HTML>
  2. IE9版本以下浏览器不支持media queries规则,所以请加入以下条件注释的js
    <!--[if lt IE 9]>
         <script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
    <![endif]-->
  3. 对手持设备的支持声明:
    <meta name=“viewport” content=“width=device-width,minimum-scale=1.0,maximum-scale=1.0″ />
  4. 好啦,然后了解下css3 中的media queries的一些简单规则,就可以随心所欲啦。

一. 语法

 viewport的语法

  • 手机模拟PC浏览器的宽度,然后手机浏览器根据这个宽度把页面同比缩放到手机屏幕上。的特殊值device-width的是设备宽度;
  • height:同width;
  • user-scalable:是否允许用户缩放,有yes和no两个值;
  • initial-scale:初始缩放比例;
  • minimum-scale和maximum-scale:最小和最大缩放比例;

media queries的规则

首先,这里涉及的基本翻译自:https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries,并且舍弃了一些原英文中的废话,所以不会有错的哦,除非本人翻译不够专业。

-------------------分割线------------------------------

语法:

media query(媒介查询) 由媒介类型和媒介特性组成,作为css3的规范,包含一个或多个表达式,用以解决不同的媒介适配问题。当文档显示完成之时,指明了媒介设备类型,表达式没有错误的话,那么查询结果也就正确了(就是规则正确响应了)。

css 代码 :

<!-- CSS media query on a link element -->
<link rel="stylesheet" media="(max- 800px)" href="example.css" />
 
<!-- CSS media query within a style sheet -->
<style>
@media (max- 600px) {
  .facet_sidebar {
    display: none;
  }
}
</style>

media query正确,那么相应的样式表或者样式规则(怎么会有或?因为使用响应式,可以分好多外链css文件,也可以只写在一个样式表中,本人就喜欢写在一张样式表中)就会被请求,跟正常的级联规则一样样的。Style sheets with media queries attached to their <link> tags will still download even if their media queries would return false (they will not apply, however).尼玛,不会翻译了。

若不声明媒介类型,比如使用not,only运算符,那么默认是所有媒介。

逻辑运算符:

关键字说明
only 限定某种设备类型
and 逻辑与,连接设备名与选择条件、选择条件1与选择条件2
not 排除某种设备
, 设备列表

使用逻辑运算符 not,and,only,可以构建复杂的media queries。注意,在使用not和only时,必须指明媒介类型。

使用逗号“,”可以合并多个media queries,其实这跟css选择符是一个道理,多个选择符应用统一规则,就用逗号合并。

and:

用来连接多种媒介特性(media features)以及媒介类型(media types)。一个简单的media query示例:

@media (min- 700px) { ... }

但是,如果你想让上面的规则仅仅是竖屏显示的话,你可以使用and运算符连接媒介特性。

@media (min- 700px) and (orientation: landscape) { ... }

当然,如果你怕在TV上显示出岔子,也可以做如下限制:

@media tv and (min- 700px) and (orientation: landscape) { ... }

现在,上面的media query规则将只会对媒介类型是TV,可视宽度至少为700px,竖屏进行响应。

逗号

懒得去翻译那一长串了,写过css的都明白,这里的逗号,跟不同的css选择器应用同一样式的逗号是一样的。给出对比:

.music img , .news img { height: 40px;  60px;}
@media (min- 700px), handheld and (orientation: landscape) { ... }

上面的规则呢,如果你拿了个800px宽的电脑屏设备,那么@media (min- 700px)这个规则会被应用,虽然你这个不是手持设备;如果你拿了个500px宽的手持设备,handheld and (orientation: landscape)这个规则会被应用,虽然你丫的屏宽还不到700px。(为何不用or呢,我比较纳闷儿!)

not

  • not关键字将会作用域整个的media query,除非有其他情况致使该media query返回错误,比如,单色monochrome作用于彩色(color)显示,或者600px的screen屏和一个min-700px的特性查询(feature query)
  • 若有逗号分隔,那么not只能作用在逗号前面的media query上
  • not关键字不能用来否定单个的feature query,只能否定整个media query

下面来看代码示例:

@media not all and (monochrome) { ... }

以上代码就相当于:

@media not (all and (monochrome)) { ... }

而不是:

@media (not all) and (monochrome) { ... }

再看看另一个示例:

@media not screen and (color), print and (color)

就相当于:

@media (not (screen and (color))), print and (color)

这个否定规则,可以参考否定的第二条,逗号的作用。

only

我原先还以为only就是仅仅的意思,那如果是“仅仅”,我指定media type,或者 media feature,也不需要only啊,多此一举。好吧,看看官方解释:

The only keyword prevents older browsers that do not support media queries with media features from applying the given styles:

<link rel="stylesheet" media="only screen and (color)" href="example.css" />

什么意思呢,就是说,only关键字啊,是阻止那些不支持media queries,media feature的老古董浏览器请求已给出的样式。你丫是穷屌丝,就只能对白富美望而却步了。

哎,就是这个意思么,有事儿没事儿加上吧。

-----------------------再次割鸡鸡----------------------------

上面说了一大堆,有两个专业名词,一个是media types,一个是media feature,下面列出来,让你们端详端详。

媒介类型(media types)

类型解释
all 所有设备
braille 盲文
embossed 盲文打印
handheld 手持设备
print 文档打印或打印预览模式
projection 项目演示,比如幻灯
screen 彩色电脑屏幕
speech 演讲
tty 固定字母间距的网格的媒体,比如电传打字机
tv 电视

媒介特性(media features):

媒体特性可用媒体类型接受min/max简介
width <length> 视觉屏幕/触摸设备 yes 定义输出设备中的页面可见区域宽度(单位一般为px)
heigth <length> 视觉屏幕/触摸设备 yes 定义输出设备中的页面可见区域高度(单位一般为px)
device-width <length> 视觉屏幕/触摸设备 yes 定义输出设备的屏幕可见宽度(单位一般为px)
device-heigth <length> 视觉屏幕/触摸设备 yes 定义输出设备的屏幕可见高度(单位一般为px)
orientation portrait | landscape 位图介质类型 no 定义’height’是否大于或等于’width’。值portrait代表是,landscape代表否即设,备手持方向:portait为横向,landscape为竖向
aspect-ratio <ratio> 位图介质类型 yes 定义’width’与’height’的比率,即浏览器的长宽比
device-aspect-ratio <ratio> 位图介质类型 yes 定义’device-width’与’device-height’的比率,即设备屏幕长宽比。如常见的显示器比率:4/3, 16/9,16/10
color <integer> 视觉媒体 yes 定义每一组输出设备的彩色原件个数。如果不是彩色设备,则值等于0
color-index <integer> 视觉媒体 yes 定义在输出设备的彩色查询表中的条目数。如果没有使用彩色查询表,则值等于0
monochrome <integer> 视觉媒体 yes 定义在一个单色框架缓冲区中每像素包含的单色原件个数。如果不是单色设备,则值等于0
resolution <resolution> 位图介质类型 yes 定义设备的分辨率。如:96dpi,300dpi,118dpcm
scan progressive | interlace 电视类 no 定义电视类设备的扫描工序, progressive逐行扫描,interlace隔行扫描
grid <integer> 栅格设备 no 用来查询输出设备是否使用栅格或点阵。只有1和0才是有效值,1代表是,0代表否

二. 语法注意的事项

  1. 一个以上的响应式规则,媒体属性设置后面如有宽度规则,必须使用and连接,否则,将只使用最后一个规则中的相同样式(不同规则的选择器交集的样式)。
  2. 只设置了最大宽度值的样式设置将会被继承。以上代码中的1280px下的border属性将会被1280px宽度以下的规则继承。对于这种情况,可以使用min-width和max-width配合,防止继承,以减少属性覆盖产生的一些麻烦。比如,float属性还有none,好覆盖,但是position:relative你怎么覆盖?蛋疼吧。针对这种情况,可以采取宽度区间段设置的方式,把差异化的样式放在这个区间段声明中就OK啦。
  3. 如果只设置max-width为m像素,小于m的设置则是在一个区间,即该设置包含了最小到最大的设置,那么是否会继承max-width为m像素的设置的样式呢?会继承的。
  4. DOCTYPE设置。DOCTYPE设置需要设置成DOCTYPE HTML,其他设置方式将导致在手持设备上无法响应。当然,电脑上还是可以响应的。比如我的这个博客,博客园采用的是过渡式的声明,我就只好限制响应规则的设备为screen了。

三. 响应式适用的范围

我个人觉得适合做页面内容不太丰富,结构不复杂的项目。如果只是针对电脑屏的话,任何项目都不限,只要折腾得起,不差钱和时间。

对于手机来说,隐藏的内容越多,就越不合适了。因此,博客和论坛还是比较合适的。

四. 一些实例演示

可以参照本博客,或者国外的这个站点http://blog.teamtreehouse.com/

一淘网的首页也做了响应式处理,不过他们针对的是screen,最小宽度为768px,对于手机,则另做了。

五. 图片的自适应

前景图片img怎么自适应呢?常见的做法是:

img { max- 100%; }

另外,记得不要在img元素中限定图片宽高哦。另外不建议直接设置width=”100%”,因为会把小图拉大,模糊显示。

同理,video标签和iframe标签的宽度也可以这样做,而且最好不要使用iframe,宽度是个问题,性能也是一个方面吧。

 另外一种做法是使用css3 image  

我们都知道可以用::before和::after伪元素+content属性来动态显示一些内容或者做其它很酷的事情,而且在CSS 2.1中即被支持。不过content属性在CSS 2.1中只能用于这两个伪元素中,而在CSS3中,任何元素都可以使用content属性了,这个方法就是结合css3 的attr属性和HTML自定义属性的功能:

<img src="image.jpg" data-src-600px="image-600px.jpg" data-src-800px="image-800px.jpg" alt="">

然后用media query来动态赋值:

@media (min-device-600px) { 
    img[data-src-600px] {
        content: attr(data-src-600px, url); 
    }
}
@media (min-device-800px) {
    img[data-src-800px] {
        content: attr(data-src-800px, url);
    }
}

不爽的是,你得准备多张图片啊。。。

背景图咋自适应呢?我看只能准备多张图片了。

参考文章

原文地址:https://www.cnblogs.com/my_front_research/p/3079825.html