mass
mass a css toolbox based on mcss(The new css preprocessor)
mass提供大量的函数, 同时也是mcss的官方使用示例. 如果对于文档有疑惑,请参考MCSS主页, 也可以留言
使用
1. 安装mcss
首先,确保你安装了nodejs 和 npm.
npm install -g mcss
2. 引入mass库
直接import :
mcss可以依赖远程mcss文件, (只要进程不退出, 远程文件会缓存在内存中, 比如开启了watch参数,这样只会在第一次build中会有载入开销), 我们可以很方便的引用网络上的mcss文件
/* mass入口文件 */; /* 此时你就可以使用mass的函数了 */
目前github对于短期多次资源的http的加载会发生503的情况,建议把组件库放置在自己可以访问的位置
本地使用时,你也可以将mass加入到你的include path(配置文件或命令),
mcss --include path/to/mass_dir
然后就只需要@import
短名了
;;
文档目录
- css3.mcss(源码) —— 提供海量的css3的兼容处理(由于mcss的强大特性,其实没写多少代码)
- reset.mcss(源码) —— 提供多种reset函数, nec-reset, normalize ... etc
- helper.mcss(源码) —— 提供一些常用帮助函数,比如$clearfix等等
- layout.mcss(源码) —— 提供一些布局相关函数
- effect.mcss(源码) —— 提供一些常用的animation mixin, 并提供参数控制.
- functions.mcss(源码) —— 一些函数集合, mass的每个文件都或多或少依赖了这个函数
- var.mcss(源码) —— 全局变量, 目前只有两个
- index.mcss(源码) —— 以上所有子文件的入口文件, 你偷懒可以只引入这个文件
需要注意的是 : mass中的所有文件都可以单独引入, 已经处理好了依赖关系。
使用文档
源码请看对应文件
css3.mcss
1.css3主要是帮助我们无痛的使用css3特性,
同名vendor prefixr:
一些简单的vendor prefix占据了css3处理的大部分,参考的是这个在维护中的css浏览器实验列表
Example
Outport
其它例如$box-sizing
之类的也是一致,详细列表css3.file:L12
- transition (webkit moz),
- transition-delay (webkit moz),
- transition-property (webkit moz),
- transition-duration (webkit moz),
- transition-timing-function (webkit moz),
- animation (webkit moz),
- animation-delay (webkit moz),
- animation-name (webkit moz),
- animation-direction (webkit moz),
- animation-duration (webkit moz),
- animation-fill-mode (webkit moz),
- animation-iteration-count (webkit moz),
- animation-timing-function (webkit moz),
- columns (webkit moz),
- column-count (webkit moz),
- column-gap (webkit moz),
- column-fill (webkit moz),
- column-rule (webkit moz),
- column-rule-color (webkit moz),
- column-rule-style (webkit moz),
- column-rule-width (webkit moz),
- column-span (webkit moz),
- column-width (webkit moz),
- box-orient (webkit moz),
- box-sizing (webkit moz),
- box-pack (webkit moz),
- box-align (webkit moz),
- box-direction (webkit moz),
- box-lines (webkit moz),
- box-ordinal-group (webkit moz),
- box-flex (webkit moz),
- box-flex-group (webkit moz),
- box-shadow (webkit moz),
- transform null,
- transform-origin null,
- transform-style null,
- perspective (webkit moz),
- perspective-origin (webkit moz),
- appearance (webkit moz ms o),
- backface-visibility (webkit moz),
- background-clip webkit,
- background-origin webkit,
- background-size webkit,
- border-box (webkit moz),
- box-shadow webkit,
- user-select (webkit moz ms),
- hyphens (epub moz ms),
- filter (moz webkit);
所有以上css3的参数与原样式一致
$border-radius($radius, $direction)
$border-radius
除了处理前缀, 可以传入额外参数控制位置,
Arguments
- $radius —— 圆角半径
- $direction —— (可选) 圆角的位置 可以是角(top left) 也可以是边(top)
Example
.radius{
$border-radius: 3px;
}
.radius-corner{
$border-radius: 3px, top left;
}
.radius-side{
$border-radius: 3px, top;
}
Outport
.radius{
-moz-border-radius:3px;
border-radius:3px;
}
.radius-corner{
-moz-border-top-left-radius:3px;
border-top-left-radius:3px;
}
.radius-side{
-moz-border-top-left-radius:3px;
border-top-left-radius:3px;
-moz-border-top-right-radius:3px;
border-top-right-radius:3px;
}
$linear-gradient = ($direct, $color-stops...)
线型渐变
Argument
$direct
[可以选默认top] : 从哪个方向开始 如top left
,top
或者以哪个角度 如 45deg 等;$color-staops
: 颜色值列表, 可以加入百分比或长度 如 #fff 50%, #ccc 20px , color-stop可以有无限个;
要点
- 总体就是参数与规范类似
- 默认会mix 最末和最先的颜色进行mix 作为ie低版本的fallback
- 如果是垂直或者水平渐变,比如 top bottom right 和 left 会生成ie下的滤镜形式,其它角度则不生成
Exmaple
$primary = #f6ffc1;
.m-top{
/* l-adjust 是调节亮度 */
$linear-gradient: right, $primary , l-adjust($primary, 10%);
}
Outport
$radial-gradient = ($color-stops...)
圆形渐变, 与线性渐变类似,不过这里color-stop的扩散方向是从圆点到外圈,
Argument
$color-stops
: 从内向外的圆颜色层级, 一样可以加入百分比或长度值控制比例
Exmaple
.m-top{
$radial-gradient: #aaa, #ccc 20%, #ddd 80%, #eee;
}
Outport
.m-top{
background-color:#ccc;
background-image:-webkit-radial-gradient(ellipse,#aaa,#ccc 20%,#ddd 80%,#eee);
background-image:-moz-radial-gradient(ellipse,#aaa,#ccc 20%,#ddd 80%,#eee);
background-image:-ms-radial-gradient(ellipse,#aaa,#ccc 20%,#ddd 80%,#eee);
background-image:-o-radial-gradient(ellipse,#aaa,#ccc 20%,#ddd 80%,#eee);
background-image:radial-gradient(ellipse,#aaa,#ccc 20%,#ddd 80%,#eee);
background-repeat:no-repeat;
}
$keyframes = ($name, $block)
兼容浏览器的keyframs写法, 与@keyframes对应, mass同时利用它封装了effect.mcss
Arguments
- $name —— keyframes 名称
- $block —— 传入的block函数, 这个函数接受的第一个参数是前缀, 大部分情况你不需要这个参数, 比如
-o-
,-webkit-
Example
$block = ($prefix){
20%{
#{$prefix}transform: scale(2.0,2.0);
}
to{
#{$prefix}transform: scale(1.0,1.0);
}
}
$keyframes(hello, $block);
Outport
@-}@-}@-}@}
$placeholder ($block)
控制placeholder的样式
参数: 一个block(即无参数的函数);
示例:
#input1{
$placeholder({
color:#090;
background:#fff;
text-transform:uppercase;
});
}
// 在最外层调用
$placeholder({
color:#090;
background:#fff;
text-transform:uppercase;
});
输出
$hidpi = ($block, $ratio = 1.5)
由于处理高dpi的media query的兼容性问题
Arguments
- $block -- 传入@media中的block
- $ratio —— device-pixel-ratio 默认1.5
Example
$hidpi({
body{
left: 10px;
}
p{
right: 20px;
}
}, 2.0)
Outport
@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min--moz-device-pixel-ratio: 2),
only screen and (-o-min-device-pixel-ratio: 2/1),
only screen and (min-resolution: 192dpi),
only screen and (min-resolution: 2dppx){
body{
left:10px;
}
p{
right:20px;
}
}
reset.mcss
2.目前提供$reset-normalize
和 $nec-reset
分别提供不同功能层级的reset需要,分别Copy自NEC 与 normalize
Exmaple
@import 'mass/reset.mcss'
$reset-nec();
// or $reset-normalize();
或者, 自动设置配置变量$include-reset
进行对应reset的include
$include-reset = nec;
@import 'mass/reset.mcss'
Tips
除了使用函数之外, 你可以在include 进reset 之前 设置 $ ?= false;
helper.mcss
3.helper主要提供一些类似 $clearfix的帮助函数,帮助处理一些兼容性问题, 或者集合缩写
$clearfix
清除浮动, 这应该是最常用的mixin
Example
.container{
$clearfix();
}
Outport
$size($width, $height)
同时设置宽度以及高度,如果没有传入$height, 则高度默认为$width Argument
$width
: 宽度$height
: 高度(可选)
$opacity($opa)
设置透明度,处理了ie的兼容性.
Arguments
$opa
: 取值范围为0-1
Example:
.u-btn{
$opacity: 0.1;
}
Outport:
.u-btn{
filter:alpha(opacity = 10);
opacity:0.1;
}
$min-height($height)
设置最小高度,主要是处理了IE6下的问题, 借鉴的是一般解决方案
Example
.g-sd{
$min-height: 20px;
}
Outport
$txt-ellipsis($nowrap = true)
文字超过出现省略号
Arguments
- $nowrap : 是否不断行 ,默认为true
Example
td{
$txt-ellipsis();
}
Outport
td{
white-space:nowrap;
text-overflow:ellipsis;
overflow:hidden;
}
$display($type)
display处理了有关display的兼容性问题, 比如inline-box, box.
Example:
Outport:
body{
display:inline-block;
vertical-align:baseline;
zoom:1;
*display:inline;
*vertical-align:auto;
}
p{
display:-webkit-box;
display:-moz-box;
display:box;
}
$font-face($name, $path, $block, $support-svg =false)
处理@font-face
Arguments
- $name—— 代表字体名
- $path—— 字体们的路径,需去掉后缀 ,如
/path/to/monoco
- $block—— func,需混入的样式
- $support-svg —— 是否引入svg格式
使用这个只是方便在一定约定下 引入各个格式的字体
Exmaple
$font-face('monaco','path/to/monaco', {
font-weight: bold;
font-style: italic;
});
Outport
layout.mcss
4.layout处理一些常见的布局问题 , 以及栅格布局生成等功能, 目前只提供fixed-layout相关的mixin。 $fixed-layout
、$fixed-grid
以及 $fixed-container
1. $fixed-layout($col-widths, $gap = 0px, $prefix = 'col')
固定宽度的布局生成, 包括可以实现n栏自适应的布局, 小伙伴们说再也不怕忘记那些n栏自适应了
Arguments
-
$col-widths : 以空格分隔的宽度值, 可以有一个
auto
值,代表这栏是自适应的, 则这栏内部的col-cnt
节点才是容器类 -
$gap 栏间距
-
类名的前缀默认为
col
, 即没栏的类名默认为col-n
, 当某栏为自适应时,内部的容器类为col-cnt
.
Exmpale
一个三栏中部自适应的例子
.l-1{
$fixed-layout: 200px auto 100px, 30px, g-mn;
}
Outport
对应的html应该是
<div class="l-1">
<div class="g-mn-1"></div>
<div class="g-mn-2">
<div class="g-mn-cnt">l-1</div>
</div>
<div class="g-mn-3"></div>
</div>
注意自适应栏的容器为g-mn-cnt, 而固定宽度栏为对应的下标容器节点
当没有 自适应栏(即无auto的参数)时,会设置容器的宽度, 值为之前所有的宽度和以及间距和如
.l-3{
$fixed-layout: 200px 600px, 10px;
}
2. $fixed-grid($col-width, $gap=0px, $col-num=12, $prefix='')
固定布局(基于px)的栅格系统生成, 一般用于整个产品的页面时
Arguments
$col-width
栏宽$gap
栏间距 默认为0栏数目
默认为12前缀
默认为''
注意
了解bootstrap2的同学可能了解这个栅栏布局结构, 生成的类型有两种, offset 与 span, offset代表偏移的量, span代表此栏宽度, 例如
<div class='span1 offset2'></div>
是一个向右偏移两单位 宽度一单位的块
另外同时生成两个类.row
、.container
, row代表一行布局的开始, 而container的宽度即12栏总宽, 只要容器内的元素的总offset+span的数目等于栏数, 则撑满这个 container
这些类都可以加入自定义前缀,比如NEC的g
命名
Exmpale
一键生成 bootstarp的栅格系统 940宽度 12栏,并且兼容ie6.
$fixed-grid(60px, 20px, 12);
Outport
.span1,.span2,.span3,.span4,.span5,.span6,.span7,.span8,.span9,.span10,.span11,.span12{
float:left;
min-height:1px;
margin-left:20px;
display:inline;
}
.span1{
width:60px;
}
.offset1{
margin-left:100px;
}
.span2{
width:140px;
}
.offset2{
margin-left:180px;
}
.span3{
width:220px;
}
.offset3{
margin-left:260px;
}
.span4{
width:300px;
}
.offset4{
margin-left:340px;
}
.span5{
width:380px;
}
.offset5{
margin-left:420px;
}
.span6{
width:460px;
}
.offset6{
margin-left:500px;
}
.span7{
width:540px;
}
.offset7{
margin-left:580px;
}
.span8{
width:620px;
}
.offset8{
margin-left:660px;
}
.span9{
width:700px;
}
.offset9{
margin-left:740px;
}
.span10{
width:780px;
}
.offset10{
margin-left:820px;
}
.span11{
width:860px;
}
.offset11{
margin-left:900px;
}
.span12{
width:940px;
}
.offset12{
margin-left:980px;
}
.offset0{
margin-left:0px;
}
.row{
*zoom:1;
margin-left:-20px;
}
.row:before,.row:after{
display:table;
content:"";
line-height:0;
}
.row:after{
clear:both;
}
.container{
width:940px;
}
对应的demo可以查看 __test__目录
$fixed-container($width)
很简单, 水平居中 、固宽(假如传入$width参数)、清除浮动的容器
Arguments
.g-doc{
$fixed-container: 960px;
}
Outport
.g-doc{
*zoom:1;
width:960px;
margin-left:auto;
margin-right:auto;
}
.g-doc:before,.g-doc:after{
display:table;
content:"";
line-height:0;
}
.g-doc:after{
clear:both;
}
effect.mcss
5.参数配置
$effect-outport
—— 是否输出内置的几种效果, 默认为不输出
effect.mcss 中的所有效果都是基于以下两个函数$effect
, $effect-func
.
它们参数完全一致,区别是$effect-func
只在全局注册对应的函数,而$effect
是直接输出
注意
使用$effect-func时,在调用对应函数
内置效果
$effect($name, $block, $with-class)
Arguments
- $name[text] keyframes的名字以及输出的className
- $block[func] keyframesblock,接受代表
-o-
等前缀的参数 - $with-class[func]—— 可选,代表输出类要做的额外样式
解决keyframes的跨浏览器生成, 并生成对应的class.
Example
$effect(flip, ($prefix){
0% {
#{$prefix}transform: perspective(300px) rotateY(0);
#{$prefix}animation-timing-function: ease-out; }
40% {
#{$prefix}transform: perspective(300px) translateZ(100px) rotateY(170deg);
#{$prefix}animation-timing-function: ease-out; }
50% {
#{$prefix}transform: perspective(300px) translateZ(100px ) rotateY(190deg) scale(1);
#{$prefix}animation-timing-function: ease-in; }
80% {
#{$prefix}transform: perspective(300px) rotateY(360deg) scale(.95);
#{$prefix}animation-timing-function: ease-in; }
100% {
#{$prefix}transform: perspective(300px) scale(1);
#{$prefix}animation-timing-function: ease-in; }
},{
$backface-visibility: visible;
});
Outport
.animated{
-webkit-animation-duration:1s;
-moz-animation-duration:1s;
animation-duration:1s;
-webkit-animation-fill-mode:both;
-moz-animation-fill-mode:both;
animation-fill-mode:both;
}
@-webkit-keyframes flip{
0%{
-webkit-transform:perspective(300px) rotateY(0);
-webkit-animation-timing-function:ease-out;
}
40%{
-webkit-transform:perspective(300px) translateZ(100px) rotateY(170deg);
-webkit-animation-timing-function:ease-out;
}
50%{
-webkit-transform:perspective(300px) translateZ(100px) rotateY(190deg) scale(1);
-webkit-animation-timing-function:ease-in;
}
80%{
-webkit-transform:perspective(300px) rotateY(360deg) scale(0.95);
-webkit-animation-timing-function:ease-in;
}
100%{
-webkit-transform:perspective(300px) scale(1);
-webkit-animation-timing-function:ease-in;
}
}
@-moz-keyframes flip{
0%{
-moz-transform:perspective(300px) rotateY(0);
-moz-animation-timing-function:ease-out;
}
40%{
-moz-transform:perspective(300px) translateZ(100px) rotateY(170deg);
-moz-animation-timing-function:ease-out;
}
50%{
-moz-transform:perspective(300px) translateZ(100px) rotateY(190deg) scale(1);
-moz-animation-timing-function:ease-in;
}
80%{
-moz-transform:perspective(300px) rotateY(360deg) scale(0.95);
-moz-animation-timing-function:ease-in;
}
100%{
-moz-transform:perspective(300px) scale(1);
-moz-animation-timing-function:ease-in;
}
}
@-o-keyframes flip{
0%{
-o-transform:perspective(300px) rotateY(0);
-o-animation-timing-function:ease-out;
}
40%{
-o-transform:perspective(300px) translateZ(100px) rotateY(170deg);
-o-animation-timing-function:ease-out;
}
50%{
-o-transform:perspective(300px) translateZ(100px) rotateY(190deg) scale(1);
-o-animation-timing-function:ease-in;
}
80%{
-o-transform:perspective(300px) rotateY(360deg) scale(0.95);
-o-animation-timing-function:ease-in;
}
100%{
-o-transform:perspective(300px) scale(1);
-o-animation-timing-function:ease-in;
}
}
@keyframes flip{
0%{
transform:perspective(300px) rotateY(0);
animation-timing-function:ease-out;
}
40%{
transform:perspective(300px) translateZ(100px) rotateY(170deg);
animation-timing-function:ease-out;
}
50%{
transform:perspective(300px) translateZ(100px) rotateY(190deg) scale(1);
animation-timing-function:ease-in;
}
80%{
transform:perspective(300px) rotateY(360deg) scale(0.95);
animation-timing-function:ease-in;
}
100%{
transform:perspective(300px) scale(1);
animation-timing-function:ease-in;
}
}
.animated.flip{
-webkit-animation-name:flip;
-moz-animation-name:flip;
animation-name:flip;
-webkit-backface-visibility:visible;
-moz-backface-visibility:visible;
backface-visibility:visible;
}
知道animation.css的应该明白如何使用,即只要加入对应的类名即可
$effect-func($name, $block, $with-class)
$effect-func
相当于是把$effect
的动作延迟到了函数调用时发生, 会在全局产生一个同名函数(区别是多了一个$
前缀), 例如上个例子,使用$effect-func的话,会在全局定义一个$flip
函数,调用则会输出对应的@keyframes样式,这个可以避免不需要的keyframes糟蹋了css文件.
此外当使用$effect-func时,可以加入对应的参数来控制@keyframes的block, 不仅仅是$prefix参数.
Arguments
参数与$effect
, 一致
Example
$effect-func(flash,($prefix, $min-opacity = 0){
0%, 50%, 100% {opacity: 1;}
25%, 75% {opacity: $min-opacity;}
});
//假如我们希望flash效果从透明度50%开始, 参数会传入到$block中, 紧接着默认加入的$prefix参数, 在这个例子就是$min-opacity参数.
$flash(0.5);
Outport
@-webkit-keyframes flash{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.5;
}
}
@-moz-keyframes flash{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.5;
}
}
@-o-keyframes flash{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.5;
}
}
@keyframes flash{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.5;
}
}
.animated.flash{
-webkit-animation-name:flash;
-moz-animation-name:flash;
animation-name:flash;
}
有人可能会想到,如果需要两个不同参数的同类效果呢? 名字重复不是被覆盖了么?不用担心,只要传入的参数末位是个text类型
(即没有引号的文本),会被认为是重新命名的参数,比如沿用上述例子产生的
Example2
// after example1
$flash(0.3, flash1);
$flash(0.6, flash2);
Outport2
@-webkit-keyframes flash1{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.3;
}
}
@-moz-keyframes flash1{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.3;
}
}
@-o-keyframes flash1{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.3;
}
}
@keyframes flash1{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.3;
}
}
.animated.flash1{
-webkit-animation-name:flash1;
-moz-animation-name:flash1;
animation-name:flash1;
}
@-webkit-keyframes flash2{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.6;
}
}
@-moz-keyframes flash2{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.6;
}
}
@-o-keyframes flash2{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.6;
}
}
@keyframes flash2{
0%,50%,100%{
opacity:1;
}
25%,75%{
opacity:0.6;
}
}
.animated.flash2{
-webkit-animation-name:flash2;
-moz-animation-name:flash2;
animation-name:flash2;
}
这同时有个问题,就是在传入时, 不要让Text类型的参数成为你的末尾参数。否则$effect-func会视其为重命名参数
内置effect
除了提供了$effect
、$effect-func
帮助我们创建自己的效果外,effect.mcss提供了几种效果,当开启 $effect-outport= true
时候,可以将这些特效以默认值的方式直接输出,否则你可以分别调用来达到输出。
内置effect列表以及默认值信息:
只要需要参数的特效,都有默认值,所以你完全可以不传入参数。
//
$flash();
$shake($offset = 10px);
$bounce($height=40px);
$tada($scale-offset = 0.2, $degree = 3deg);
$swing($degree = 12deg);
$pulse($scale-offset=0.1);
$wobble($offset = 25%, $degree = 5deg);
$wiggle( $degree = 12deg);
$flip( $perspect = 300px);
$flipInX();
$flipInY();
$flipOutX();
$flipOutY();
$fadeIn();
$fadeOut();
$fadeInX($offset = 30px);
$fadeInY($offset = 30px);
$fadeOutX($offset = 30px);
$fadeOutY($offset = 30px);
$bounceIn();
$bounceOut();
$rotateIn($start-deg= -360deg, $start-scale = 1.2);
$rotateOut($end-deg= -360deg, $end-scale= 0.8);
这些函数都是利用$effect-func封装,所以可以传入参数,并修改对应的名称。
使用时只要在节点上加入.animated
与对应效果名,比如.shake
即可, 与animate.mcss
是一致的(其实就只是animate.css的mcss移植了);
Example
$rotateIn(-270deg, 1.5);
Outport
@- 100%}@- 100%}@- 100%}@ 100%}
animation是个非常灵活的css特性,效果是写不全的,利用$effect
、$effect-func
去封装自己的特效吧。
functions.mcss
6.这里只列出公有函数
$if( $test, $value, $value2)
如果test通过 则返回 $value, 否则返回$value2, 是的 仅仅只是用来减少@if @else的书写 Example
body{
left: $if(true, 2, 3);
}
Outport
$map($valueslist, $key)
取得fakehash的某个key下的值, mcss支持@for in 遍历一个valueslist伪造的hash。而$map方法可以取得这个hash的某个key的value
Exmpale
$fakehash = big 20px, small 10px, large 40px;
body{
left: $map($fakehash, big);
}
Outport
body{
left:20px;
}
var.mcss
7.集中的参数控制, 所有单独的对外文件都依赖它,目前有
// 是否直接引入某个reset的样式
$include-reset ?= false;
// 是否直接输出effect
$effect-outport ?= false;
index.mcss
8.可以调用以上所有函数
Changelog
TODO
开始写lib目录的js扩展 2013/8/4 0:17:21
- 雪碧图自动生成。
- 渐变图的生成,达到真正的跨浏览器