编写简洁且易于维护的 CSS¶
有许多方法可以使 SCSS 更加简洁和简化。第一步是确定是否真的需要自定义代码。
Odoo 的 webclient 被设计为模块化的,这意味着(可能所有的)类可以在视图之间共享。在创建新类之前,请检查现有代码。很可能已经有某个类或 HTML 标签完全满足您的需求。
除此之外,Odoo 依赖于 Bootstrap (BS),这是目前最完整的 CSS 框架之一。该框架已经根据 Odoo 的设计(包括社区版和企业版)进行了定制,这意味着您可以直接在 Odoo 中使用任何 BS 类,并获得与我们的 UI 一致的视觉效果。
警告
某个类能够实现所需的视觉效果并不一定意味着它适合当前任务。请注意某些类可能会触发 JavaScript 行为,例如。
请注意类的语义。将 按钮类 应用于 标题 不仅在语义上是错误的,还可能导致迁移问题和视觉不一致。
以下部分描述了在 必须使用自定义代码时 精简 SCSS 行的技巧。
浏览器默认值¶
默认情况下,每个浏览器都会使用 用户代理样式表 渲染内容。为了克服浏览器之间的不一致性,其中一些规则被 Bootstrap Reboot 覆盖。
在此阶段,所有“特定于浏览器的装饰性”规则已被移除,但定义基本布局信息的大部分规则仍然保留(或者出于一致性原因被 Reboot 强化)。
您可以依赖这些规则。
Example
对 <div/> 应用 display: block; 通常是没有必要的。
div.element {
display: block;
/* not needed 99% of the time */
}
Example
在这种情况下,您可以选择切换 HTML 标签,而不是添加新的 CSS 规则。
span.element {
display: block;
/* replace <span> with <div> instead
to get 'display: block' by default */
}
以下是一个非详尽的默认规则列表:
标签 / 属性 |
默认值 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
:before {content: open-quote}:after {content: close-quote} |
… |
… |
工具类¶
我们的框架定义了大量的工具类,旨在满足几乎所有的布局/设计/交互需求。一个类已经存在的事实本身就证明了尽可能使用它比自定义CSS更合理。
以 position-relative 为例。
position-relative {
position: relative !important;
}
由于已经定义了一个工具类,任何包含 position: relative 声明的CSS行都是**潜在的**冗余。
Odoo依赖于默认的 Bootstrap工具类 堆栈,并使用 Bootstrap API 定义了自己的工具类。
处理工具类的冗长性¶
工具类的缺点是可能会缺乏可读性。
Example
<myComponent t-attf-class="d-flex border px-lg-2 card
{{props.readonly ? 'o_myComponent_disabled' : ''}}
card d-lg-block position-absolute {{props.active ?
'o_myComponent_active' : ''}} myComponent px-3"/>
为了解决这个问题,您可以结合以下不同方法:
在Qweb属性中,仅使用需要 动态切换 的类;
为每个属性使用新行;
按照约定对类进行排序:
[odoo组件] [bootstrap组件] [CSS声明顺序]。
Example
<myComponent
t-att-class="{
o_myComponent_disabled: props.readonly,
o_myComponent_active: props.active
}"
class="myComponent card position-absolute d-flex d-lg-block border px-3 px-lg-2"
/>