CSS 类和小部件 : three questions

标签 css dojo widget dgrid

我写了一个非常复杂的小部件,它使用 OnDemandList 创建一个允许完全编辑(包括添加)商店的小部件。

现在...我不完全是 CSS 大师(恰恰相反),并且希望得到一些指导,只是为了检查我是否以半正常的方式做事。

当我在我的小部件中创建编辑器时,我会:

buildRendering: function(){ 
    // ... 
    this.domNode = put( 'div' ); 
    // ... 
},   

postCreate: function(){ 
  // ... 
  // This is here, because if I set the class in buildRendering, it gets zapped by className (the widget's declaration) 
  put( this.domNode, '.editable-list' ); 
    // ... 
}, 

然后动态添加编辑器时:

    put( row.element, editingWidget.domNode ); 
    put( editingWidget.domNode, '.editable-list-row-editor' ); 

我还需要确保每一行都有 position:absolute 以便编辑器被放置在正确的位置:

    domStyle.set( row.element, 'position', 'relative' ); 

在 CSS 中,我有:

.editable-list-row-editor { 
  position: absolute; 
  top: 0; 
  z-index: 20;
} 

问题:

1) 就最佳实践而言,是否可以像我在 domStyle.set( row.element, 'position', 'relative' ); ... 中那样添加样式?或者我应该用 CSS 来做吗?我以编程方式完成它,因为它真的很重要,因为它是relative

2) 就 CSS 而言,让事情尽可能不具体是否可以?这个想法是用户可能(并且可能会)最终编写自己的 CSS,并通过编写更具体的规则来覆盖事物……是这样吗?或者也许我应该写:

.editable-list .editable-list-row-editor { 
  position: absolute; 
  top: 0; 
  z-index: 20; 
} 

或者更好:

.editable-list .row-editor { 
  position: absolute; 
  top: 0; 
  z-index: 20; 
} 

...?

3) 据我所知,小部件的 CSS 类应该在 postCreate 而不是 buildRendering 中设置,否则 Dojo 似乎使用 className 清除那里设置的任何东西...这是您通常对创建自己的 domNode 的小部件所做的吗?

最佳答案

我个人对内联 CSS 与 CSS 样式表的看法是,我喜欢在单独的样式表中编写所有内容。这背后的原因是您的代码因样式代码而变得杂乱无章,但在分离问题时,我认为最好将 CSS 编写在一个单独的文件中。

当然,内联 CSS 始终是最具体的(最重要的),所以如果你真的想强制执行某些内容,你可以在你的 CSS 规则中添加一个 !important 虽然我建议不要那么多使用它们。


您应该尽可能具体地编写您的 CSS,因为您不想干扰其他小部件/HTML,但您也不希望相反的情况(外部 CSS 干扰您的小部件)。但当然,你可以这样写:

.editable-list .row-editor {
    position: absolute;
    top: 0;
    z-index: 20;
}

这主要取决于 .row-editor 的实际含义。如果它是“全局的”,您可以保留 .row-editor ,只是因为它允许您定义一个包含通用 CSS 的全局 .row-editor,而您的 .editable-list .row-editor 将包含该小部件的特定 CSS 规则。

例如,假设您有另一个具有类似 CSS 的小部件:

.other-widget .row-editor {
    position: absolute;
    top: 0;
    z-index: 25;
}

那么你也可以编写如下CSS:

.row-editor {
    position: absolute;
    top: 0;
}

.editable-list .row-editor {
    z-index: 20;
}

.other-widget .row-editor {
    z-index: 25;
}

但这实际上取决于你如何看待 .row-editor 类,如果你认为它只是特定于你的可编辑列表,那么你也可以考虑为它添加前缀。它类似于 Dojo 已经做的事情,Dojo 有全局 CSS 类,如 .dijitInline,但也有特定的 CSS 类,如 .dijitCalendarDateLabel


如果有人想改变小部件的样式,他可以添加一个父类,这样他就可以制作一个更具体的 CSS 选择器。举个例子,假设以下是您的 CSS:

.editable-list .row-editor {
    position: absolute;
    top: 0;
    z-index: 20;
}

然后想要更改 CSS 的人只需向父级添加一个标签(例如 <body> 标签):

<body class="myTheme">
    <!-- Your HTML -->
</body>

然后指定以下CSS:

.myTheme .editable-list .row-editor {
    z-index: 30;
}

这实际上会覆盖您的 z-index 。 Dojo 已经在他们的主题中使用了这个原则。当您想使用特定主题时,您可以添加主题 CSS 并将主题名称作为类名添加到您的正文中,例如:

<body class="claro">
    <!-- Your HTML -->
</body>

当然,您不需要在正文级别定义它,只要它是您的小部件的父节点,它就可以工作。


关于 buildRenderingpostCreate 的问题,嗯,我想你使用的是 dijit/_TemplatedMixin mixin。如果是这样,那么如果您查看 code 并查找 buildRendering,您会发现它正在执行操作。这意味着如果您编写自己的 buildRendering,您实际上将用您的代码替换他们的代码。如果你想确保 Dojo 先执行它自己的逻辑,你必须这样写:

buildRendering: function() {
    this.inherited(arguments);
    /** Your code */
}

那行额外的代码实际上会调用继承模块/mixin 的相同方法。你可以用那一行做你想做的,如果你不想调用继承的模块,你就把它去掉(也可能打破它),如果你想在最后一步执行它,你只需切换 this.inherited(arguments);buildRendering 函数的最后一步(但随后它可能会覆盖您的更改)。


但归根结底,这只是一种观点,我相信还有其他的观点也是正确的(对于其他甚至类似的用例)。但我可以告诉你,Dojo 以类似的方式为他们自己的小部件做事,所以也许遵循它也是一个不错的方法。

很抱歉回答太长,但我写下它是为了对类似的问题也有帮助。

关于CSS 类和小部件 : three questions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21175377/

相关文章:

html - 为什么我的标题总是在字母下方有额外的空间?

css - Bootstrap 网格 : fluid to "one side"

html - DIV CSS Scale 过渡模糊和不稳定

javascript - Sort(a,b) 在 Dojo.dnd.source 中不起作用

javascript - 如何将目标 ="blank"添加到 Pinboard.in Linkroll 小部件?

javascript - 在网站上显示即将发生的 Facebook 事件,适用于一个页面,不适用于另一个页面

html - 如何在显示为 :block/none on child elem 的父元素上设置宽度动画

javascript - 如何在 Dart 中引用 dojo 方法

javascript - 为什么 JSON.parse() 不解析这个?

php - Drupal 8 Ajax 忘记表单更改