grid-kiss让网格制作变得更容易
CasLindsley
8年前
<h2>CSS Grid是什么</h2> <p>在详细介绍这个插件之前,先简单的告诉大家,我们这里所说的Grid是CSS布局中的一个模块。它不是早前所说的网格系统(Grid system),而是CSS 布局自带的一个布局模块。这个模块被称为 CSS Grid ,也有人把其称为CSS原生网格。</p> <p>如果你从未接触过CSS Grid相关的知识,建议你先阅读站上早前分享过的CSS Grid相关教程。特别推荐大家阅读这篇译文《CSS Grid布局指南》,如果你觉得译文质量不够好,你也可以移步阅读 <a href="/misc/goto?guid=4959735438526642062" rel="nofollow,noindex">@Chris House</a> 写的原文《 <a href="/misc/goto?guid=4959735438614917972" rel="nofollow,noindex">A Complete Guide to CSS Grid Layout</a> 》。</p> <p>这里假设你已经对CSS Grid有了一定的基础了解,哪怕是最基础的知识。因为我们今天不是来介绍CSS Grid的基础知识,而是介绍如何使用PostCSS插件 grid-kiss 让制作网格变得更容易、更简单。如果你感兴趣的话,欢迎继续往下阅读。</p> <h2>grid-kiss目的</h2> <p>grid-kiss是PostCSS万千 插件 中的一个,旨在用一个形象的网格(代码中画的网格)来取代CSS Grid自带的24个属性。简单的说,就是grid-kiss把在代码中画好的网格编译出CSS Grid对应的网格属性。</p> <h2>先来看个示例</h2> <p>上面也说过了,grid-kiss是用来把画好的网格编译成CSS对应的网格属性。那究竟是怎么样的,先给大家看一个作者在Github提供的示例,让大家在脑海中有一个简单印象。</p> <p>比如,在编译前的CSS代码中有这样一段代码:</p> <pre> <code class="language-css">body { grid-kiss: "+-------------------------------+ " "| header ↑ | 120px" "+-------------------------------+ " " " "+-- 30% ---+ +--- auto --------+ " "| .sidebar | | main | auto " "+----------+ +-----------------+ " " " "+-------------------------------+ " "| ↓ | 60px " "| → footer ← | " "+-------------------------------+ " }</code></pre> <p>经过PostCSS编译之后出来的CSS代码:</p> <pre> <code class="language-css">body > header { grid-area: header; align-self: start } body > .sidebar { grid-area: sidebar } body > main { grid-area: main } body > footer { grid-area: footer; justify-self: center; align-self: end } body { display: grid; align-content: space-between; grid-template-rows: 120px 1fr 60px; grid-template-columns: 30% 1fr; grid-template-areas: "header header" "sidebar main " "footer footer" }</code></pre> <p>在浏览器中将看到如下图的效果:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/63415087ea31568de5f53670f4685bae.png"></p> <p>如果你想立马体验的话,你可以通过 playground 在线工具尝试一把。另外还可以在Codepen上看看 @jonathanneal 在Codepen上提供的 插件模板 。</p> <p>如果grid-kiss和媒体查询结合在一起,可以轻易的实现响应式布局效果。如下图所示:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/8b09acb602c2246a70b9b8f9f4acc5d7.png"></p> <p>是不是很神奇,是不是没想到未来的CSS还可以这么的写。可以说,大家把CSS都给玩坏了。同时也能证明 @Sylvain 写的这个PostCSS插件是多么的强大,又是多有意思。</p> <h2>配置环境</h2> <p>文章开头就说了grid-kiss是PostCSS的一个插件,如果你想要正常的使用这个插件,或者尝试玩一把另类的网格制作方式。那么本地就要有一个PostCSS的工作环境。当然了,如果你为了省事的话,你可以使用 playground 。这里还是说怎么在本地使用吧。</p> <p>我个人喜欢使用PostCSS和Gulp配合使用,如果从没接触过PostCSS,也不用担心,你可以通过 PostCSS深入学习这个系列 中的《 PostCSS深入学习:Gulp设置 》一文配置好环境。接下来的内容假设你配置好PostCSS和Gulp的本地环境。</p> <p>环境有了,咱们就来安装grid-kiss吧。你可以通过 yarn 或者 npm 的方式来进行安装。</p> <p>yarn:</p> <pre> <code class="language-css">yarn add postcss-grid-kiss --dev</code></pre> <p>npm:</p> <pre> <code class="language-css">npm install postcss-grid-kiss --save-dev</code></pre> <p>我采用的是后面这种方式安装的。安装完成后,需要在 gulpfile.js 做一些简单的配置:</p> <pre> <code class="language-css">var gridkiss = require('postcss-grid-kiss'); gulp.task('css', function(){ var processors = [ // autoprefixer(browserOptions), cssnext(browserOptions), gridkiss({ fallback: false, screwIE: false, optimizeCalc: false }) ]; return gulp.src('./src/*.css') .pipe(postcss(processors)) .pipe(gulp.dest('./dest')); });</code></pre> <p>其中最重要的,也是很关键的部分:</p> <pre> <code class="language-css">gridkiss({ fallback: false, screwIE: false, optimizeCalc: false })</code></pre> <p>这三个是grid-kiss的配置选项。具体这几个选项是什么意思?稍后介绍。为了让你能本地更好的运行起来,可以把 gulpfile.js 和 package.json 保存到你项目的根目录下。同时建议你的测试项目结构如图那样:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/7157756937c07e1dc546651e869d0564.png"></p> <p>这个时候打开命令终端,把路径切换到项目根目下,执行:</p> <pre> <code class="language-css">npm i</code></pre> <p>然后在命令终端执行 gulp 命令。这个时候 src/style.css (编译前的样式文件)就会编译到 dest/style.css (编译后的样式文件)。同时也表明你的环境是OK的。后面我们的样式都是在 src/style.css 中编辑。另外,你的命令终端不要关闭,这样你只要修改了 style.css 文件,保存之后, dest/style.css 就会自动更新。</p> <h2>配置参数</h2> <p>前面的环境配置中也展示了,grid-kiss有三个选项,在使用的时候可以自行配置。</p> <pre> <code class="language-css">postcss([ gridkiss({ ...options }) ])</code></pre> <h3>fallback</h3> <p>截至2016年12月, CSS Grid布局规范 只是一个候选规范,并没有得到广泛的支持。到2017年3月,支持的浏览器会越来越多,Chrome和Firefox将开始默认支持Grid布局。其中,Mozilla将在3月7日发布的Firefox 52版本上开始支持。</p> <p>那么grid-kiss提供了一个配置项 fallback 用来做浏览器降级处理。其默认值是 false ,如果把它设置为 true 。就会对CSS Grid做降级处理,通过 position 和 calc() 模拟网格布局,让不支持CSS Grid的浏览器也能正常的访问。</p> <h3>screwIE</h3> <p>这个选项是用来忽略IE浏览器的降级处理,其默认值 false 。 screwIE 生效有一个条件,那就是 fallback 设置了 true 。</p> <p>由于IE不支持 @supports ,所以grid-kiss需要通过添加一个特殊的媒体查询 @media screen and (min-width:\0) 只让IE识别。</p> <p>如果你的项目不需要考虑IE浏览器,又为了减少编译出来的文件体积,你可以这样设置grid-kiss:</p> <pre> <code class="language-css">postcss([ gridkiss({ fallback: true, screwIE: true }) ])</code></pre> <h3>optimizeCalc</h3> <p>optimizeCalc 默认值是 true 。主要用来尽可能简化 calc() 表达式。和 screwIE 类似,如果要让 optimizeCalc 生效,前提是 fallback 设置的值为 true 。</p> <h2>grid-kiss使用方式</h2> <p>文章开头,看到的示例是通过中折线 - 和加号 + 来在文件中绘制网格。除此之外还有另外两种方式。</p> <p>┌ ┐ └ ┘ 和 │ ─:</p> <pre> <code class="language-css">div { grid-kiss: "┌──────┐ ┌──────┐ " "│ │ │ ↑ │ " "│ │ │ bar →│ 200px " "│ ↓ │ └──────┘ " "│ baz │ - " "│ ↑ │ ┌──────┐ " "│ │ │ ↑ │ 200px " "└──────┘ │ │ " " │ foo │ - " "┌──────┐ │ │ " "│ qux │ │ ↓ │ 200px " "│ ↓ │ │ │ " "└─20em─┘ └──────┘ " }</code></pre> <p>╔ ╗ ╚ ╝和║ ═:</p> <pre> <code class="language-css">main { grid-kiss: "╔═══════╗ ╔════════════════╗ " "║ ║ ║ .article ║ auto " "║ ↑ ║ ╚════════════════╝ " "║ nav ║ ╔════╗ ╔════════╗ " "║ ║ ║ ║ ║ aside →║ 240px" "╚═ 25% ═╝ ╚════╝ ╚═ 80em ═╝ " }</code></pre> <h2>如何绘制网格</h2> <p>前面简单的展示了绘制网格的方式。那么在实际绘制网格,可以依据下面几点来操作:</p> <ul> <li>绘制不同的区域,可以得到不同的网格。你可以使用一些工作来帮助你绘制网格,比如 <a href="/misc/goto?guid=4959735438699701508" rel="nofollow,noindex">AsciiFlow</a></li> <li>在每个区写一个CSS选择器来匹配相应的元素。它可以是一个元素标签、类名或ID选择器或其他有效的选择器</li> <li>匹配的元素必须是网格元素的子元素</li> <li>单独的每一行由一个换行符( \n )来决定,而且每一行具有相同的缩进</li> <li>每一行的开始和结束由一个双引号( " )来控制</li> <li>确定每个转角是正确对齐,可以使用 + 来控制,然后另一个 + 表示创建新一列</li> </ul> <p>更多的使用方式,这里就不一一阐述了,感兴趣的可以查看插件提供的 <a href="/misc/goto?guid=4959735438783204759" rel="nofollow,noindex">使用文档</a> 。另外把对齐方式在这里展示一下:</p> <h3>水平对齐方式控制</h3> <p>justify-content: stretch</p> <pre> <code class="language-css">"+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+"</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/1f88e7ed0fe41315f9ea0659f0cd7215.png"></p> <p>justify-content: start</p> <pre> <code class="language-css">"+---+ +---+ +---+ " "| a | | b | | c | " "+---+ +---+ +---+ " "+---+ +---+ +---+ " "| d | | e | | f | " "+---+ +---+ +---+ " "+---+ +---+ +---+ " "| g | | h | | i | " "+---+ +---+ +---+ "</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/f7fa829e156aa65a30d61c747498f1ef.png"></p> <p>justify-content:end</p> <pre> <code class="language-css">" +---+ +---+ +---+" " | a | | b | | c |" " +---+ +---+ +---+" " +---+ +---+ +---+" " | d | | e | | f |" " +---+ +---+ +---+" " +---+ +---+ +---+" " | g | | h | | i |" " +---+ +---+ +---+"</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/9a311336e6a18607ad64eaab21ad3e42.png"></p> <p>justify-content:center</p> <pre> <code class="language-css">" +---+ +---+ +---+ " " | a | | b | | c | " " +---+ +---+ +---+ " " +---+ +---+ +---+ " " | d | | e | | f | " " +---+ +---+ +---+ " " +---+ +---+ +---+ " " | g | | h | | i | " " +---+ +---+ +---+ "</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/7a9f4ad63ca2ef564834e8340ab9368d.png"></p> <p>justify-content: space-between</p> <pre> <code class="language-css">"+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+"</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/afb7cadb9b9dff6ecdf0e011c1824244.png"></p> <p>justify-content: space-evenly</p> <pre> <code class="language-css">" +---+ +---+ +---+ " " | a | | b | | c | " " +---+ +---+ +---+ " " +---+ +---+ +---+ " " | d | | e | | f | " " +---+ +---+ +---+ " " +---+ +---+ +---+ " " | g | | h | | i | " " +---+ +---+ +---+ "</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/1c59ad0084e1aee5a245416f19a0d658.png"></p> <p>justify-content:space-around</p> <pre> <code class="language-css">" +---+ +---+ +---+ " " | a | | b | | c | " " +---+ +---+ +---+ " " +---+ +---+ +---+ " " | d | | e | | f | " " +---+ +---+ +---+ " " +---+ +---+ +---+ " " | g | | h | | i | " " +---+ +---+ +---+ "</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/3b86fdb0e25e0bdc6ec3489f495da567.png"></p> <h3>垂直对齐方式控制</h3> <p>align-content: stretch</p> <pre> <code class="language-css">"+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+"</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/f995be4428e49f66a9c4455aff7e8111.png"></p> <p>align-content: start</p> <pre> <code class="language-css">"+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+" " " " "</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/e28df0d7e14e12bdfbf2e3e48680996f.png"></p> <p>align-content: end</p> <pre> <code class="language-css">" " " " "+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+"</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/33207e598006fb09977ce5c83fc5df72.png"></p> <p>align-content: center</p> <pre> <code class="language-css">" " "+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+" " "</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/1e2a45b761ffebd9e0da3f0b98a21c18.png"></p> <p>align-content: space-between</p> <pre> <code class="language-css">"+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" " " "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" " " "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+"</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/dc4b8fc3f1845a4b578d8191347fcac0.png"></p> <p>align-content: space-evenly</p> <pre> <code class="language-css">" " "+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" " " "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" " " "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+" " "</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/f18580eaf06633de75642a3675592606.png"></p> <p>align-content: space-around</p> <pre> <code class="language-css">" " "+---+ +---+ +---+" "| a | | b | | c |" "+---+ +---+ +---+" " " " " "+---+ +---+ +---+" "| d | | e | | f |" "+---+ +---+ +---+" " " " " "+---+ +---+ +---+" "| g | | h | | i |" "+---+ +---+ +---+" " "</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/0b002e13b9bfc04642c818d7a91adb6f.png"></p> <h3>区域内水平对齐方式</h3> <p>justify-self: start</p> <p>使用 < 或 ← :</p> <pre> <code class="language-css">+-------------+ +-------------+ | .item-a < | or | .item-a ← | +-------------+ +-------------+</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/fb2d34eac096a95f6300d932773f2c08.png"></p> <p>justify-self: end</p> <p>使用 > 或 → :</p> <pre> <code class="language-css">+-------------+ +-------------+ | > .item-a | or | → .item-a | +-------------+ +-------------+</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/7e00849bbb01f2f4ea312d78fed56440.png"></p> <p>justify-self: stretch</p> <p>使用 > 和 > 或 ← 和 → :</p> <pre> <code class="language-css">+--------------+ +--------------+ | < .item-a > | or | ← .item-a → | +--------------+ +--------------+</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/64b7cebdcaddebe3320088bf79b92a81.png"></p> <p>justify-self:center</p> <p>使用 > 和 < 或者 → 和 ← :</p> <pre> <code class="language-css">+--------------+ +--------------+ | > .item-a < | or | → .item-a ← | +--------------+ +--------------+</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/7a9f4ad63ca2ef564834e8340ab9368d.png"></p> <h3>区域内垂直对齐方式</h3> <p>align-self:start</p> <p>使用 ^ 或者 ↑ :</p> <pre> <code class="language-css">+-------------+ +-------------+ | .item-a | or | .item-a | | ^ | | ↑ | +-------------+ +-------------+</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/6c8000b01f1b1806e925fe2b38cdc64c.png"></p> <p>align-self: end</p> <p>使用 v 或 ↓ :</p> <pre> <code class="language-css">+-------------+ +-------------+ | v | or | ↓ | | .item-a | | .item-a | +-------------+ +-------------+</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/d6c1497a1e97ecb118cd64f0b2deb045.png"></p> <p>align-self: stretch</p> <p>使用 ^ 和 v 或者 ↑ 和 ↓ :</p> <pre> <code class="language-css">+-------------+ +-------------+ | ^ | | ↑ | | .item-a | or | .item-a | | v | | ↓ | +-------------+ +-------------+</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/4dbebc0df8f4dc9039725749fc3d20f6.png"></p> <p>align-self: center</p> <p>使用 v 和 ^ 或者 ↓ 和 ↑ :</p> <pre> <code class="language-css">+-------------+ +-------------+ | v | | ↓ | | .item-a | or | .item-a | | ^ | | ↑ | +-------------+ +-------------+</code></pre> <p style="text-align:center"><img src="https://simg.open-open.com/show/59a2b7c00ad87bbf53ecc6a3bd5480c4.png"></p> <p>上面展示了网格内对齐方式,下面来实战一下,看一个小示例:</p> <pre> <code class="language-css">.grid { grid-kiss: " +-------+ +-------+ +-------+ " " | .a | | .b | | .c | " " +-------+ +-------+ +-------+ " " +-------+ +-------+ +-------+ " " | .d | | .e | | .f | " " +-------+ +-------+ +-------+ " " +-------+ +-------+ +-------+ " " | .g | | .h | | .i | " " +-------+ +-------+ +-------+ " " | 200px | | 200px | | 200px | " }</code></pre> <p>示例效果如下图所示:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/6dcb040fb2205a98cd71a37f118a7a87.png"></p> <h2>grid-kiss中不足之处</h2> <p>上面演示了grid-kiss制作CSS Grid。那么是不是就说grid-kiss就完全能编译出CSS Grid规范中对应中所有的属性呢?那么支持的属性有:</p> <ul> <li>display:grid</li> <li>grid-template-columns</li> <li>grid-template-rows</li> <li>grid-template-areas</li> <li>justify-content</li> <li>align-content</li> <li>grid-area</li> <li>justify-self</li> <li>align-self</li> </ul> <p>不支持的属性有:</p> <ul> <li>grid-column-gap</li> <li>grid-row-gap</li> <li>grid-gap</li> <li>justify-items</li> <li>align-items</li> <li>grid-auto-columns</li> <li>grid-auto-rows</li> <li>grid-auto-flow</li> <li>grid</li> <li>grid-column-start</li> <li>grid-column-end</li> <li>grid-row-start</li> <li>grid-row-end</li> <li>grid-column</li> <li>grid-row</li> </ul> <h2>总结</h2> <p>如果你耐心的看到这里,那说明你对grid-kiss有所了解了。如果你跟着上面的一起操作过的话,那你对其有了更深入的了解。由于CSS Grid还没有得到很好的支持,不过这样尝试也不未尝不可。自己尝试下来,虽然它能更形象的帮助我们实现CSS Grid布局。但并不能说他就是万能的,比如说前面就提到过,这个插件还有很多CSS Grid对应的属性不支持。抛开这方面而言,在编辑器里绘制多格还是需要一定的时间,如果你是处女座,那有可能更纠结。另外如果你对CSS Grid的每个属性都非常的了解的话,使用手写属性制作网格有可能还是要比这个方式更快。</p> <p>今天把这个抛出来,让大家体验一下另类的CSS玩法。特别是有了PostCSS之后,可以说,CSS可以有更多的玩法。如果你感兴趣,你也可以玩出另类。(^_^)。</p> <p> </p> <h3> </h3> <p>来自:http://www.w3cplus.com/preprocessor/keep-css-grids-simple-with-postcss-grid-kiss.html</p> <p> </p>