css3@media实现原理

window.matchMedia()

基本用法

window.matchMedia方法用来检查CSS的mediaQuery语句。各类浏览器的最新版本(包括IE 10+)都支持该方法,对于不支持该方法的老式浏览器,能够使用第三方函数库matchMedia.jsjavascript

CSS的mediaQuery语句有点像if语句,只要显示媒介(包括浏览器和屏幕等)知足mediaQuery语句设定的条件,就会执行区块内部的语句。下面是mediaQuery语句的一个例子。css

@media all and (max-width: 700px) { body { background: #FF0; } } 

上面的CSS代码表示,该区块对全部媒介(media)有效,且视口的最大宽度不得超过700像素。若是条件知足,则body元素的背景设为#FF0。java

须要注意的是,mediaQuery接受两种宽度/高度的度量,一种是上例的“视口”的宽度/高度,还有一种是“设备”的宽度/高度,下面就是一个例子。git

@media all and (max-device-width: 700px) { body { background: #FF0; } } 

视口的宽度/高度(width/height)使用documentElement.clientWidth/clientHeight来衡量,单位是CSS像素;设备的宽度/高度(device-width/device-height)使用screen.width/height来衡量,单位是设备硬件的像素。github

window.matchMedia方法接受一个mediaQuery语句的字符串做为参数,返回一个MediaQueryList对象。该对象有如下两个属性。浏览器

  • media:返回所查询的mediaQuery语句字符串。
  • matches:返回一个布尔值,表示当前环境是否匹配查询语句。
var result = window.matchMedia('(min-width: 600px)'); result.media // (min-width: 600px) result.matches // true 

下面是另一个例子,根据mediaQuery是否匹配当前环境,执行不一样的JavaScript代码。app

var result = window.matchMedia('(max-width: 700px)'); if (result.matches) { console.log('页面宽度小于等于700px'); } else { console.log('页面宽度大于700px'); } 

下面的例子根据mediaQuery是否匹配当前环境,加载相应的CSS样式表。函数

var result = window.matchMedia("(max-width: 700px)"); if (result.matches){ var linkElm = document.createElement('link'); linkElm.setAttribute('rel', 'stylesheet'); linkElm.setAttribute('type', 'text/css'); linkElm.setAttribute('href', 'small.css'); document.head.appendChild(linkElm); } 

注意,若是window.matchMedia没法解析mediaQuery参数,返回的老是false,而不是报错。spa

window.matchMedia('bad string').matches // false 

监听事件

window.matchMedia方法返回的MediaQueryList对象有两个方法,用来监听事件:addListener方法和removeListener方法。若是mediaQuery查询结果发生变化,就调用指定的回调函数。code

var mql = window.matchMedia("(max-width: 700px)"); // 指定回调函数 mql.addListener(mqCallback); // 撤销回调函数 mql.removeListener(mqCallback); function mqCallback(mql) { if (mql.matches) { // 宽度小于等于700像素 } else { // 宽度大于700像素 } } 

上面代码中,回调函数的参数是MediaQueryList对象。回调函数的调用可能存在两种状况。一种是显示宽度从700像素以上变为如下,另外一种是从700像素如下变为以上,因此在回调函数内部要判断一下当前的屏幕宽度。

相关文章
相关标签/搜索