参考文章
代码演示
- alpha1.0 当要完成响应式布局时,纯手写方法一般是如下,缺点是,如果要修改断点,或者修改属性值的时候,全部要手动修改,如果代码是比较杂乱的会显得,并不够优秀。所以,就有了第一种用scss实现的方式。
@media screen and (min-width: 480px) {
p {font-size:26px;}
h1 {font-size:40px;}
}
@media screen and (min-width: 320px) {
p {font-size:18px;}
h1 {font-size:30px;}
}
这种方式给所需要的断点对应的值组织一个list,通过@each遍历,很容易就完成简单的响应式布局
$h1List:(
'null' : 10px,
'480px': 20px,
'728px': 30px,
'1200px': 40px,
);
$pList:(
'null' : 15px,
'480px': 16px,
'728px': 17px,
'1200px': 18px,
);
@mixin fontSize1($list){
@each $point, $size in $list {
//设置一个默认的值
@if $point == "null"{
font-size : $size;
}@else{
@media screen and (min-width : $point){
font-size : $size;
}
}
}
}
p{
@include fontSize1($pList)
}
h1{
@include fontSize1($h1List);
}
- alpha2.0 以上代码的不足是,如果要大量修改断点的话,需要手动修改每一个list的断点值,所以在下一步中,就把这些断点值组合成了一个list
$breakpoint : (
'small' : 480px,
'middle' : 728px,
'large' : 1200px
);
$h1List:(
'null' : 10px,
'small': 20px,
'middle': 30px,
'large': 40px,
);
$pList:(
'null' : 15px,
'small': 26px,
'middle': 17px,
'large': 18px,
);
@mixin fontSize2($list,$points:$breakpoint ){
//这里可能有点绕,就是首先获得list中的font-size和对应的断点值$point-null/small...
@each $point, $size in $list {
@if $point == "null"{
font-size : $size;
}@else{
//map函数 传入刚才获得的断点,如果刚才的断点point存在于断点list中,则对$point重新赋值为断点list中的实际值
@if map-has_key($points,$point){
$point : map_get($points,$point);
}
@media screen and (min-width : $point){
font-size : $size;
}
}
}
}
p{
@include fontSize2($pList)
}
h1{
@include fontSize2($h1List);
}
- alpha3.0,是对响应式的一个扩展,当某几个属性是相互联系的,存在于每一个标签的响应式实现中,就可以对设定的属性list进行扩展,我反正说不清楚了,看代码吧。以下代码,扩展的是line-height属性
$breakpoint : (
'small' : 480px,
'middle' : 728px,
'large' : 1200px
);
$h1List:(
'null' : (10px,1),
'small': (20px,1.2),
'middle': (30px,1.5),
'large': (40px,2),
);
$pList:(
'null' : (15px,1),
'small': (26px,1.2),
'middle': (17px,1.5),
'large': (18px,2.0)
);
@mixin get-font-size($font-size){
//接受传入的list参数,把list进行拆分,分别给属性赋值
@if type-of($font-size) == 'list'{
font-size: nth($font-size,1);
@if (length($font-size) > 1){
line-height: nth($font-size,2);
}
//@if (length($font-size) > 2){
// ...
//}
}@else{
font-size : $font-size;
}
}
@mixin fontSize3($list,$points:$breakpoint ){
@each $point, $size in $list {
@if $point == "null"{
//把对属性赋值改成调用一个@mixin
@include get-font-size($size);
}@else{
@if map-has_key($points,$point){
$point : map_get($points,$point);
}
@media screen and (min-width : $point){
@include get-font-size($size);
}
}
}
}
p{
@include fontSize3($pList)
}
h1{
@include fontSize3($h1List);
}
总结
- 以上的代码都是跟着w3cplus的大漠老师的文章敲得。w3cplus上学习sass是我目前发现国内最好的地方了。
- 然后即使是3.0也有很多不足的地方,大漠老师文章说的很清楚,我认为css也可以自己纯手写,所以遇到问题的时候,再去思考scss的解决方式,查看文章,了解更多的内置函数的使用方式,这样就很好了。