Follow these best practices when you write USS to style visual elements.
Use USS files instead of inline styles when you can for more efficient memory usage.
Inline styles are per element and can cause memory overhead. When you use inline styles in a C# script or a UXML file on many elements, the memory usage becomes high quickly.
All USS selectors are applied at runtime so the architecture affects initialization performance. USS selectors are applied when an element first appears or when its classes change:
:hover
selector is the main culprit for selectors to cause interactivity issues and a re-styling.Usually, it’s not a problem if you have a lot of selectors because each USS file is turned into a lookup table. However, the performance decreases linearly as you add classes to an element. Each class in the list is used to query the lookup table. The complexity is N1 x N2
, where:
N1
is the number of class on the elementN2
is the current number of applicable USS filesThe number of elements in the hierarchy is the main fact that affects performance. Update Styling might be negligible for simple UIs but is significant for large UIs that have several thousands of elements. If an element matches a lot of selectors, it causes overhead to merge the styles coming from each rule.
In general, complex selectors have more impact on performance than simple selectors. Complex selectors depend on the ancestors of an element to match it. When possible, consider the following:
selector1 > selector2 > selector3
) instead of the descendant selector (selector1 selector2 selector3
).selector1 > selector2 > *
) or the combination of descendant selector with the universal selector (selector1 * selector2
). The universal selector tests every potential element against the selector which can impact performance.:hover
pseudo-class in selectors on elements with many descendants, such as .yellow:hover > * > Button
. Mouse movements invalidate the entire hierarchy of elements targeted by an :hover
selector.You can use the Block Element Modifier(BEM) convention to reduce hierarchical selectors. With BEM, each element receives a class that combines its specific existence inside another element.
BEM은 Block Element Modifier의 약자로, 개발자들이 구조화되고, 명료하고, 쉽게 유지할 수 있는 선택자를 작성하도록 도와주는 간단한 시스템입니다. BEM을 사용하면 요소에 클래스를 할당한 후 스타일시트에서 해당 클래스를 선택자로 사용할 수 있습니다.
BEM 클래스는 최대 3개의 컴포넌트를 가질 수 있습니다.
menu
, button
, list-view
menu**item
, button**icon
, list-view__item
menu--disabled
, menu**item--disabled
, button--small
, list-view**item--selected
각 이름 부분은 라틴어 문자, 숫자, 대시로 구성됩니다. 각 이름 부분은 이중 밑줄(__
) 또는 이중 대시(--
)를 사용하여 서로 연결됩니다.
The following example shows UXML code for a menu:
<VisualElement class="menu">
<Label class="menu__item" text="Banana" />
<Label class="menu__item" text="Apple" />
<Label class="menu**item menu**item--disabled" text="Orange" />
</VisualElement>
Each element is equipped with classes that describe its role and appearance, you can write most of your selectors with only one class name:
.menu {
}
.menu__item {
}
.menu__item--disabled {
}
You can style elements with a single class name. Sometimes, you might need to use complex selectors. For example, you can use a complex selector when the style of an element depends on the modifier of its block:
.button {
}
.button__icon {
}
.button--small {
}
.button--small .button__icon {
}
참고:
Button
, Label
) or element names (#my-button
) in your BEM selectors.UI 툴킷은 BEM을 준수합니다. 각 시각적 요소에는 필요한 클래스명이 연결되어 있습니다. 예를 들어 모든 TextElement
에는 unity-text-element
클래스가 있습니다. TextElement
에서 파생되는 Button
의 각 인스턴스의 경우 해당 클래스 리스트가 unity-button
및 unity-text-element
클래스로 채워집니다.
VisualElement
또는 해당 자손 중 하나로부터 새로운 요소를 파생하는 경우 다음의 가이드라인을 준수하면 BEM 방식을 사용하여 요소 스타일 지정을 쉽게 만들 수 있습니다.
AddToClassList()
를 사용하여 관련 USS 클래스를 요소 인스턴스에 추가합니다.my-block**first-child
, my-block**other-child