Aguardienticoの回答に促されてさらに調査したところ、ここで説明されているようにSassを使用してこれを行うことが可能であることがわかりましたが、ExtJS CSSを再構築したくなかったため、実行時に次のように実行するコードを追加しました:
var body = Ext.getBody();
// Remove the x-body cls from the body element
body.removeCls("x-body");
// Add x-body cls to any existing top-level ExtJs divs
body.select('>div').each(function(el) {
if (el.hasCls("x-border-box")) {
el.addCls("x-body");
}
});
body.on("DOMNodeInserted", function(e, node) {
// Add x-body cls to top-level ExtJs divs as they are created
if (node.parentNode === body.dom) {
if (Ext.fly(node).hasCls("x-border-box")) {
Ext.fly(node).addCls("x-body");
}
}
});
body要素からx-bodyを削除し、ExtJS によって作成されたすべての div に body の直接の子として追加し直すという考え方です。ExtJS は必要に応じて新しい div を追加するため (ピック リストなど)、DOMNodeInsertedイベントを使用してそれらが作成されるのを監視する必要もあります。
このコードはアプリケーションのlaunch
ハンドラーで呼び出しますが、代わりにハンドラーの先頭に置くこともできExt.onReady
ます。
編集:
私の ExtJS アプリケーションは、次のように body 要素にレンダリングされるコンテナー内にあります。
Ext.create("Ext.container.Container", {
renderTo: Ext.getBody(),
...
});
ただし、別の DIV にレンダリングする場合は、次のようにx-bodyクラスをカスタム コンテナーに明示的に追加する必要もあります。
Ext.create("Ext.container.Container", {
renderTo: "SomeOtherDiv",
cls: "x-body",
...
});