web 3d图形渲染器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

304 lines
7.2 KiB

  1. # PostCSS Media Minmax
  2. [![Build Status](https://travis-ci.org/postcss/postcss-media-minmax.svg?branch=master)](https://travis-ci.org/postcss/postcss-media-minmax)
  3. [![NPM Downloads](https://img.shields.io/npm/dm/postcss-media-minmax.svg?style=flat)](https://www.npmjs.com/package/postcss-media-minmax)
  4. [![NPM Version](http://img.shields.io/npm/v/postcss-media-minmax.svg?style=flat)](https://www.npmjs.com/package/postcss-media-minmax)
  5. [![License](https://img.shields.io/npm/l/postcss-media-minmax.svg?style=flat)](http://opensource.org/licenses/MIT)
  6. > 写简单优雅的 Media Queries!
  7. Media Queries 中的 `min-width``max-width` 等属性非常容易混淆,每次看到他们,我都想哭。现在[新的规范](https://drafts.csswg.org/mediaqueries/#mq-range-context)中,可以使用更加直观的 `>=`或`<=` 替代 media queries 中的 min-/max- 前缀。
  8. **V2.1.0 开始支持 `>``<` 符号。**
  9. 这是一个实现 [CSS Media Queries Level 4](http://dev.w3.org/csswg/mediaqueries/) Polyfill 的插件,让你现在就可以使用这些特性,妈妈再也不用担心我记不住了,鹅妹子嘤!
  10. [English](README.md)
  11. -----
  12. ![Gif Demo](http://gtms02.alicdn.com/tps/i2/TB1UIjyGVXXXXcCaXXXx274FpXX-877-339.gif)
  13. ## 安装
  14. $ npm install postcss-media-minmax
  15. ## 快速开始
  16. 示例 1:
  17. ```js
  18. var fs = require('fs')
  19. var postcss = require('postcss')
  20. var minmax = require('postcss-media-minmax')
  21. var css = fs.readFileSync('input.css', 'utf8')
  22. var output = postcss()
  23. .use(minmax())
  24. .process(css)
  25. .css
  26. console.log('\n====>Output CSS:\n', output)
  27. ```
  28. 或者只需:
  29. ```js
  30. var output = postcss(minmax())
  31. .process(css)
  32. .css
  33. ```
  34. input.css:
  35. ```css
  36. @media screen and (width >= 500px) and (width <= 1200px) {
  37. .bar {
  38. display: block;
  39. }
  40. }
  41. ```
  42. 你将得到:
  43. ```css
  44. @media screen and (min-width: 500px) and (max-width: 1200px) {
  45. .bar {
  46. display: block;
  47. }
  48. }
  49. ```
  50. ## CSS 语法
  51. ### [语法](http://dev.w3.org/csswg/mediaqueries/#mq-syntax)
  52. ```
  53. <mf-range> = <mf-name> [ '<' | '>' ]? '='? <mf-value>
  54. | <mf-value> [ '<' | '>' ]? '='? <mf-name>
  55. | <mf-value> '<' '='? <mf-name> '<' '='? <mf-value>
  56. | <mf-value> '>' '='? <mf-name> '>' '='? <mf-value>
  57. ```
  58. ![syntax](http://gtms03.alicdn.com/tps/i3/TB1Rje0HXXXXXXeXpXXccZJ0FXX-640-290.png)
  59. PostCSS Media Minmax 目前并没有实现 `200px >= width` 或者 `200px <= width` 这样的语法,因为这样的语法可读性并不不是太好。
  60. ## [取值(Values)](http://dev.w3.org/csswg/mediaqueries/#values)
  61. **The special values:**
  62. * [<ratio>](http://dev.w3.org/csswg/mediaqueries/#typedef-ratio)
  63. <ratio> 是一个正(非零非负)的 <integer>(整型)取值,其后跟随0个或多个空白,接着跟随一个斜线(“/”),再跟随0个或多个空白,最后跟随一个正<integer>
  64. ```css
  65. @media screen and (device-aspect-ratio: 16 / 9) {
  66. /* rules */
  67. }
  68. /* equivalent to */
  69. @media screen and (device-aspect-ratio: 16/9) {
  70. /* rules */
  71. }
  72. ```
  73. * [<mq-boolean>](http://dev.w3.org/csswg/mediaqueries/#typedef-mq-boolean)
  74. <mq-boolean> 值是一个 0 或 1 的 <integer>(整型)取值。其他任何整数无效。注意, 在 CSS 中 -0 总是等价于 0 的,所以也作为一种有效的 <mq-boolean> 取值。
  75. ```css
  76. @media screen and (grid: -0) {
  77. /* rules */
  78. }
  79. /* equivalent to */
  80. @media screen and (grid: 0) {
  81. /* rules */
  82. }
  83. ```
  84. ## 如何使用
  85. ### 简写
  86. 示例 1中同一个 Media features name 同时存在 `>=``<=` 时,可以简写为:
  87. ```css
  88. @media screen and (500px <= width <= 1200px) {
  89. .bar {
  90. display: block;
  91. }
  92. }
  93. /* 或者 */
  94. @media screen and (1200px >= width >= 500px) {
  95. .bar {
  96. display: block;
  97. }
  98. }
  99. ```
  100. 都会得到一样的输出结果:
  101. ```css
  102. @media screen and (min-width: 500px) and (max-width: 1200px) {
  103. .bar {
  104. display: block;
  105. }
  106. }
  107. ```
  108. **注意**:当 Media features name 在中间的时候,一定要保证两个 `<=``>=` 的方向一致,否则不会转换。
  109. 例如在下面的示例中,width 大于等于 500px 同时又大于等于 1200px,这在语法和逻辑上都是错误的。
  110. ```css
  111. @media screen and (1200px <= width >= 500px) {
  112. .bar {
  113. display: block;
  114. }
  115. }
  116. ```
  117. ### 支持的 Media features name
  118. 规范中目前以下属性支持 min-/max 前缀,PostCSS Media Minmax 全部支持自动转换。
  119. * `width`
  120. * `height`
  121. * `device-width`
  122. * `device-height`
  123. * `aspect-ratio`
  124. * `device-aspect-ratio`
  125. * `color`
  126. * `color-index`
  127. * `monochrome`
  128. * `resolution`
  129. ### 支持在 `@custom-media` 中使用 & Node Watch
  130. ```js
  131. var fs = require('fs')
  132. var chokidar = require('chokidar')
  133. var postcss = require('postcss')
  134. var minmax = require('postcss-media-minmax')
  135. var customMedia = require('postcss-custom-media')
  136. var src = 'input.css'
  137. console.info('Watching…\nModify the input.css and save.')
  138. chokidar.watch(src, {
  139. ignored: /[\/\\]\./,
  140. persistent: true
  141. }).on('all',
  142. function(event, path, stats) {
  143. var css = fs.readFileSync(src, 'utf8')
  144. var output = postcss()
  145. .use(customMedia())
  146. .use(minmax())
  147. .process(css)
  148. .css;
  149. fs.writeFileSync('output.css', output)
  150. })
  151. ```
  152. input.css:
  153. ```css
  154. @custom-media --foo (width >= 20em) and (width <= 50em);
  155. @custom-media --bar (height >= 300px) and (height <= 600px);
  156. @media (--foo) and (--bar) {
  157. }
  158. ```
  159. output.css:
  160. ```css
  161. @media (min-width: 20em) and (max-width: 50em) and (min-height: 300px) and (max-height: 600px) {
  162. }
  163. ```
  164. ### Grunt
  165. ```js
  166. module.exports = function(grunt) {
  167. grunt.initConfig({
  168. pkg: grunt.file.readJSON('package.json'),
  169. postcss: {
  170. options: {
  171. processors: [
  172. require('autoprefixer-core')({ browsers: ['> 0%'] }).postcss, //Other plugin
  173. require('postcss-media-minmax')(),
  174. ]
  175. },
  176. dist: {
  177. src: ['src/*.css'],
  178. dest: 'build/grunt.css'
  179. }
  180. }
  181. });
  182. grunt.loadNpmTasks('grunt-contrib-uglify');
  183. grunt.loadNpmTasks('grunt-postcss');
  184. grunt.registerTask('default', ['postcss']);
  185. }
  186. ```
  187. ### Gulp
  188. ```js
  189. var gulp = require('gulp');
  190. var rename = require('gulp-rename');
  191. var postcss = require('gulp-postcss');
  192. var selector = require('postcss-media-minmax')
  193. var autoprefixer = require('autoprefixer-core')
  194. gulp.task('default', function () {
  195. var processors = [
  196. autoprefixer({ browsers: ['> 0%'] }), //Other plugin
  197. minmax()
  198. ];
  199. gulp.src('src/*.css')
  200. .pipe(postcss(processors))
  201. .pipe(rename('gulp.css'))
  202. .pipe(gulp.dest('build'))
  203. });
  204. gulp.watch('src/*.css', ['default']);
  205. ```
  206. ## 贡献
  207. * 安装相关的依赖模块。
  208. * 尊重编码风格(安装 [EditorConfig](http://editorconfig.org/))。
  209. * 在[test](test)目录添加测试用例。
  210. * 运行测试。
  211. ```
  212. $ git clone https://github.com/postcss/postcss-media-minmaxs.git
  213. $ git checkout -b patch
  214. $ npm install
  215. $ npm test
  216. ```
  217. ## 致谢
  218. * 感谢 PostCSS 作者 [Andrey Sitnik](https://github.com/ai),带给我们如此简单易用的 CSS 语法解析工具。
  219. * 感谢 [Tab Atkins Jr.](http://xanthir.com/contact/) 辛苦编写了 Media Queries Level 4 规范。
  220. * 感谢 [@紫云飞](http://weibo.com/p/1005051708684567) 对本插件的建议和帮助。
  221. ## [Changelog](CHANGELOG.md)
  222. ## [License](LICENSE)