diff --git "a/\347\216\213\345\211\221\347\247\213/Less\351\242\204\347\274\226\350\257\221\345\267\245\345\205\267.md" "b/\347\216\213\345\211\221\347\247\213/Less\351\242\204\347\274\226\350\257\221\345\267\245\345\205\267.md"
new file mode 100644
index 0000000000000000000000000000000000000000..dc963f756e7535b6cda2220346fb86de68459c09
--- /dev/null
+++ "b/\347\216\213\345\211\221\347\247\213/Less\351\242\204\347\274\226\350\257\221\345\267\245\345\205\267.md"
@@ -0,0 +1,1100 @@
+# Less
+
+## 简介
+
+ Less是Leaner Style Sheets的缩写,它是一个CSS的预编译器,可以为网站启用可自定义,可管理和可重用的样式表。让CSS代码更易于维护和拓展。
+
+## 安装
+
+ 可以通过npm安装
+
+```shell
+npm install less -g
+```
+
+ 也可以通过引用来使用less
+
+```html
+
+
+```
+
+## 与传统的写法区别
+
+ **less后缀为.less**
+
+ **less有两种注释方式**:
+
+- // 这种方式并不会编译到CSS文件
+- /* 这种注释方式会编译到CSS文件上 */
+
+ **less需要编译成CSS才可以使用**
+
+## 嵌套
+
+### less中的嵌套类似HTML的结构,使CSS代码更加清晰易懂
+
+```css
+/*css写法*/
+div{
+ font-size:14px;
+}
+div p{
+ margin:0 auto;
+}
+div p a{
+ color:red;
+}
+```
+
+```less
+/*less的写法*/
+div{
+ font-size:14px;
+ p{
+ margin:0 auto;
+ a{
+ color:red;
+ }
+ }
+}
+```
+
+
+
+### 使用父元素选择符&表示当前选择器的所有父选择器
+
+```css
+/*css写法*/
+.bgcolor{
+ background:#fff;
+}
+.bgcolor a{
+ color:#888888
+}
+.bgcolor a:hover{
+ color:#ff6600
+}
+```
+
+```less
+/*less写法*/
+.bgcolor{
+ background:#fff;
+ a{
+ color:#888888;
+ &:hover{
+ color:#ff6600;
+ }
+ }
+}
+```
+
+### 将&放到当前选择器之后,会将当前选择器移到最前面
+
+```less
+ul{
+ li{
+ .color &{
+ background:#fff;
+ }
+ }
+}
+```
+
+```css
+/*编译的结果*/
+.color ul li{
+ background:#fff;
+}
+```
+
+### 组合使用,将生成所有可能的选择器列表
+
+```less
+.div1,.div2{
+ color:red{
+ &&{
+ border-top:1px solid blue;
+ }
+ }
+}
+```
+
+```css
+/*编译的结果*/
+.div1,.div2{
+ color:red;
+}
+.div1,.div2,
+.div2,.div1,
+.div1,.div2,
+.div2,.div2{
+ border-top:1px solid blue;
+}
+```
+
+## 变量
+
+### 变量的定义和使用
+
+#### 定义:@name:value;(black:#000;)
+
+#### 三种使用场合:
+
+```less
+/*1、常规使用*/
+@black:#000000;
+div{
+ color:@black;
+}
+```
+
+```css
+/*编译结果*/
+div{
+ color:#000000;
+}
+```
+
+----------------------------
+
+```less
+/*2、作为选择器或属性名*/
+@selName:container;
+@proName:width;
+.@{selName}{
+ @{proName}:100px;
+}
+```
+
+```css
+/*编译后结果*/
+.container{
+ width:100px;
+}
+```
+
+------------------
+
+```less
+/*作为URL*/
+@imgUrl:"./images/logo.png";
+div{
+ background:#FFF url("@{imgUrl}")
+}
+```
+
+```css
+/*编译结果*/
+div{
+ background:#FFF url(".images/logo.png")
+}
+```
+
+### 注意事项:
+
+#### 1、变量是延迟加载的,可以不预先声明
+
+```less
+div{
+ color:@black
+}
+@black:#000000
+```
+
+```css
+/*编译结果*/
+div{
+ color:#000000
+}
+```
+
+#### 2、变量的作用域
+
+ 如果在当前的作用域没有找到,将会往上找,这点类似js
+
+ 如果在某级作用域找到多个形同名称的变量,使用最后定义的那一个,类似css
+
+```less
+@var:0;
+.class{
+ @var:1;
+ .brass{
+ @var:2;
+ three:@var;
+ @var:3;
+ }
+ one:@var;//无法访问。brass的内部
+}
+```
+
+```css
+/*编译结果*/
+.class{
+ one:1;
+}
+.class .brass{
+ three:3;/*时候最后定义的变量*/
+}
+```
+
+## 混合
+
+ 混合是一种将一系列属性从一个规则集引入到另一个规则集的方式
+
+### 普通混合
+
+```less
+.border{
+ border-top:solid 1px black;
+ border-bottom:solid 2px black;
+}
+#menu a{
+ color:#eee;
+ .border;
+}
+```
+
+```css
+/*编译结果*/
+.border{
+ border-top:solid 1px black;
+ border-buttom:solid 2px black;
+}
+#menu a{
+ color:#eee;
+ border-top:solid 1px black;
+ border-top:solid 2px black;
+}
+```
+
+### 不带任何参数的混合
+
+```less
+/*加括号但不带参数的混合*/
+.border(){
+ border-top:solid 1px black;
+ border-bottom:solid 2px black;
+}
+#menu a{
+ color:#eee;
+ .border;
+}
+```
+
+```css
+/*编译结果*/
+#menu a{
+ color:#eee;
+ border-top:solid 1px black;
+ border-bottom:solid 2px black;
+}
+```
+
+### 带参数的混合
+
+```less
+.border(@color){
+ border-top:solid 1px @color;
+ border-bottom:solid 2px @color;
+}
+#menu a{
+ color:#eee;
+ .border(#fff);
+}
+```
+
+```css
+/*编译结果*/
+#menu a{
+ color:#eee;
+ border-top:solid 1px #ffffff;
+ border-bottom:solid 2px #ffffff;
+}
+```
+
+### 带参数且有默认值的混合
+
+```less
+.border(@color: #fff) {
+ border-top: solid 1px @color;
+ border-bottom: solid 2px @color;
+}
+#menu a {
+ color: #eee;
+ .border;
+}
+#menu p {
+ .border(#000);
+}
+```
+
+```css
+/*编译结果*/
+#menu a {
+ color: #eee;
+ border-top: solid 1px #ffffff;
+ border-bottom: solid 2px #ffffff;
+}
+
+#menu p {
+ border-top: solid 1px #000000;
+ border-bottom: solid 2px #000000;
+}
+```
+
+### 带多个参数
+
+ 带多个参数时,参数之间可以用分号或逗号分隔
+
+```less
+//less编写
+.mixin(@color, @padding: xxx, @margin: 2) {
+ color-3: @color;
+ padding-3: @padding;
+ margin: @margin @margin @margin @margin;
+}
+
+.div {
+ .mixin(1,2,3; something, ele); //2个参数
+}
+.div1 {
+ .mixin(1,2,3); //3个参数
+}
+.div2 {
+ .mixin(1,2,3; ); //1个参数
+}
+```
+
+```css
+/*编译结果*/
+.div {
+ color-3: 1, 2, 3;
+ padding-3: something, ele;
+ margin: 2 2 2 2;
+}
+.div1 {
+ color-3: 1;
+ padding-3: 2;
+ margin: 3 3 3 3;
+}
+.div2 {
+ color-3: 1, 2, 3;
+ padding-3: xxx;
+ margin: 2 2 2 2;
+}
+```
+
+### 定义多个相同名称的混合
+
+```less
+.mixin(@color) {
+ color-1: @color;
+}
+.mixin(@color; @padding: 2) {
+ color-2: @color;
+ padding-2: @padding;
+}
+.mixin(@color; @padding: 3; @margin) {
+ color-3: @color;
+ padding-3: @padding;
+ margin: @margin @margin @margin @margin;
+}
+
+.some .selector div {
+ .mixin(#008000); //第二个mixins也被调用了,因为 @padding 有默认值
+}
+
+.some .selector p {
+ .mixin(#008000, 5); //只有第二个mixins被调用
+}
+```
+
+```css
+.some .selector div {
+ color-1: #008000;
+ color-2: #008000;
+ padding-2: 2;
+}
+.some .selector p {
+ color-2: #008000;
+ padding-2: 5;
+}
+```
+
+### 命名参数
+
+ 引用mixin时可以通过参数名称而不是参数的位置来为mixin提供参数值,任何参数都通过名称来引用,这样就不必按照特定的顺序来使用参数
+
+```less
+.mixin(@color: black; @margin: 10px; @padding: 20px) {
+ color: @color;
+ margin: @margin;
+ padding: @padding;
+}
+.class1 {
+ .mixin(@margin:20; @color: #33acfe);
+}
+.class2 {
+ .mixin(#efca44; @padding: 40px);
+}
+```
+
+```css
+/*编译结果*/
+.class1 {
+ color: #33acfe;
+ margin: 20px;
+ padding: 20px;
+}
+.class2 {
+ color: #efca44;
+ margin: 10px;
+ padding: 40px;
+}
+```
+
+### @arguments变量
+
+ @atguments变量表示所有可变参数
+
+ 参数的先后顺序就是括号内的顺序,在赋值时,值的位置和个数也是一一对应的
+
+ 只有一个值,把值赋给第一个;两个值,赋给第一个和第二个
+
+ 若想赋给第一个和第三个,必须把第二个参数的默认值写上
+
+```less
+.border(@x: solid, @c: red) {
+ border: 21px @arguments;
+}
+.div1 {
+ .border;
+}
+.div2 {
+ .border(solid, black)
+}
+```
+
+```css
+/*编译结果*/
+.div1 {
+ border: 21px solid #ff0000;
+}
+.div2 {
+ border: 21px solid #000000;
+}
+```
+
+### 匹配模式
+
+ 自定义一个字符,使用时加上那个字符,就调用相应的规则
+
+```less
+.border(all, @w: 5px) {
+ border-radius: @w;
+}
+.border(t_l, @w: 5px) {
+ border-top-left-radius: @w;
+}
+.border(b_l, @w: 5px) {
+ border-bottom-left-radius: @w;
+}
+.border(b_r, @w: 5px) {
+ border-bottom-right-radius: @w;
+}
+
+.border {
+ .border(all, 50%);
+}
+```
+
+```css
+/*编译结果*/
+.border {
+ border-radius: 50%;
+}
+```
+
+### 得到混合中变量的返回值
+
+```less
+.average(@x, @y) {
+ @average((@x + @y)/2);
+}
+
+div {
+ .average(16px, 50px);
+ padding: @average;
+}
+```
+
+```css
+//编译结果
+div {
+ padding: 33px;
+}
+/*
+1、将16px 和 50px 赋值给混合 .average进行计算
+2、计算结果赋值给变量 @average
+3、然后在div中调用@average的值
+4、编译后就得到了average的值33px
+*/
+```
+
+## 运算
+
+任何数值、颜色和变量都可以进行计算
+
+### 数值类运算
+
+ less会自动推算数值的单位,不必每个值都加上单位
+
+ 运算符之间必须以空格分开,存在优先级问题时注意使用括号
+
+```less
+.wp {
+ width: (450px - 50)*2;
+}
+```
+
+```css
+/*编译结果*/
+.wp {
+ width: 900px;
+}
+```
+
+### 颜色值运算
+
+```less
+.content {
+ color: #000000 + 8;
+}
+
+//rgb(0,0,0) + 8
+//rgb(8,8,8)
+//十六进制:#080808
+```
+
+```css
+/*编译结果*/
+.content {
+ color: #080808;
+}
+```
+
+## 命名空间
+
+ 有的时候混合中嵌套了比较多的规则,而我们只需要其中的一部分,可以使用命名空间获取
+
+### 使用“>”符号
+
+```less
+//混合集
+#bgcolor() {
+ background: #fff;
+ .a() {
+ color: #888;
+ &:hover {
+ color: #ff6600;
+ }
+ .b() {
+ background: #ff0000;
+ }
+ }
+}
+
+.bgcolor1 {
+ background: #fdfee0;
+ #bgcolor>.a; //只使用.a()
+}
+.bgcolor2 {
+ #bgcolor>.a>.b; //只使用.b()
+}
+```
+
+```css
+/*编译结果*/
+.bgcolor1 {
+ background: #fdfee0;
+ color: #888;
+}
+.bgcolor1:hover {
+ color: #ff6600;
+}
+.bgcolor2 {
+ background: #ff0000;
+}
+```
+
+### 省略“>”符号,使用空格
+
+```less
+//混合集
+#bgcolor() {
+ background: #fff;
+ .a() {
+ color: #888;
+ &:hover {
+ color: #ff6600;
+ }
+ .b() {
+ background: #ff0000;
+ }
+ }
+}
+
+.bgcolor1 {
+ background: #fdfee0;
+ #bgcolor .a; //只使用.a()
+}
+.bgcolor2 {
+ #bgcolor .a .b; //只使用.b()
+}
+```
+
+```css
+/*编译结果*/
+.bgcolor1 {
+ background: #fdfee0;
+ color: #888;
+}
+.bgcolor1:hover {
+ color: #ff6600;
+}
+.bgcolor2 {
+ background: #ff0000;
+}
+```
+
+## 引入
+
+ 引入一个或多个文件,这些文件定义的规则可在当前less文件中使用
+
+ 使用@import
+
+```less
+//main.less
+@wp: 960px;
+.color {
+ color: #fff;
+}
+
+//当前less文件
+@import "main"; //可以不加后缀
+.content {
+ width: @wp;
+}
+```
+
+```css
+/*编译结果*/
+.color {
+ color: #fff
+}
+.content {
+ width: 960px;
+}
+```
+
+### 引入css文件
+
+ 不能混合css的规则到项目中,编译后原样输出"@import xxx.css"
+
+ 引入时不能省略后缀名
+
+```less
+//main.css
+.color {
+ color: #ff6600;
+}
+
+@import "main.css" ;
+.content {
+ width: @wp;
+ height: @wp;
+}
+```
+
+```css
+/*编译结果*/
+@import "main.css"; //原样输出,但有效,css有这条语句
+.content {
+ width: 960px;
+ height: 960px;
+}
+```
+
+### 单参数的引入
+
+#### once:默认,只引入一次
+
+#### reference:使用less文件但不输出
+
+```less
+@wp: 960px;
+.color {
+ color: #fff;
+}
+
+//当前less文件
+@import (reference) "main";
+.content {
+ width: @wp;
+}
+```
+
+```css
+/*编译结果*/
+.content {
+ width: 960px;
+}
+```
+
+#### inline:在输出中包含less文件但是不能操作
+
+```less
+@wp: 960px;
+.color {
+ color: #fff;
+}
+
+//当前less文件
+@import (inline) "main";
+.content {
+ width: @wp;
+}
+```
+
+```css
+/*编译结果*/
+@wp: 960px; //报错,@wp未知
+.color {
+ color: #fff;
+}
+```
+
+#### less:将文件作为less文件对象,无论什么文件拓展名
+
+```less
+//main.css文件
+.color {
+ color: #ff6600;
+}
+
+//当前less
+@import (less) "main.css";
+ .content {
+.color;
+}
+```
+
+```css
+/*编译结果*/
+.color {
+ color: #ff6600;
+}
+.content {
+ color: #ff6600;
+}
+```
+
+#### css:将文件作为css文件对象,无论什么文件拓展名
+
+```less
+//当前less文件
+@import (css) "main.less";
+.content {
+ color: red;
+}
+```
+
+```css
+/*编译结果*/
+@import "main.less";
+.content {
+ color: red;
+}
+```
+
+#### multiple:允许引入多次相同文件名的文件
+
+```less
+//当前less
+@import (multiple) "main.less";
+@import (multiple) "main.less";
+@import (multiple) "main.less";
+.content {
+ width: @wp;
+}
+```
+
+```css
+/*编译结果*/
+.color {
+ color: #fff;
+}
+.color {
+ color: #fff;
+}
+.color {
+ color: #fff;
+}
+.content {
+ width: 960px;
+}
+```
+
+## !important
+
+ 提升权重优先级为最高
+
+ 在调用的混合集后面追加!important关键字,混合集中所有属性都继承!important
+
+```less
+.foo(@bg: #fdfdfd, @color: #900) {
+ background: @bg;
+ color: @color;
+}
+
+.important {
+ .foo() !important
+}
+```
+
+```css
+/*编译结果*/
+.important {
+ background: #fdfdfd !important;
+ color: #990000 !important;
+}
+```
+
+## 条件表达式
+
+### 带条件的混合
+
+ 比较运算符:>,>=,=,=<,<
+
+ 格式:when(){ }
+
+```less
+// lightness() 是检测亮度的函数,用%度量
+.mixin(@a) when(lightness(@a) >= 50% ) {
+ background-color: black;
+}
+.mixin(@a) when(lightness(@a) < 50% ) {
+ background-color: white;
+}
+
+.mixin(@a) {
+ color: @a;
+}
+.class1 {
+ .mixin(#ddd);
+}
+.class2 {
+ .mixin(#555);
+}
+```
+
+```css
+/*编译结果*/
+.class1 {
+ background-color: black;
+ color: #dddddd;
+}
+.class2 {
+ background-color: white;
+ color: #555555;
+}
+```
+
+### 类型检测函数
+
+ iscolor
+
+ isnumber
+
+ isstring
+
+ iskeyword
+
+ isurl
+
+```less
+.mixin(@a: #fff; @b: 0) when(isnumber(@b)) {
+ color: @a;
+ font-size: @b;
+}
+.mixin(@a; @b: black) when(iscolor(@b)) {
+ font-size: @a;
+ color: @b;
+}
+```
+
+### 单位检测函数
+
+ 检测一个值除了数字是否是一个特定的单位
+
+ ispixel
+
+ ispercentage
+
+ isem
+
+ isunit
+
+```less
+.mixin(@a) when(ispixel(@a)) {
+ width: @a;
+}
+.mixin(@a) when(ispercentage(@a)) {
+ width: @a;
+}
+
+.class1 {
+ .mixin(960px);
+}
+.class2 {
+ .mixin(95%);
+}
+```
+
+```css
+/*编译输出*/
+.class1 {
+ width: 960px;
+}
+.class2 {
+ width: 95%;
+}
+```
+
+## 循环
+
+ 混合可以调用自身,当一个混合递归调用自身就构成循环结构
+
+```less
+.loop(@counter) when(@counter > 0) {
+ .h@{counter} {
+ padding: (10px*@counter);
+ }
+ .loop((@counter - 1)); //递归调用自身
+}
+div{
+ .loop(5);
+}
+```
+
+```css
+/*编译结果*/
+div .h5 {
+ padding: 50px;
+}
+div .h4 {
+ padding: 40px;
+}
+div .h3 {
+ padding: 30px;
+}
+div .h2 {
+ padding: 20px;
+}
+div .h1 {
+ padding: 10px;
+}
+```
+
+## 合并属性
+
+ 将多条规则合并为一条
+
+### 方式一
+
+ 在需要合并的属性的冒号之前加上"+",合并后用逗号分隔
+
+```less
+.mixin() {
+ box-shadow+: inset 0 0 10px #555;
+}
+.myclass {
+ .mixin;
+ box-shadow+: 0 0 20px black;
+}
+```
+
+```css
+/*编译结果*/
+.myclass {
+ box-shadow: inset 0 0 10px #555, 0 0 20px black; //逗号分隔两个属性值
+
+```
+
+### 方式二
+
+ 在需要合并的属性的冒号之前加上"+_",合并后用逗号分隔
+
+```less
+.mixin() {
+ background+_: #f66;
+ background+_: url("/sss.jpg")
+}
+
+.class {
+ .mixin;
+}
+```
+
+```css
+/*编译结果*/
+.class {
+ background: #f66 url("/sss.jpg"); //空格分隔
+}
+```
+
+### 两种方式相结合
+
+```less
+.mixin() {
+ background+_: #f66;
+ background+: url("/sss.jpg");
+ background+_: no-repeat;
+ background+: center;
+}
+.class {
+ .mixin;
+}
+
+```
+
+```css
+/*编译结果*/
+.class {
+ background: #f66, url("/sss.jpg") no-repeat, center;
+}
+```
+
+## 函数库
+
+ less中封装了非常多函数库,例如颜色定义、颜色操作、颜色混合、字符串处理等等
+
+ 例如color():用于解析颜色,将代表颜色的字符串转换为颜色值
+
+```less
+body {
+ color: color("#f60");
+ background: color("red");
+}
+```
+
+```css
+/*编译结果*/
+body {
+ color: #ff6600;
+ background: #ff0000;
+}
+```
+