解析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 相关文章推荐
js实现一个省市区三级联动选择框代码分享
Mar 06 Javascript
获取非最后一列td值并将title设为该值的方法
Oct 30 Javascript
JQuery文字列表向上滚动的代码
Nov 13 Javascript
js Calender控件使用详解
Jan 05 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
Oct 29 Javascript
jquery淡入淡出效果简单实例
Jan 14 Javascript
Angularjs实现mvvm式的选项卡示例代码
Sep 08 Javascript
Bootstrap入门教程一Hello Bootstrap初识
Mar 02 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
Jan 05 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
May 28 Javascript
vue实现PC端录音功能的实例代码
Jun 05 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
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
Zend的MVC机制使用分析(一)
2013/05/02 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
2012/01/13 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
JS简单实现String转Date的方法
2016/03/02 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中使用异常处理来判断运行的操作系统平台方法
2015/01/22 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
python实现宿舍管理系统
2019/11/22 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python实现壁纸下载与轮换
2020/10/19 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
大学应届生求职简历的自我评价
2013/10/08 职场文书
禁毒宣传标语
2014/06/19 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书