# Attribute, class, and style bindings Attribute binding in Angular helps you set values for attributes directly. With attribute binding, you can improve accessibility, style your application dynamically, and manage multiple CSS classes or styles simultaneously.
See the for a working example containing the code snippets in this guide.
## Binding to an attribute It is recommended that you set an element property with a [property binding](guide/property-binding) whenever possible. However, sometimes you don't have an element property to bind. In those situations, you can use attribute binding. For example, [ARIA](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) and [SVG](https://developer.mozilla.org/en-US/docs/Web/SVG) are purely attributes. Neither ARIA nor SVG correspond to element properties and don't set element properties. In these cases, you must use attribute binding because there are no corresponding property targets. ## Syntax Attribute binding syntax resembles [property binding](guide/property-binding), but instead of an element property between brackets, you precede the name of the attribute with the prefix `attr`, followed by a dot. Then, you set the attribute value with an expression that resolves to a string. <p [attr.attribute-you-are-targeting]="expression"></p>
When the expression resolves to `null`, Angular removes the attribute altogether.
## Binding ARIA attributes One of the primary use cases for attribute binding is to set ARIA attributes, as in this example: {@a colspan} ## Binding to `colspan` Another common use case for attribute binding is with the `colspan` attribute in tables. Binding to the `colspan` attribute helps you keep your tables programmatically dynamic. Depending on the amount of data that your application populates a table with, the number of columns that a row spans could change. To use attribute binding with the `` attribute `colspan`: 1. Specify the `colspan` attribute by using the following syntax: `[attr.colspan]`. 1. Set `[attr.colspan]` equal to an expression. In the following example, we bind the `colspan` attribute to the expression `1 + 1`. This binding causes the `` to span two columns.
Sometimes there are differences between the name of property and an attribute. `colspan` is an attribute of ``, while `colSpan` with a capital "S" is a property. When using attribute binding, use `colspan` with a lowercase "s". For more information on how to bind to the `colSpan` property, see the [`colspan` and `colSpan`](guide/property-binding#colspan) section of [Property Binding](guide/property-binding).

{@a class-binding} ## Binding to the `class` attribute You can use class binding to add and remove CSS class names from an element's `class` attribute. ### Binding to a single CSS `class` To create a single class binding, use the prefix `class` followed by a dot and the name of the CSS class—for example, `[class.sale]="onSale"`. Angular adds the class when the bound expression, `onSale` is truthy, and it removes the class when the expression is falsy—with the exception of `undefined`. See [styling delegation](guide/style-precedence#styling-delegation) for more information. ### Binding to multiple CSS classes To bind to multiple classes, use `[class]` set to an expression—for example, `[class]="classExpression"`. The expression can be a space-delimited string of class names, or an object with class names as the keys and truthy or falsy expressions as the values. With an object format, Angular adds a class only if its associated value is truthy.
With any object-like expression—such as `object`, `Array`, `Map`, or `Set`—the identity of the object must change for Angular to update the class list. Updating the property without changing object identity has no effect.
If there are multiple bindings to the same class name, Angular uses [styling precedence](guide/style-precedence) to determine which binding to use. The following table summarizes class binding syntax.
Binding Type Syntax Input Type Example Input Values
Single class binding [class.sale]="onSale" boolean | undefined | null true, false
Multi-class binding [class]="classExpression" string "my-class-1 my-class-2 my-class-3"
{[key: string]: boolean | undefined | null} {foo: true, bar: false}
Array<string> ['foo', 'bar']

{@a style-binding} ## Binding to the style attribute You can use style binding to set styles dynamically. ### Binding to a single style To create a single style binding, use the prefix `style` followed by a dot and the name of the CSS style property—for example, `[style.width]="width"`. Angular sets the property to the value of the bound expression, which is usually a string. Optionally, you can add a unit extension like `em` or `%`, which requires a number type.
You can write a style property name in either [dash-case](guide/glossary#dash-case), or [camelCase](guide/glossary#camelcase).
### Binding to multiple styles To toggle multiple styles, bind to the `[style]` attribute—for example, `[style]="styleExpression"`. The expression is often a string list of styles such as `"width: 100px; height: 100px;"`. You can also format the expression as an object with style names as the keys and style values as the values, such as `{width: '100px', height: '100px'}`.
With any object-like expression—such as `object`, `Array`, `Map`, or `Set`—the identity of the object must change for Angular to update the class list. Updating the property without changing object identity has no effect.
If there are multiple bindings to the same style attribute, Angular uses [styling precedence](guide/style-precedence) to determine which binding to use. The following table summarizes style binding syntax.
Binding Type Syntax Input Type Example Input Values
Single style binding [style.width]="width" string | undefined | null "100px"
Single style binding with units [style.width.px]="width" number | undefined | null 100
Multi-style binding [style]="styleExpression" string "width: 100px; height: 100px"
{[key: string]: string | undefined | null} {width: '100px', height: '100px'}
Array<string> ['width', '100px']