解析Angular 2+ 样式绑定方式


Posted in Javascript onJanuary 15, 2018

引言

开发ngx(angular 2+ 以后都直接称为ngx)也有1年半的时间了,刚开始开发的时候使用的还是angular2 RC版,现在已经出angular5了,时光飞逝啊!

ngx从设计之初就是一个component-based的框架,所以大到一个页面,小到一个按钮,都是一个component。

这就涉及到了组件的重用,设计通用组件的时候,必不可少的就是动态的样式绑定。

回头想想, angular还真是给我们提供了好几种属性绑定的方式呢。

接下来我们就来具体看看如果在组件中使用样式绑定。

style binding

[style.propertyName]

我们有一个button,默认的样式是bootstrapprimary,

假如在不同的页面中按钮的大小要不同,这个时候就需要动态绑定button的字体大小,可以使用[style.propertyName]来实现。

template中代码

<button 
  class="btn btn-primary" 
  [style.fontSize]="fontSize">
  Style Binding
</button>

Component类中代码

private fontSize: string = "2em";

结果如图:

解析Angular 2+ 样式绑定方式

假如我们还需要动态设置button的边框半径border-radius

template中代码则变为:

<button 
  class="btn btn-primary" 
  [style.fontSize]="fontSize"
  [style.borderRadius]="borderRadius">
  Style Binding
</button>

Component类中代码则变为:

private fontSize: string = "2em";
private borderRadius: string = "10px";

则结果变成:

解析Angular 2+ 样式绑定方式

使用[style.propertyName]来绑定样式属性固然不粗,可是一旦有新的需求,我们就需要继续加上我们需要绑定的属性, 这个时候组件上绑定的属性就会越来越多,我们有没有办法来创建一个object来存储我们需要绑定的属性呢? 当然有,[ngStyle]就可以帮我们来做这件事情。

[ngStyle]

所以上面的例子,我们就可以直接使用[ngStyle]来动态绑定button的font-sizeborder-radius

template中的代码则变为:

<button 
  class="btn btn-primary" 
  [ngStyle]="btnStyle" >
  Style Binding
</button>

Component类的代码则变为:

private btnStyle: any = {
  borderRadius: "10px",
  fontSize: "2em"
};

结果为:

解析Angular 2+ 样式绑定方式

[style.propertyName] vs. [ngStyle]

[style.propertyName]每次只能绑定一个属性

而 [ngStyle] 则可以同时绑定多个属性

当[style.propertyName] 和 [ngStyle] 绑定同一个属性时,比如都需要动态修改font-size, [style.propertyName]则会覆盖[ngStyle]里面的同一属性.

当然除了style binding, 我们还可以使用class binding来动态修改样式。

class binding

[class.className]

使用这种方式,我们可以根据绑定变量的值来动态添加或者移除css class。
还是使用刚才button的例子。

则代码变为:

//template
<button 
  class="btn btn-primary" 
  [class.btnBorder]="changeBorder" >
  Style Binding
</button>

//CSS
.btnBorder {
 border-color: green;
 border-radius: 10px;
}

//Component Class
private changeBorder: boolean = true;

结果如图:

解析Angular 2+ 样式绑定方式

看着字体有点小啊,我们再动态添加一个改变字体的class:my

这个时候代码就变为了:

//template
<button 
  class="btn btn-primary" 
  [class.btnBorder]="changeBorder" [class.btnFont]="changeFont" >
  Style Binding
</button>

//CSS
.btnBorder {
 border-color: green;
 border-radius: 10px;
}
.btnFont {
 font-size: 2em;
 font-weight: bold;
}

//Component Class
private changeBorder: boolean = true;
private changeFont: boolean = true;

结果如图:

解析Angular 2+ 样式绑定方式

[ngClass]

像[ngStyle]一样,angular也给我们提供了一个指令[ngClass]来动态绑定多个css class。

那么我们可以使用[ngClass]对上面的代码重构一下

