属性选择器如何在 JavaFX 中工作?
How do Attribute Selectors work in JavaFX?
在JavaFX CSS Reference Guide中明确指出
JavaFX Cascading Style Sheets (CSS) is based on the W3C CSS version 2.1 [1] with some additions from current work on version 3 [2].
在 JCRG 中,他们经常 link 直接参考 W3C 的 CSS 参考指南,他们谈论选择器时也是如此。
在 JCRG 中,他们提到 Type Selectors, Class Selectors, and ID Selectors—they even go so far as to say that they don't support structural pseudo-classes—but nothing is said about Attribute Selectors。
如果 JavaFX 支持它们,它们是如何工作的? JavaFX 将什么视为属性?我认为 CSS 引擎可能会查看 FXML 中的属性,但并非所有场景图都源自 FXML。
FXML 属性只是设置相应对象的属性。本身没有 "property selectors",但是当且仅当某些属性被设置时,一些节点才会设置伪类(这些在参考指南中有记载 link)。所以最重要的是,没有属性选择器的直接等价物,除非它们直接映射到伪类。
请注意,当然,如果您需要支持基于 属性 的 CSS,您始终可以观察到 属性 和 set/unset 自定义伪类。所以总是可以将属性选择器重铸为伪类。
所以,例如假设您想为具有 "alignment=CENTER_RIGHT"
属性的文本字段设置不同的样式。你可以做
TextField textField = new TextField();
PseudoClass rightAligned = PseudoClass.getPseudoClass("right-aligned");
textField.alignmentProperty().addListener((obs, oldAlignment, newAlignment) ->
textField.pseudoClassStateChanged(rightAligned, newAlignment == Pos.CENTER_RIGHT));
那么在你的CSS中你只需要
.text-field:right-aligned {
/* style rules */
}
在JavaFX CSS Reference Guide中明确指出
JavaFX Cascading Style Sheets (CSS) is based on the W3C CSS version 2.1 [1] with some additions from current work on version 3 [2].
在 JCRG 中,他们经常 link 直接参考 W3C 的 CSS 参考指南,他们谈论选择器时也是如此。
在 JCRG 中,他们提到 Type Selectors, Class Selectors, and ID Selectors—they even go so far as to say that they don't support structural pseudo-classes—but nothing is said about Attribute Selectors。
如果 JavaFX 支持它们,它们是如何工作的? JavaFX 将什么视为属性?我认为 CSS 引擎可能会查看 FXML 中的属性,但并非所有场景图都源自 FXML。
FXML 属性只是设置相应对象的属性。本身没有 "property selectors",但是当且仅当某些属性被设置时,一些节点才会设置伪类(这些在参考指南中有记载 link)。所以最重要的是,没有属性选择器的直接等价物,除非它们直接映射到伪类。
请注意,当然,如果您需要支持基于 属性 的 CSS,您始终可以观察到 属性 和 set/unset 自定义伪类。所以总是可以将属性选择器重铸为伪类。
所以,例如假设您想为具有 "alignment=CENTER_RIGHT"
属性的文本字段设置不同的样式。你可以做
TextField textField = new TextField();
PseudoClass rightAligned = PseudoClass.getPseudoClass("right-aligned");
textField.alignmentProperty().addListener((obs, oldAlignment, newAlignment) ->
textField.pseudoClassStateChanged(rightAligned, newAlignment == Pos.CENTER_RIGHT));
那么在你的CSS中你只需要
.text-field:right-aligned {
/* style rules */
}