动态CSS--less
忙了很久终于有时间来写点东西了,不知道大家有没有发现,我们在写CSS的时候总是在重复很多代码,一个相同的属性值往往要重复N次,以前我就经常想有没有什么办法能让我们不用一直重复的font-size啊color啊,直到有了LESS的出现,原来CSS还真的可以这么写的。
在写LESS的时候,我们会用到一些我们以前写CSS时没有用到的概念,比如混合(继承),变量,嵌套,运算,函数。
less文件浏览器是解析不到的,所以我们实际用它的时候要编译让它变成浏览器所认识的CSS,后期维护的时候我们也只是修改less文件然后编译成CSS替换原来的就可以了。less是我们写CSS的一个工具,它不能代替也不能取代CSS,它只是在CSS的基础上更加了动态的特性。less比较适合用在重用性较大的网站,但是很多程序都喜欢它的书写方式。
编译less的方式只要引入了相关的JS脚本(less.js , node.js)那么它就可以在客户端,服务器端中编译,我这里用的是第三种方式:在开发的时候就把less编译成CSS然后直接引入项目中,下面我们来介绍下即时编译less的工具。
首先:介绍下编写和编译less用到的工具,先到官网上下载我们的less编译器koala。下载以后安装,打开软件点击设置选择中文,关闭打开菜单就是中文的了。
二:打开编辑器,我这里用的是sublime_text3,因为sublime_text2写less的时候总是没有反应的,装了sublime_text 3然后安装下less插件。现在我们新建一个文件保存为less后缀名。注意,等下我们编译less的时候CSS文件会放在这个less的同级目录下。
编辑器右下角是less。
然后打开我们的koala软件,把刚建好保存的less文件直接拖进去
然后返回到我们的编辑器去写less。
在koala软件中点击less文件右侧出现菜单,
有个“执行编译按”钮,点击它然后打开我们之前放置less的地方就看到编译后的CSS文件,就算这里我们不点“执行编译”的按钮,在我们把less拖进去然后在编辑器中写less并保存它是自动编译成CSS的,当书写有错误的时候也会即时的提示。这里想说下的是“输出方式”,有两种选择,一种是“normal(正常)”方式,编译后的CSS文件不压缩;"compress(压缩")方式,编译后的CSS文件会压缩--多余的空格删掉并不换。这的选择看个人喜好。建议是选择compress方式,因为我们以后维护直接改less然后编译CSS直接放项目中使用。
三:我们现在开始写less吧
变量:可以让我们在一个地方统一管理这些值,让代码更好的维护。
变量的申明要@字符开头:
如(为了代码更容易看,我下面的输出方式选择normal。)
.less
@color:red; 申明一个颜色是红色的变量,变量名+属性值,申明变量的末尾一定要加上“;”结束。
body{background: @color} 引用变量
编译后.css
body{background:#f00}
.less
@color:red;
.border{color: @color;border: 1px solid @color} 可以多个地方同时引用同一个变量
编译后.css
.border{color:#f00;border:1px solid #f00}
也可以把一个变量作为另一个变量的名字
.less
@color:red;
@color2:@color;
body{background: @color2 }
编译后.css
body {
background: #ff0000;
}
重复申明同名变量后面申明会覆盖前面变量申明,所以申明的变量只能申明一次。
.less
@color:red;
@color2:@color;
@color2:blue;
body{background: @color2 }
编译后.css
body {
background: #0000ff; 结果是蓝色
}
上面的例子我们也只是把变量用在了CSS属性值中,变量还可以用在其他的地方,如选择器的名称,属性名称,URL地址。
变量用作选择器的名称:
.less
@selectname: .box; 声明一个名为selectname的变量,它指代的是“.box”这个类。
@{selectname}{ 注意这里引用的时候“@”字符要 放在外面并且变量名字放在“{}”花括号里面。
background: #000;
width: 100px;
height: 100px;
}
编译后.css
.box {
background: #000;
width: 100px;
height: 100px;
}
变量用作选属性的地址;
.less
@property:font-size; 定义的时候不能属性值和变量值同时存在,只能其一,@size:font-size:18px;
body{ @size }这样的用法是不允许的。
body{
@{property}:100px;注意这里引用的时候“@”字符要 放在外面并且变量名字放在“{}”花括号里面。
}
编译后.css
body {
font-size: 100px;
}
变量用作选URL的地址;
.less
@imgurl: "../images/01.jpg"; 可以直达到它的任意级目录如@imgurl: "../images"; 引用的时候background:
url(@imgurl/01.jpg)
body{
background: url(@imgurl)
}
编译后.css
body {
background: url("../images/01.jpg");
}
变量不一定要先定义才能用,也可以先用了再定义,因为变量都是延时载入的。
下面两段代码是等价的
.less1
@color:red;
@color2:@color;
body{background: @color2 }
.less2
body{background: @color2 }
@color:red;
@color2:@color;
编译后.css一致
body {
background: #ff0000;
}
我们前面说过,当声明同一个变量多次的时候,应用的时候就只会用到最后一次声明的变量。less在找变量的时候都是先从当前的作用域选择当没有找到的时候就继续往上祖先元素中寻找。这个有点像我们脚本的局部变量和全局变量,有局部就用局部没有就去全局。
.less
@size:14px;
body{
@size:16px;
font-size: @size; 会选择离它最近的变量
}
编译后.css
body {
font-size: 16px;
}
定义变量的位置时候在引用前后是没有关系的,只要是当前的,它都会优先考虑。
.less
@size:14px;
body{
font-size: @size;
@size:16px;
}
编译后.css
body {
font-size: 16px;
}
这种优先级也适用于混合
.less
.css{background: red}
.css{background: blue}
body{
.css;
.css{background: yellow}
}
编译后.css
.css {
background: #ff0000;
}
.css {
background: #0000ff;
}
body {
background: #ffff00; 结果为黄色
}
body .css {
background: #ffff00;
}
为啥这里多了一些不想代码? 那是因为没有带括号的混合都会相应的多出一条以这个混合名字为名的类(或者ID)。
注意:后面的同名变量会覆盖(重写)前面的同名变量,那么所有应用这个变量的地方都会被重写。
.less
@basesize: 16px;
@size: @basesize*10;
@basesize: 12px;
body{
font-size: @size;
.box{
font-size: @basesize;
}
}
编译后.css
body {
font-size: 120px;
}
body .box {
font-size: 12px;
}
混合:把classA混合到classB,那么classB就拥有了classA中声明的所有样式。
这个有点像程序中的继承,classB继承了classA的样式,classA是父亲,classB是儿子。
混合也像函数,带参数:引用时据传入不同的参数值来改变里面的属性值 带默认值,引用时有值作为参数传入那么里面的属性值用新值,引用时没有值作为参数传入那么就用默认值;或者不带参数。
在less中运用混合,一般是把一些通用的样式声明为混合,然后在其他地方引用这个混合。
不带参数的混合
.less
.css(){ 混合名字的前面要带“.”或者“#”都是可以 ,分别是类选择器和ID选择器。
background: yellow;
border: 5px solid #000;
}
body{
.css(); 引用的时候可以带括号也可以不带括号,建议都带上。
}
编译后.css
body{background:#ff0;border:5px solid #000}、
这里要说明下的是
声明混合的时候不带括号的情况
.less
.css{ 不带括号的声明
background: yellow;
border: 5px solid #000;
}
body{
.css(); 引用的时候带不带括号结果一样
}
编译后.css
.css {
background: yellow;
border: 5px solid #000;
}
body {
background: yellow;
border: 5px solid #000;
}
会发现body同样拥有了混合名字为.css的所有样式,唯一不同的是多了一个以混合名字为名的类,当混合名字为符号”#“的时候就做了一个以混合名字为名的ID。
#css { 以混合名字为名的ID。
background: yellow;
border: 5px solid #000;
}
body {
background: yellow;
border: 5px solid #000;
}
当我们想用混合里的属性但又不想多出一个样式,带上括号。
带参数不带默认值的混合
.less
.css(@color){ 声明混合时候给一个名为color的变量作为参数
background: @color 里面的用参数作为它的属性值
}
body{
.css(red) 引用的时候传入个新值作为混合.css()的参数,因为是不带默认值并且是需要参数的混合,引用时不传入参数就会报错。
}
编译后.css
body {
background: #ff0000;
}
带参数带默认值的混合
.less
.css(@color:blue){ 在参数的后面带上字符“:”并且在后面给上默认值。当引用的时候没有给混合传入参数的情况下 就会用这里的默认值作为它里面的属性值
background: @color
}
body{
.css() 应用的时候可以给值或参数不给参数,有参数即用新值,没有则用默认值
}
编译后.css
body {
background: #0000ff;
}
带多个参数的时候用“,”或者用“;”分开,建议用“;”
.less
.css(@color:blue;@color2:red;){ 注意了多个参数的时候变量的“;”要改为“,”,最后一个参数可以不给。
background: @color;
border:10px solid @color2;
}
body{
.css(blue)
}
编译后.css
body {
background: #0000ff;
border: 10px solid #ff0000;
}
@arguments
当有很多个参数的时候,我们引用的时候又不想一个一个参数写这样我们就可以用@arguments这个变量代替所有的参数
.less
.css(@border:10px,@color:red,@type:solid,){
border: @arguments; 把所有的参数包含进来,给新值的时候要注意按照声明参数时的顺序
}
body{
.css
}
编译后.css
body {
border: 10px #ff0000 solid; 用的是混合的默认值
}
命名空间:
有的时候我们想把一些样式分成单独的一个模块,其他地方不能使用,也防止了和其他地方的样式有冲突。
.less
#outwarp{ 最外层括号可加可不加,同名ID都不会出现在编译的CSS文件中,但是里面的不加括号就会出现。
.inner1(){
font-size: 10px;
}
.inner2(){
font-size: 20px;
&:hover{
font-size: 202px;
}
.inner3(){
font-size: 30px;
.inner4(){
font-size: 40px;
}
}
}
}
body{
#outwarp .inner1();
.box1{
#outwarp .inner2(); 应用的上级不能给括号
.box3{
#outwarp .inner2.inner3 .inner4();应用的时候必须一级级的把祖先写在前面并且都不能加括号
}
}
.box2{
#outwarp .inner2 .inner3();
}
}
编译后.css
body {
font-size: 10px;
}
body .box1 {
font-size: 20px;
}
body .box1:hover {
font-size: 202px;
}
body .box1 .box3 {
font-size: 40px;
}
body .box2 {
font-size: 30px;
}
!impotant关键字
.less
.css(){
background: #000;
font-size: 12px;
}
body{
.css() !important; 在应用的时候加上!important关键字,那么混合里面的每条规则都会添加上!important;
}
编译后.css
body {
background: #000 !important;
font-size: 12px !important;
}
也可以在写混合的时候单独给一条规则加上!important;
.less
.css(){
background: #000 !important;
font-size: 12px;
}
body{
.css()
}
编译后.css
body {
background: #000 !important;
font-size: 12px;
}
嵌套:这个就有点像我们平常写CSS的后代选择器,用less就会使它更具有模块化维护的时候也很清晰,因为它是和HTML的结构一样。
.less
body{
background: #000;
.border{background: red;width: 100px;height: 100px} HTML的body建一个类为.border的div。
}
编译后.css
body {
background: #000;
}
body .border {
background: red;
width: 100px;
height: 100px;
}
&符号用来代替当前元素的父元素
.less
@color1:red;
@color2:yellow;
body{
.border{
background: @color1;
width: 100px;
height: 100px;
&:hover{ 这里的&符号代替的是类border
background: @color2;
}
}
}
编译后.css
body .border {
background: #ff0000;
width: 100px;
height: 100px;
}
body .border:hover {
background: #ffff00;
}
模式匹配 有的时候我们想写好几条混合,然后后面引用的时候根据传入的参数个数和参数值来确定用哪个混合规则。这个有点像Java里面的方法重载overLoad(一个类中可以定义有相同的名字,但参数(个数,类型)不同的多个方法。调用时,会根据不同的参数选择对应的方法,只要这些方法在调用的时候编译器能区分开来不会造成混淆,就构成重载)
根据传入参数个数匹配混合
.less
.mixin(@color){ 匹配一个参数
background: @color;
}
.mixin(@color,@color2){ 匹配两个参数
color: @color ;
background: @color2;
width: 100px;
height: 100px;
}
body{
.mixin(red) 一个参数匹配第一条.mixin
}
.border{
.mixin(yellow,blue) 匹配第二条.mixin
}
编译后.css
body {
background: #ff0000;
}
.border {
color: #ffff00;
background: #0000ff;
width: 100px;
height: 100px;
}
带有常量的匹配混合 只接受变量作为第一个参数才能匹配
.less
.mixin (dark, @color) {
border:10px solid darken(@color, 10%);
}
body{
.mixin(dark,red) 要满足两个条件第一个是dark 第二个是颜色值才匹配。
}
编译后.css
body {
border: 10px solid #cc0000;
}
body{border:@px+20 solid red;} less能自动匹配单位,这里是PX
border: 30px solid #ff0000; 结果是10+20=30px
}
body{background: @color+2 }
编译后.css
body {
background: #862412;
}
引导
动态CSS--less的更多相关文章
- dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来
dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...
- LESS是一个CSS预处理器,跨浏览器友好,提供诸如变量,函数, mixins 和操作等功能,可以构建动态CSS
什么是LESS? LESS是一个CSS预处理器,可以为网站启用可自定义,可管理和可重用的样式表. LESS是一种动态样式表语言,扩展了CSS的功能. LESS也是跨浏览器友好. CSS预处理器是一种脚 ...
- YUI 阻止动态css加载
skinnable动态加载 在YUI Module中,经常采用skinnable参数来动态加载css,如: YUI().use('w-paginator', function(Y) { }, requ ...
- 高大上的动态CSS
项目里要添加 custom css 功能 (dynamic stylesheet ),总结一下实现方法. 1.在JSP中动态设定文件path 预先生成一些css文件,由用户选择,在jsp被请求时,动态 ...
- CSS系列——前端进阶之路:初涉Less
前言:最近帮一个朋友解决点问题,在查看组件源码的时候涉及到了less语法,这可难倒博主了.没办法,既然用到就要学呗,谁让咱是无所不能的程序猿呢!所以今天来学习下Less,算是笔记,也希望给初学less ...
- 利用CSS预处理技术实现项目换肤功能(less css + asp.net mvc4.0 bundle)
一.背景 在越来越重视用户体验的今天,换肤功能也慢慢被重视起来.一个web系统用户可以选择一个自己喜欢的系统主题,在用户眼里还是会多少加点分的.我们很开心的是easyui v1.3.4有自带defau ...
- 6种编写HTML和CSS的最有效的方法
感谢HTML5和CSS3,以及JavaScript,前端开发者有了大大的用武之地.大家都在用很多的工具和技术来武装自己,以加快前段的开发. 本文分享了6中最有效的方法,希望能提供你的效率,为你节约时间 ...
- CSS选择器4是下一代CSS选择器规范
那么,这一版本的新东西有哪些呢? 选择器配置文件 CSS选择器分为两类:快速选择器和完整选择器.快速选择器适用于动态CSS引擎.完整选择器适用于速度不占关键因素的情况,例如document.query ...
- WEB前端性能优化之二——css优化
1.把样式表置于顶部 现把样式表放到文档的< head />内部似乎会加快页面的下载速度.这是因为把样式表放到< head />内会使页面有步骤的加载显示.HTML规范清 楚指 ...
- 学习笔记1--响应式网页+Bootstrap起步+全局CSS样式
一.学习之前要了解一些背景知识: 在2g时代,3g时代,4g时代,早期的网页浏览设备,功能机,智能机.(本人最喜欢的透明肌,和古典黑莓机) 1.什么是响应式网页? Responsive Web Pag ...
随机推荐
- 设置 textarea 默认滑动到底部
javascript: var textarea = document.getElementById('textarea_id'); textarea.scrollTop = textarea.scr ...
- jQuery 遍历函数(w3school)
jQuery 遍历函数包括了用于筛选.查找和串联元素的方法. 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集合中. .childr ...
- weblogic从应用服务器找不到主应用服务器
报错信息: weblogic.cluster.replication.ApplicationUnavailableException: WebApp with contextPath: not fou ...
- Meisell-Lehmer算法(统计较大数据里的素数)
http://acm.hdu.edu.cn/showproblem.php?pid=5901 1e11的数据量,这道题用这个算法花了202ms. #include<bits/stdc++.h&g ...
- ecshop发票不能使用出现flow.php on line 723等报错
最模板给客户ecshop网站做编码转换出现个问题,网站在点结算页面出现Warning: Invalid argument supplied for foreach flow.php on line 7 ...
- js中字符串转换为数字的方法
parseInt; parseFload; +; parseInt() 和 parseFloat() 函数会尝试逐个解析字符串中的字符,直到遇上一个无法被解析成数字的字符,然后返回该字符前所有数字字符 ...
- 20150625_Andriod_01_ListView1_条目显示
android listview 参考地址: http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html http://xy ...
- 文件映射mmap
磁盘与内存的映射就是文件映射,说这个问题之前我们先说下swap,因为 这个问题让我很容易想起swap,linux swap 是交换分区的意思,在内存不 够的情况下,操作系统先把内存与磁盘的sw ...
- Web项目后台测试流程
1. 本地下载项目源码 1. Git clone项目代码到本地(本地项目代码1)并fetch: 2. Switch到master分支: 3. Create测试分支(例如:test1)并勾选“Switc ...
- linq的简单查询 和 组合查询
以Car表和Brand表为例,其中Car表的Brand是Brand表的Brandcode. (1)建立两表的linq(一定要做好主外键关系,),创建之后不用修改,如要添加,另建文件. (2)Car表的 ...