//template
<button 
  class="btn btn-primary" 
  [ngClass]= "{'btnFont': changeFont, 'btnBorder': changeBorder}">
  Style Binding
</button>

//CSS
.btnBorder {
 border-color: green;
 border-radius: 10px;
}
.btnFont {
 font-size: 2em;
 font-weight: bold;
}

//Component Class
private changeBorder: boolean = true;
private changeFont: boolean = true;

结果依旧为:

解析Angular 2+ 样式绑定方式

[ngClass]需要绑定一个object,key是css类名, value是绑定的变量。

[class.className] vs. [ngClass]

[class.className]每次只能绑定一个CSS类。

而 [ngClass] 则可以同时绑定多个CSS类。

当[class.className] 和 [ngClass] 需要动态修改同一个样式时,比如都需要动态修改font-size, [class.className]则会覆盖[ngClass]里面的统一样式.

[className]

angular还提供一种绑定方式,就是直接通过修改元素的className来动态改变样式。

但我不推荐这种使用方式,为什么不推荐? 看下面的例子

//template
<button 
  class="btn btn-primary" 
  [className]="changedFont">
  Style Binding
</button>

//CSS
.btnBorder {
 border-color: green;
 border-radius: 10px;
}
.btnFont {
 font-size: 2em;
 font-weight: bold;
}

//Component Class
private changedFont: string = "btnFont";

结果却变成了这样:

解析Angular 2+ 样式绑定方式

我们预先设置好的bootstrap的primary被移除了, 就是因为[className]会添加动态绑定的类名,然后移除之前所有的类名。
所以这种绑定方式是很有危险性的,因为针对一个组件,我们通常都会有很多种类来共同控制样式。

在通用组件中,非常不推荐使用[className]。

总结

最后再来总结下angular中各种样式绑定的特点和区别:

  1. [style.propertyName] 直接绑定一个string类型的样式值,或者string类型的变量。优先级最高,会覆盖已有的样式属性。
  2. [ngStyle]绑定一个样式组合的object,key是css属性名,value是对应的样式值,或者string类型的变量。
  3. [class.className] 直接绑定true/false, 或者boolean类型的变量。
  4. [ngClass]绑定一个css类名组合的object,key是css类名,value是true/false 或者boolean类型的变量。
  5. [className] 直接绑定css类名,或者string类型的变量。 (不推荐使用这种方式)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery图片上下tab切换效果
Mar 18 Javascript
PHP abstract与interface之间的区别
Nov 11 Javascript
使用javascript为网页增加夜间模式
Jan 26 Javascript
jquery实现点击文字可编辑并修改保存至数据库
Apr 15 Javascript
JavaScript函数的4种调用方法详解
Apr 22 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
javascript显式类型转换实例分析
Apr 25 Javascript
js实现网页抽奖实例
Aug 05 Javascript
开发Vue树形组件的示例代码
Dec 21 Javascript
JS高阶函数原理与用法实例分析
Jan 15 Javascript
bootstrap tooltips在 angularJS中的使用方法
Apr 10 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
Feb 11 Javascript
基于jquery的on和click的区别详解
Jan 15 #jQuery
仿淘宝JSsearch搜索下拉深度用法
Jan 15 #Javascript
vue2.0 父组件给子组件传递数据的方法
Jan 15 #Javascript
深入理解requireJS-实现一个简单的模块加载器
Jan 15 #Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
Jan 15 #Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
Jan 15 #Javascript
js实现一个简单的MVVM框架示例
Jan 15 #Javascript
You might like
收集的DedeCMS一些使用经验
2007/03/17 PHP
mysql limit查询优化分析
2008/11/12 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python变量和数据类型详解
2017/02/15 Python
Python分治法定义与应用实例详解
2017/07/28 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
python实现滑雪游戏
2020/02/22 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
如何基于Python爬虫爬取美团酒店信息
2020/11/03 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
高中诗歌鉴赏教学反思
2016/02/16 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript