zoukankan      html  css  js  c++  java
  • css3@media实现原理

    window.matchMedia()

    基本用法

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

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

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

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

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

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

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

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

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

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

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

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

    var result = window.matchMedia("(max- 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,而不是报错。

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

    监听事件

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

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

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

  • 相关阅读:
    Asp.Net Mvc: 应用BindAttribute
    Mvc内建功能(DefaultModelBinder)自动绑定。
    生成随机字母字符串(数字字母混和)
    C#中实现输入汉字获取其拼音(汉字转拼音)的2种方法
    集合里查找数据
    C#自定义导出数据到Excel中的类封装
    MySQL性能优化的最佳20+条经验
    DevExpress.XtraGrid.view.gridview 属性说明
    c# 连接Mysql数据库
    ADO.NET 结构 集中数据库联接结构
  • 原文地址:https://www.cnblogs.com/Unknw/p/7662689.html
Copyright © 2011-2022 走看看