跳转到内容

XSLTForms/CSS

来自维基教科书,开放的书籍,为开放的世界

最小样式规则

[编辑 | 编辑源代码]

可能存在两种基本类型的布局,人们可能希望

(1) 内联表单 所有 Xform 控件“流入”页面,并在当前行没有足够空间容纳控件时移至下一行;

(2) 块表单 所有 XForm 控件都出现在页面上的单独一行上,并垂直对齐。

“XForm 控件”指的是“标签”、“值”和相关的“图标”(帮助、有效/无效)。对于以上两种情况,我们希望控件的所有部分都保持在同一行,标签不应该与它的值分开。因此,在第一种情况下,所有部分都应该向下移至下一行,如果没有足够的空间。

每个 xform 控件通过 XSLTForms 样式表转换为类似以下 HTML 结构的结构

span.xforms-control
|_span
   |_span
      |_span
         |_span
         |   |_label
         |_span.value
            |_input

默认情况下,span 没有“display”功能,因此通过向 XSLTForms 创建的 span 元素添加样式,我们可以实现我们想要的结果。

因此,对于最小的样式规则,首先为了使 Xform 控件中的所有内容保持在一起,我们可以使用以下 CSS 规则

   span.xforms-control span {display:inline-block; white-space:nowrap; }

使用“white-space:nowrap”似乎在大多数浏览器上已经足够了,但是添加“display:inline-block”似乎强制执行了 nowrap 行为。

然后,为了使控件标签看起来“属于”控件值,我们可以设置标签的宽度,并将其设置为内联块

   label.xforms-label { display:inline-block; width:300px; text-align:right; margin-right:4px;}

以上两个选择器似乎实现了您对 HTML 默认值的流布局,但也使每个 XForm 控件都作为原子单元。

要获得第二个表格布局,只需强制每个控件出现在新行,如下所示

   span.xforms-control {display:block;}

我们已经将每个标签设置为标准宽度,这意味着值将很好地对齐。

但是,如果您不希望 xform 触发按钮的行为与其他控件相同,那么您必须在 display:block 选择器中更加具体,例如

   span.xforms-input, span.xforms-select1, span.xforms-textarea, span.xforms-output {display:block;}

用于 XForms 伪元素和伪类的 XSLTForms 类

[编辑 | 编辑源代码]

CSS XForms 伪元素和伪类选择器在 XSLTForms 中未实现;相反,XSLTForms 生成包含等效类的元素,这些元素可以通过 CSS 规则进行选择。

例如,而不是

/* Color current item yellow. */
::repeat-index {background-color: yellow;}

/* Within an invalid control, color the input field pink. */
:invalid ::value {background-color: pink;}

/* Color current item yellow. */
.xforms-repeat-item-selected {background-color: yellow;} 

/* Within an invalid control, color the input field pink. */
.xforms-invalid .xforms-value {background-color: pink;}
由 XForms 定义的伪元素
CSS 等效的 XSLTForms 类值
::value .xforms-value
::repeat-item .xforms-repeat-item
::repeat-index .xforms-repeat-item-selected


由 XForms 定义的伪类
CSS 等效的 XSLTForms 类值
:enabled & :disabled .xforms-enabled

.xforms-disabled

:required & :optional .xforms-required .xforms-optional
:valid & :invalid .xforms-valid .xforms-invalid
:read-only & :read-write .xforms-readonly .xforms-readwrite
:out-of-range & :in-range (未实现)
:value-empty & :value-non-empty (未实现)


这里清楚地了解嵌套关系非常重要。伪属性 :valid:invalid 等被分配给控件;伪元素 ::value 是控件的子元素,而不是控件本身。因此,CSS 选择器 ::value:invalid 或使用等效的 XSLTForms 类的等效选择器 .xforms-value.xforms-invalid 都不会选择任何内容:::value 伪元素没有 :invalid 类。相反,伪元素位于具有该类的元素内部。(理论上,XForms 称 ::value 伪元素是控件的子元素;实际上,出于实际原因,XSLTForms 使其成为后代,而不是子元素。)

如有疑问,仔细研究 XSLTForms 生成的 HTML 可以帮助表单作者理解如何编写选择所需元素的 CSS 选择器。

华夏公益教科书