CSS预处理与SASS语法

本文深入讲解SASS预处理语言的语法特点,包括变量、嵌套、计算功能等基础语法,并介绍如何利用继承、mixin实现代码重用,还探讨了条件语句、循环语句及自定义函数等高级用法。

CSS预处理和SASS语法

为什么用SASS?

刚接触公司的项目,我真的很费解,为什么项目里要用类似SASS,LESS这样的东西,不是有css吗,导入css文件不就可以了吗?这个是用来干嘛的啊?要知道为什么,先来看看SASS到底是什么,怎么用的。

SASS语法

我们先来看一个SASS文件的例子:

$class-prefix: "tabs";

ul {
  margin: 0;
  padding: 0;
}

.#{$class-prefix} {
  &-bar {
    margin-bottom: 16px;
  }

  &-nav {
    font-size: 14px;

    &:after,
    &:before {
      display: table;
      content: " ";
    }

    &:after {
      clear: both;
    }
  }
}

WTF?这都是什么?

1.变量

先看第一行:

    $class-prefix: "tabs";
    ...
    .#{$class-prefix} {}

SASS中可以使用变量,但是我们要告诉程序这是变量,所以用$开头,所以这里class-prefix是变量,它的值是”tabs”,怎么使用?如果变量需要镶嵌在字符串之中,就必须需要写在#{}之中。

2.嵌套

继续往下看:

.#{$class-prefix} {
  &-bar {
    margin-bottom: 16px;
  }

  &-nav {
    font-size: 14px;

    &:after,
    &:before {
      display: table;
      content: " ";
    }

    &:after {
      clear: both;
    }
  }
}

&是什么?首先我们得看到这个结构,他是嵌套的,通过一层层的缩进,表示父元素下的子元素,而&就是引用父元素,属性也可以嵌套,比如border-color属性,可以写成(注意,border后面必须加上冒号):

p {
    border: {
    color: red; 
    }
}

上面的这几个语法是几乎所有的SASS文件都会遇到,而下面可能不是一定会用到,却也是代表SASS语法的特性,所以也要普及一下。
下面的这些用法都是摘自阮一峰的博客

3.计算功能

我们可以在SASS中使用计算功能:

body {
   margin: (14px/2);
   top: 50px + 100px;
   right: $var * 10%;
}

4.代码重用

继承

SASS允许一个选择器,继承另一个选择器。比如,现有class1:

.class1 {
  border: 1px solid #ddd;
}

class2要继承class1,就要使用@extend命令:

.class2 {
  @extend .class1;
  font-size:120%;
}
mixin

Mixin有点像C语言的宏(macro),是可以重用的代码块。
使用@mixin命令,定义一个代码块。

  @mixin left {
    float: left;
    margin-left: 10px;
  }

使用@include命令,调用这个mixin。

  div {
    @include left;
  }

mixin的强大之处,在于可以指定参数和缺省值。

  @mixin left($value: 10px) {
    float: left;
    margin-right: $value;
  }

使用的时候,根据需要加入参数:

  div {
    @include left(20px);
  }

下面是一个mixin的实例,用来生成浏览器前缀。

  @mixin rounded($vert, $horz, $radius: 10px) {
    border-#{$vert}-#{$horz}-radius: $radius;
    -moz-border-radius-#{$vert}#{$horz}: $radius;
    -webkit-border-#{$vert}-#{$horz}-radius: $radius;
  }

使用的时候,可以像下面这样调用:

  #navbar li { @include rounded(top, left); }
  #footer { @include rounded(top, left, 5px); }

5.高级用法

条件语句

@if可以用来判断:

  p {
    @if 1 + 1 == 2 { border: 1px solid; }
    @if 5 < 3 { border: 2px dotted; }
  }

配套的还有@else命令

  @if lightness($color) > 30% {
    background-color: #000;
  } @else {
    background-color: #fff;
  }
循环语句

SASS支持for循环:

  @for $i from 1 to 10 {
    .border-#{$i} {
      border: #{$i}px solid blue;
    }
  }

也支持while循环:

  $i: 6;
  @while $i > 0 {
    .item-#{$i} { width: 2em * $i; }
    $i: $i - 2;
  }

each命令,作用与for类似:

  @each $member in a, b, c, d {
    .#{$member} {
      background-image: url("/image/#{$member}.jpg");
    }
  }
自定义函数

SASS允许用户编写自己的函数。

  @function double($n) {
    @return $n * 2;
  }
  #sidebar {
    width: double(5px);
  }

CSS预处理

所以,SASS究竟做到了什么?单从上面的语法来看,SASS不再是像css那样是“不可控制”的装饰语句:
变量,函数,mixin,继承这些都可以让我们少写很多代码,嵌套使机构更加的清晰,计算,高级语法是我们能更方便地控制样式。当然最终目的还是将SASS编译生成css。网上有这样一段话我觉得说的很通俗:
CSS 预处理器是什么?一般来说,它们基于 CSS 扩展了一套属于自己的 DSL,来解决我们书写 CSS 时难以解决的问题:
- 语法不够强大,比如无法嵌套书写导致模块化开发中需要书写很多重复的选择器;
- 没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量的形式重复输出,导致难以维护。

所以这就决定了 CSS 预处理器的主要目标:提供 CSS 缺失的样式层复用机制、减少冗余代码,提高样式代码的可维护性。这不是锦上添花,而恰恰是雪中送炭
一个React项目除了CSS预处理,也会使用CSS Module,刚开始听到这两个词,我根本分不清,所以除了弄懂CSS预处理,CSS Modules也要清楚,这个在其他文章中学习。

