某一天,一个头条的大佬问我,据说你之前在项目内里弄过主题切换,你当时是怎样完成的能够详说一下吗?
假如已对less管窥蠡测,直接从这里最先。
从less提及
运用
Node.js 环境中运用 Less :
npm install -g less
> lessc styles.less styles.css
在浏览器环境中运用 Less :
<link rel="stylesheet/less" type="text/css" href="styles.less" />
<script src="//cdnjs.cloudflare.com/ajax/libs/less.js/3.8.1/less.min.js" ></script>
不过比较引荐的照样经由过程webpack或许gulp等东西先将less编译成css,然后再引入运用。
变量
@nice-blue: #5B83AD;
@light-blue: @nice-blue + #111;
#header {
color: @light-blue;
}
夹杂
经常使用
.bordered { border-top: dotted 1px black; &:hover { border: 1px solid red; } // 一样能够包括选择器混用 } .post a { color: red; .bordered !important; // 能够在属性背面都加上!important }
编译后不输出至css文件
.my-other-mixin() { background: white; }
作用域夹杂
#outer { .inner() { color: red; } } #outer1 { .inner() { color: blue; } } .c { #outer > .inner; }
输出
.c { color: red; }
具有前置条件的作用域夹杂,更多概况
@mode: little; #outer when (@mode=huge) { .inner { color: red; } } #outer when (@mode=little) { .inner { color: blue; } } .c { #outer > .inner; }
输出(能够看到没有经由过程前置条件的款式被过滤了)
#outer .inner { color: blue; } .c { color: blue; }
带参数夹杂,能够指定默许值,能够带多个参数,运用时能够经由过程称号赋值
.mixin(@color: black; @margin: 10px; @padding: 20px) { color: @color; margin: @margin; padding: @padding; } .class1 { .mixin(@margin: 20px; @color: #33acfe); } .class2 { .mixin(#efca44; @padding: 40px); }
运用
@arguments
.mixin(@a; @b) { margin: @arguments; right:extract(@arguments,2); top:@b; } p {.mixin(1px; 2px);}
输出
p { margin: 1px 2px; right: 2px; top: 2px; }
运用
@rest
参数// 体式格局1 .mixin(@listofvariables...) { border: @listofvariables; } p { .mixin(1px; solid; red); } // 体式格局2 .mixin(@a; ...) { color: @a;} .mixin(@a) { background-color: contrast(@a); width:100%;} .mixin(@a; @b;) { background-color: contrast(@a); width:@b;} p { .mixin(red); } p.small { .mixin(red,50%); }
输出
/*体式格局1*/ p { border: 1px solid red; } /*体式格局2*/ p { color: red; background-color: #ffffff; width: 100%; } p.small { color: red; background-color: #ffffff; width: 50%; }
形式婚配夹杂
.mixin(dark; @color) { color: darken(@color, 10%); } .mixin(light; @color) { color: lighten(@color, 10%); } .mixin(@_; @color) { display: block; } @switch: light; .class { .mixin(@switch; #888); }
输出
.class { color: #a2a2a2; display: block; }
划定规矩集夹杂
// declare detached ruleset @detached-ruleset: { background: red; }; // use detached ruleset .top { @detached-ruleset(); }
函数
相似于先函数运算计算出变量的值,再经由过程变量的值设置属性。
.mixin() {
@width: 100%;
@height: 200px;
}
.caller {
.mixin();
width: @width;
height: @height;
}
输出
.caller {
width: 100%;
height: 200px;
}
继续
继续别的一个选择器的属性,更多概况
nav ul {
&:extend(.inline);
background: blue;
} // &是父范例选择器,指代的是nav ul
.inline {
color: red;
}
输出
nav ul {
background: blue;
}
.inline,
nav ul {
color: red;
}
嵌套
#header {
color: black;
.navigation {
font-size: 12px;
}
.logo {
width: 300px;
}
}
引入
@import "foo"; // foo.less is imported
@import "foo.less"; // foo.less is imported
@import "foo.php"; // foo.php imported as a less file
@import "foo.css"; // statement left in place, as-is
参数
@import (keyword) "filename";
-
reference
: use a Less file but do not output it -
inline
: include the source file in the output but do not process it -
less
: treat the file as a Less file, no matter what the file extension -
css
: treat the file as a CSS file, no matter what the file extension -
once
: only include the file once (this is default behavior) -
multiple
: include the file multiple times -
optional
: continue compiling when file is not found
轮回
.generate-columns(4);
.generate-columns(@n, @i: 1) when (@i =< @n) {
.column-@{i} {
width: (@i * 100% / @n);
}
.generate-columns(@n, (@i + 1));
}
输出
.column-1 {
width: 25%;
}
.column-2 {
width: 50%;
}
.column-3 {
width: 75%;
}
.column-4 {
width: 100%;
}
兼并
逗号兼并
.mixin() { box-shadow+: inset 0 0 10px #555; } .myclass { .mixin(); box-shadow+: 0 0 20px black; }
输出
.myclass { box-shadow: inset 0 0 10px #555, 0 0 20px black; }
空格兼并
.mixin() { transform+_: scale(2); } .myclass { .mixin(); transform+_: rotate(15deg); }
输出
.myclass { transform: scale(2) rotate(15deg); }
切换主题款式
计划1
当几种主题规划相似,险些只是色彩差别时,能够运用这类。
经由过程对less的相识(能够举行很多分外的骚操纵哦),我们这里最简朴地编写出以下less文件。
- 基本款式模版
style.less
,内里重要经由过程变量设置各个款式 - 爱国红款式
patriotic-red.less
,设置变量的值 - 天空蓝款式
sky-blue.less
,设置差别的变量值 - …
style.less
里款式相似如许
a,
.link {
color: @link-color;
}
a:hover {
color: @link-color-hover;
}
.widget {
color: #fff;
background: @link-color;
}
patriotic-red.less
里款式相似如许
@import "style";
@link-color: #f03818;
@link-color-hover: darken(@link-color, 10%);
sky-blue.less
里款式相似如许
@import "test";
@link-color: #428bca;
@link-color-hover: darken(@link-color, 10%);
应用相干东西(或原始人手动lessc)提早编译成patriotic-red.css
和sky-blue.css
文件。
这里简朴的假定页面header中只引入了默许爱国红——
<link rel="stylesheet" href="./patriotic-red.css" />
同时存在一个按钮,用户点击时切换主题。起首我们给按钮绑定点击事宜,当用户点击时删除当前导入的款式,然后再引入别的一个款式。详细操纵以下:
function toggleThemeClick() {
let a = document.getElementsByTagName("link");
let aHref = a[0].getAttribute("href").slice(2, -4);
a[0].parentElement.removeChild(a[0]);
let b = document.createElement("link");
b.setAttribute("rel", "stylesheet");
if ("patriotic-red" === aHref) {
b.setAttribute("href", "./sky-blue.css");
} else {
b.setAttribute("href", "./patriotic-red.css");
}
document.getElementsByTagName("head")[0].appendChild(b);
}
如许我们就能够自在的切换主题啦。
计划2
我们还能够经由过程给body增加类标签来举行主题的切换。
新建一个style-mixin.less
,内里内容以下——
.patriotic-red {
@import "patriotic-red";
}
.sky-blue {
@import "sky-blue";
}
这里须要注重的是,在sky-blue.less
或许patriotic-red.less
中引入style.less
时,须要运用(multiple)
参数,否则会只编译出一份款式。编译出来的款式会自动加上.patriotic-red
和sky-blue
前缀。
这个时刻只须要引入一份style-mixin.css
就好了,要切换款式的时刻修正body的类标签。
document,getElementsByTagName('body')[0].className='xxx'
题外话
头条大佬好像并非很承认计划1,他以为计划1会致使之前引入的款式和厥后的争执?我没有邃晓详细是什么意义,因为时候关联他也没有诠释得很清晰,愿望晓得题目出在那里的同砚告诉我一下哦。
ps,有无更好的切换主题的计划呢,求大佬指导~