学习sass小结(不定期更新补充...)

  第一次写博, 不好之处请多多包含

  工欲善其事必先利其器, 首先, 我们要先了解下什么是CSS预处理器

  In my opinion, CSS预处理器中的"预", 我们可以理解为"将要", 一个将要去处理CSS的工具, 那么他这里面应该包含有变量, 嵌套, 混入, 继承, 逻辑运算, 导入, 函数, 运算符等程序设计功能, 那么拥有一系列编码逻辑的功能, 肯定能够减少代码的冗余性, 提升可维护性等, 因此, CSS预处理器应该是一个具备程序设计特点的CSS语言.

  目前比较主流的CSS预处理器有: less, sass, stylus, 他们的扩展名分别是.less .scss .styl

  这里我们只讨论SASS

  先扔一个官网: https://www.sass.hk/docs/  具体语法官网更详细, 这里就不再浪费笔墨了, 只总结下学习过程中遇到的坑.

  • 环境搭建和sass的使用

  sass工具的下载和安装官网已经非常详细了, 这里不再阐述.

  使用上, 特别是初学者, 比较推荐通过监视sass文件的方式来学习, 这条命令类似热加载, 编写完能立刻知道转换成css后的样式

  注意: 通过_开头的scss文件, 系统会认为@import文件, 将不会输出对应的css文件

// 监视单个 Sass 文件,每次修改并保存时自动编译 sass --watch input.scss:output.css //其中input.scss是源文件 output.css是输出文件 // 监视整个文件夹 sass --watch source_file:aim_file //source_file源文件夹 aim_file目标文件夹 若想表示当前目录用

  想了解更多关于sass命令, 在命令行中使用sass --help

  说完了环境搭建, 下面我们来聊聊语法

  • 嵌套规则: 将一套CSS样式嵌套进另一套样式中, 内层的样式将它外层的选择器作为父选择器.

  嵌套功能避免了重复输入父选择器

// .scss
#main {
  color: red;
  .p { color: green; }
} 

// 编译后.css
#main { color:red; }
#main .p { color: green; }
  • 父选择器&

  我们在使用嵌套时候会遇到一个难题, 如果想要为某个元素设定hover样式时, 使用嵌套:hover前会出现一个空格, 这不是我们预期的效果

  或者当body元素有某个classname时, 可以用&代表嵌套规则未曾的父选择器

  例:

//.scss
a {
    color: red;
    :hover { color: green; }
    body .firefox { font-weight: normal }
}

//.css
a { color: red;}
a :hover { color: green; }      // a和:hover之间有个空格, 不是我们预期的结果
a body .firefox { font-weight: normal } // 我们是想要把a放在.firefox后面的

  此时&登场了

//.scss
a {
    color: red;
    &:hover { color: green; }
    body .firefox & { font-weight: normal }
}

//.css
a { color: red;}
a:hover { color: green; }
body .firefox a { font-weight: normal } 
  • 注释

  现在有个需求, 期望编译后的css文件中不要存在太多的注释, 毕竟这段代码要上线的, 而源文件中保留注释, 可以方便我们维护, 那么, 在Sass中提供了一套注释机制, 支持标准的CSS多行注释/* */, 以及单行注释// 前者会被完整的输出到编译后的CSS文件中, 后者不会.

  • @mixin和@include

  @mixin可以理解为输入,  他和@include结合使用,  而@include理解为输出, 即将@mixin定义的内容插入到@include引用的地方.

// .scss
// 通过@mixin定义一个公共内容
@mixin center-block{
   margin-left: auto;
   margin-right: auto;
}

// 通过@include插入到样式中
#header {
   width: 1000px;
   @include center-block;
}

// .css
#header {
    width: 1000px;
    margin-left: auto;
    margin-right: auto;
}
  • @mixin的参数和默认值

  之前开头说了, 预编译器是具有程序设计功能的, 我们可以将@mixin理解为定义一个函数, 既然是函数, 肯定少不了参数这个概念

  无默认值情况, 无默认值情况下, 该传不传, 编译会出错

// .sass
@mixin float($float){
    float: $float;
}

#header {
    @include float(left)   //传left参数
}

//.css
#header {
    float: left;
}

  带默认值

// .sass
@mixin float($float: left){     // 定义参数left
    float: $float;
}

#header {
    @include float(right)        //传right参数
}

//.css
#header {
    float: right;
}
  • @mixin多个属性, 在变量后面加...可为一个变量定义多个参数值
// .sass
@mixin box($shadow) {
    -webkit-box-shadow: $shadow;
    -moz-box-shadow: $shadow;
}

.shadow-box1 {
    @include box(1px 1px 1px red);    //这个可正常编译
}
.shadow-box2 {
    @include box(1px 1px 1px red, inset 3px 3px 3px green); //编译报错, 原因在于, 这里只定义了一个参数值
}