本文部分内容摘自阮一峰博客
SASS用法指南

<think>嗯,用户想要了解PWM脉冲宽度调制的相关知识。根据用户提供的引用内容,我需要整合这些信息,全面介绍PWM的原理和应用。 用户引用了四篇材料,分别从不同角度解释了PWM。第一篇是基础定义和应用领域概述;第二篇重点说明数字均值模拟原理;第三篇展示MCU实现案例和计算细节;第四篇提供了硬件描述语言实现范例。这些材料覆盖了PWM的理论基础和工程实践的核心内容。 我可以为用户构建一个完整的知识框架。先从基本原理切入,解释频率和占空比这两个核心参数。频率决定信号周期,占空比决定有效功率比例。然后介绍PWM如何通过开关模式等效模拟电压——这是它最精妙的地方,用数字方式实现模拟控制。 在实现机制部分,可以补充硬件生成原理,比如微控制器的定时器模块如何配合比较寄存器工作。引用3中的舵机控制案例就很典型,展示了16MHz系统时钟下如何计算20ms周期和1.5ms脉宽的具体算法。 应用场景需要分类说明:电机调速和舵机控制属于功率控制类;LED调光展现其平滑调控优势;开关电源则是电能转换的典型应用。最后要提示设计注意事项,比如频率选择需要平衡效率和噪声,H桥电路必须考虑死区时间等安全机制。 技术实现方面,引用4的Verilog代码展示了计数器比较的核心逻辑。这个硬件描述语言案例可以和引用3的C语言配置代码形成对照,说明不同抽象层的实现方式。 </think>下面是对脉冲宽度调制(PWM)的详细介绍,结合核心原理与应用场景: ### 一、PWM基本原理 1. **定义** PWM(Pulse Width Modulation)通过调节数字信号中**高电平持续时间**(脉宽)与**信号周期**的比值来模拟连续变化的模拟量。核心公式: $$ \text{占空比} = \frac{t_{\text{on}}}{T} \times 100\% $$ 其中 $t_{\text{on}}$ 为高电平时间,$T$ 为信号周期。 2. **两个核心参数** - **频率**:$f = \frac{1}{T}$,单位Hz。高频可减少噪声(如电机嗡嗡声),低频可能导致闪烁(如LED调光)。 - **占空比**:控制有效输出功率。占空比越大,等效输出电压越高(图1)。 ![PWM波形示意图](https://example.com/pwm_waveform.png) *图1:不同占空比的PWM波形(0%、25%、50%、75%、100%)[^2]* --- ### 二、硬件实现机制 1. **微控制器(MCU)生成** - 利用**定时器/计数器**模块(如ATmega328P的Timer1) - 配置流程(以舵机控制为例): ```c // 设置快速PWM模式,ICR1定义周期 TCCR1A |= (1 << COM1A1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10); ICR1 = 20000; // 16MHz时钟 → 20ms周期(50Hz) OCR1A = 1500; // 1.5ms脉宽(舵机90°位置) ``` *计算依据:$t_{\text{pulse}} = \frac{\text{OCR1A}}{f_{\text{clk}}}$*[^3] 2. **数字电路实现**(FPGA/ASIC) ```verilog module pwm #(parameter PERIOD=10, HTIME=3) ( input sys_clk, sys_rst_n, output logic o_pwm ); logic [3:0] r_cnt; // 4位计数器 always_ff @(posedge sys_clk) begin r_cnt <= (r_cnt==PERIOD-1) ? 0 : r_cnt+1; o_pwm <= (r_cnt < HTIME) ? 1'b1 : 1'b0; // 比较器控制输出 end endmodule ``` *代码说明:当计数值小于HTIME时输出高电平[^4]* --- ### 三、关键应用场景 | **领域** | **应用实例** | **PWM作用** | |----------------|-----------------------------|--------------------------------| | 电机控制 | 直流电机调速、舵机角度控制 | 调节平均电压控制转速/角度 | | 照明调光 | LED亮度调节 | 改变占空比实现无级调光 | | 电源管理 | 开关电源(Buck/Boost拓扑) | 控制功率器件开关频率稳定输出电压 | | 音频合成 | 数字功放Class D | 通过高频PWM重构模拟音频信号 | --- ### 四、设计注意事项 1. **频率选择** - 电机控制:1kHz-20kHz(避免可闻噪声) - LED调光:>100Hz(消除人眼闪烁感) - 开关电源:数十kHz至MHz(提高功率密度) 2. **死区时间**(H桥驱动) 半桥/全桥电路中需插入微秒级延迟,防止上下管直通短路。MCU需配置死区发生器(如STM32的BDTR寄存器)。 3. **滤波需求** 用于DAC模拟输出时,需RC低通滤波器(截止频率 $f_c = \frac{1}{2\pi RC} \ll f_{\text{PWM}}$)平滑波形。 > **典型问题案例**:某无人机舵机抖动异常 > 原因检测:PWM频率设置为60Hz(非标准50Hz),占空比计算未考虑时钟分频。修正后: > $$ \text{OCR1A} = \frac{t_{\text{pulse}} \times f_{\text{clk}}}{\text{分频系数}} = \frac{1.5\text{ms} \times 16\text{MHz}}{8} = 3000 $$[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值