详解scss的继承、占位符和混合宏
1、继承和占位符
两者都是通过
@extend来引用。
1.1 继承
一个已经存在的css样式类,可以被其他样式类继承。
例如,实现以下css样式:
.btn, .btn--primary, .btn--info {
border: 1px solid blue; }
.btn--primary {
color: black; }
.btn--info {
color: gray; }
scss中可以这样写,显然,这种写法便于维护和阅读!
.btn {
border: 1px solid blue;
}
.btn--primary {
color: black;
@extend .btn;
}
.btn--info {
color: gray;
@extend .btn;
}
1.2 占位符
顾名思义,如果不被
extend引用,它是不会被编译,也就是:不会占用css文件大小。这是和继承最大区别。
scss代码如下:
%btn {
border: 1px solid blue;
}
// 没有被extend
// 不会出现在css文件中
%test-btn {
border: 1px solid black;
}
.btn--primary {
color: black;
@extend %btn;
}
.btn--info {
color: gray;
@extend %btn;
}
编译后的css代码:
.btn--primary, .btn--info {
border: 1px solid blue; }
.btn--primary {
color: black; }
.btn--info {
color: gray; }
2. 混合宏
scss中的函数,通过关键字
@mixin声明,@include引用。
2.1 参数设置和调用方式
无参调用
scss:
@mixin btn {
border-radius : 3px;
}
.box {
color: white;
@include btn;
}
css:
.box {
color: white;
border-radius: 3px; }
参数调用
scss:
$radius:3px !default;
@mixin btn($radius:5px) { // 默认是 5px
border-radius : $radius;
}
.box {
color: white;
@include btn($radius); // 传入参数
}
css:
.box {
color: white;
border-radius: 3px; }
参数过多的情况
当参数2、3个时候,可以通过
@mixin size($width,$height)这样来调用。当参数过多,使用...符号。
scss:
$height: 15px !default;
$width: 18px !default;
@mixin size($list...) {
@if length($list) == 0 {
height: $height;
width: $width;
}@else if length($list) == 1 {
height: $list;
width: $list;
}@else if length($list) == 2 {
height: nth($list , 1);
width: nth($list , 2);
}@else {
@debug "Too many parameters";
}
}
.btn--primary {
@include size();
}
.btn--big {
@include size(20px , 25px);
}
.btn--square {
@include size( 18px );
}
.btn--test {
@include size(1px,2px,3px,4px); // just a test. console output "Too many parameters" what we have defined.
}
输出的css结果:
.btn--primary {
height: 15px;
width: 18px; }
.btn--big {
height: 20px;
width: 25px; }
.btn--square {
height: 18px;
width: 18px; }
2.2 好处和不足
混合宏最大的不足:会复用代码,造成css冗赘(可以尝试一下下方的测试代码)。
当然,符合宏可以传递参数这点很nice。
可以编译下方代码,观察下结果:
@mixin border-radius{
-webkit-border-radius: 3px;
border-radius: 3px;
}
.box {
@include border-radius;
margin-bottom: 5px;
}
.btn {
@include border-radius;
}
3. 版本
- scss:3.5.6
- ruby:2.4.4p296
欢迎技术交流,引用请注明出处。
个人网站:godbmw.com
Github:godbmw
详解scss的继承、占位符和混合宏的更多相关文章
- 详解Javascript的继承实现(二)
上文<详解Javascript的继承实现>介绍了一个通用的继承库,基于该库,可以快速构建带继承关系和静态成员的javascript类,好使用也好理解,额外的好处是,如果所有类都用这种库来构 ...
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
- sass 继承 占位符 %placeholder
@extend //SCSS .btn { border: 1px solid #ccc; padding: 6px 10px; font-size: 14px; } .btn-primary { b ...
- JS 详解对象的继承
在学习这篇博文前,请先移步我的另外一篇博文:JS 一张图理解prototype.proto和constructor的关系,先弄清楚“原型链”,这样对于理解继承会非常有效. 注意:博文中提到的“属性”, ...
- 详解Javascript的继承实现
我最早掌握的在js中实现继承的方法是在w3school学到的混合原型链和对象冒充的方法,在工作中,只要用到继承的时候,我都是用这个方法实现.它的实现简单,思路清晰:用对象冒充继承父类构造函数的属性,用 ...
- 详解JavaScript对象继承方式
一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Parent 构造函数成为 Children 的方法,然 ...
- 详解python中的描述符
描述符介绍 总所周知,python声明变量的时候,不需要指定类型.虽然现在有了注解,但这只是一个规范,在语法层面是无效的.比如: 这里我们定义了一个hello函数,我们要求name参数传入str类型的 ...
- Scala面向对象—类详解2(继承相关)
1.单例类 package com.zzzy class AAA {//单例 /*//java 思路--私有化构造方法,提供公开的getAAA 行不通 private def this(){ this ...
- 详解C++中继承的基本内容
有些类与类之间存在特殊的关系,有共性也有特性,比如动物类可以细分为猫,狗等.下级别的成员除了拥有上一级的共性,还有自己的特性,这个时候就可以考虑继承的技术,减少重复代码. 一.继承中的对象模型 1.1 ...
随机推荐
- C++回调:利用Sink
Sink的本质是利用C++的封装.继承.多态的面向对象来实现,从实现角度来说,更优于函数指针回调: // cbBysink.cpp : Defines the entry point for the ...
- 利用蒙特卡洛(Monte Carlo)方法计算π值[ 转载]
部分转载自:https://blog.csdn.net/daniel960601/article/details/79121055 圆周率π是一个无理数,没有任何一个精确公式能够计算π值,π的计算只能 ...
- Linux源码编译安装程序
一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在 ...
- ajax跨域问题小结
跨域:跨域名的访问,是浏览器对ajax的一种限制,这样可以有效的房子跨站攻击 跨域的范畴: 域名不同 或 端口不同 或 二级域名不同 解决方案: 第一种:由于前端基础薄弱,且该方式老掉牙,不讲解: ...
- php安装扩展的几种方法
转自:http://doc3.workerman.net/appendices/install-extension.html 安装扩展 注意 与Apache+PHP或者Nginx+PHP的运行模式不同 ...
- c# 多线程实现ping 多线程控制控件
这个备份器放在项目目录下面,每次使用就双击一下,因为便捷性,就不采用xml等等储存信息,全部在面板内做,这样可以保证一个exe就运行了. 我发现运行起来还蛮快的,唯一没有实现的是ping通的电脑如果出 ...
- 《Nosql精粹》—— 读后总结
- Javascript高级编程学习笔记(6)—— 流程控制语句
话不多说,我们直接开始进入今天的主题 流程控制语句 首先什么是流程控制语句呢? 顾名思义,就是控制流程的语句. 在JS中语句定义了ECMAScript中的主要语法,让我们可以使用一系列的关键字来完成指 ...
- Linux - 修改内核启动顺序及删除无用内核
现象: CentOS7开机启动界面显示多个内核选项 原因: 正常情况下,有两个启动项,一个是"正常启动",另一个是"救援模式启动"(rescue). 如果启动项 ...
- lable标签的用途
lable标签的用途:为iput输入框元素定义标注: label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如果您在 label 元素内点击文本,就会触发此控件.就是说,当用户选 ...