//  若要让这条编译通过, 只需在$shadow后加...
@mixin box($shadow...) {
    -webkit-box-shadow: $shadow;
    -moz-box-shadow: $shadow;
}
  • @mixin之@content

  首先要知道, @content是应用在@mixin里面的

  当没有@content的时候, 我们所有的样式都是在@mixin中定义好的, @include引用了这段样式, 但是@content的到来改变了这一规则, 他的作用是定义选择器, 可以理解为当@content存在时, 将@include中的内容插入到@content中

// .scss
@mixin box {
  #box1 { @content; }    // 此刻将@include 中的结构块插入到@content中, @content和@include的结构块是相辅相成的, 结构块理解为{}中内容
}

@include box {
  width: 100px;
  height: 200px;
}

// .css
#box1 {
  width: 100px;
  height: 200px;
}

这次先写到这先吧..

撤了, 撤了

原文地址:https://www.cnblogs.com/george-es/p/9384574.html

时间: 2024-11-09 01:53:02

学习sass小结(不定期更新补充...)的相关文章

动态规划学习笔记(不定期更新)

最近刚开始接触动态规划(Dynamic Programming)算法,之前略有耳闻,一直觉得DP非常之高大上,看了某些题的DP解法也是云里雾里,哇擦?!这么几行代码就解决了?怎么全是数组操作?时间复杂度也很低的样子.其实不然,当我真正开始学习动态规划的时候才发现这货没那么玄乎. 把我对DP浅显的理解总结为以下几点: 1.空间换时间. 2.找到状态. 3.找到状态转移方程. 动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决.为了能够快速的不重复的计

JavaScript正则表达式-学习笔记(不定期更新)

JavaScript权威指南学习笔记,禁止转载! 8.正则表达式 在常见的字符串检索或替换中,我们需要提供一种模式表示检索或替换的规则. 正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串. 使用: /\d\d\d/.test("123");  //true new RegExp("Bosn").test("Hi,Bosn");  //true 正则基础: . 任何字符(除换行符以外) /-/.test('[email prote

Vue过滤器学习笔记(不定期更新)~~

1.json 过滤器 1 {{exp | json 4}} 将表达式exp转换为json字符串,本质上是JSON.stringify(),后面接收一个Number类型的参数,用于决定转化后的JSON字符串的缩进距离,不输默认是2

8086汇编学习小结———实时更新

初学IBM-PC 8086,对INT指令不是很理解.现从网上总计如下: 表:DOS系统功能调INT 21H AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异步通迅输入 AL=输入数据 04 异步通迅输出 DL=输出数据 05 打印机输出 DL=输出字符 06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符 07 键盘输入(无回显) AL=输入字符 08 键盘

appframework学习--appframework开发常见问题及解决方法(不定期更新)

1.页面跳转错误:Uncaught TypeError: Cannot read property 'afCSS3AnimateId' of undefined 原因:data-defer=""  跳转路径不正确 解决:路径正确即可 2.程序正在启动的圈圈一直 原因:转id冲突,出现重名id 解决:id冲突,出现重名id appframework学习--appframework开发常见问题及解决方法(不定期更新)

LDD和scull相关各种结构体的故事(学习笔记 不定期更新)

LDD和各种结构体的故事 struct scull_dev     位置:scull/scull.h struct scull_dev { struct scull_qset *data; /* Pointer to first quantum set */ int quantum; /* the current quantum size */ int qset; /* the current array size */ unsigned long size; /* amount of data

leran html5(不定期更新)

采用Html5技术编写 了解HTML5请到:http://baike.baidu.com/link?url=4437QJzcpocoFR42wQf6DDOk-7Wj3_zrA7ft_ces0keEVjiCey2C4PyMKmiTt8Mg9YI2hWC7CXBxV7oLbT3Rg_ 开始学习吧! Learn Html5   By C.N.Chinese 1.伪元素 Home About News Develop Others style: #nav{ display:block;width:600

从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录

缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里想了想,还是需要增加上,旨在提高框架的高效性.不定期日常就直接上代码了,我有一个小想法,就是希望大家有好的想法,可以给我说,我会整理下,添加到框架里,并在文章头里写上 投稿作者:这里重点说明下,是参考群里小伙伴 Hello World! 的相关内容,并在他的基础上更新,添加了注入和全局,大家可以看看

基于C/S架构的3D对战网络游戏C++框架 _【不定期更新通知】

由于笔者最近有比赛项目要赶,这个基于C/S架构的3D对战网络游戏C++框架也遇到了一点瓶颈需要点时间沉淀,所以近一段时间不能保证每天更新了,会保持不定期更新.同时近期笔者也会多分享一些已经做过学过的C++.服务器端开发.游戏开发相关的内容给大家(因为这些内容已经熟悉也积攒了一定量现有的笔记所以整理成博客会相对轻松些).感谢大家支持,深鞠躬.过两天笔者要去上海参加C++大会,回来后会把参会感悟也分享给大家的^__^.喜欢技术人的纯粹,没有等级之分,希望我们能一路一起进步,共同成长. 基于C/S架构