能否用 CSS 实现?在分类页面上对分类进行分组

我想做的是(我知道没有内置的设置或功能集)使用 CSS 在主页上对类别进行分组。

我并不打算嵌套类别,只是想将某些类别分组在一起,并可能为它们添加一个标题。我知道可以通过内边距将各个类别“分隔”开,也知道可以通过类别 ID 或类别名称来定位每个类别。因此,我希望能实现类似这样的效果:

为了简化起见,我意识到类别必须保持其排序顺序,并且每个类别需要通过 category_id 进行定位,但我认为可能存在某种 CSS 方法,可以在某个类别之后或另一个类别之前添加内边距。

关键问题是:是否有可能在内边距中插入一些文本来创建标题?

这样做的目的首先是打破冗长的类别列表视图,并进行区分,例如:

  • 类别 1-2 归入“员工”标题下
  • 类别 3-4 归入“社区资源”标题下
  • 类别 5、8、11、12、13 归入“一般讨论类别”标题下

我不想将这些设为子类别,我喜欢现有的结构和类别系统。我只想改变类别视图页面上类别的显示方式。理想情况下,这仅仅是一个视觉布局的调整,无需更改平台的库结构。

有人知道如何实现吗?

这对我工作协作网站的布局来说将是一个重大突破。

Sam、codinghorror,你们认为是否可以在类别重组菜单中添加一个“分组”步骤,使其能够原生实现此功能?例如作为一个选项(开启/关闭分组)。只需将类别按顺序排列在主页分组中,系统就能自动将它们分隔开。这应该是在核心代码、插件还是主题组件中实现呢?

3 个赞

anyone? buehler.

feedback appreciated

This kind of stuff is possible in a theme component but extremely complicated. I think you would need to override templates which makes this also pretty fragile.

4 个赞

有点晚了 :smile: 但也许其他人也需要。我必须说明:

  • 并非所有 CSS 代码都是必需的,尤其是表格行的边框和背景颜色,因此请随意根据需要进行调整。
  • 我不得不将布局从常规表格改为 flex,因为表格行不能使用负边距,而且存在其他布局问题,而且……flex 更加灵活 :smile:
  • Category Group 1Category Group 2 替换为你想要的类别组名称。
  • 在我的示例中,我使用了类别 ID 2 和 4,因此请使用 Chrome 开发者工具进行检查(见下图),找到正确的类别 ID,并将我示例中的 [data-category-id="2"][data-category-id="4"] 替换为你的 ID。

将此代码粘贴到“Common”标签页中:

.category-list{
    display: flex;
    flex-direction: column;
}
.category-list thead tr{
    display: flex;
}
.category-list .topics {
    width: 95px;
    margin-left: auto;
    min-width: 95px;
    white-space: nowrap;
}
.category-list tbody tr {
    background-color: var(--primary-very-low);
    box-sizing: border-box;
    display: flex;
}
body .category-list [data-category-id="2"],body .category-list [data-category-id="4"] {
    position: relative;
    margin-top: 50px;
}
body [data-category-id="2"]::before {
    content: "Category Group 1";
}
body [data-category-id="4"]::before {
    content: "Category Group 2";
}
body [data-category-id="2"]::before,body [data-category-id="4"]::before {
    position: absolute;
    top: -35px;
    left: 0;
    font-weight: bold;
    font-size: 15px;
    text-transform: uppercase;
    color: var(--primary-medium);
}

将此代码粘贴到“Desktop”标签页中:

.category-list tbody tr {
    margin-bottom: 15px;
    border: 1px solid var(--primary-low);
}

将此代码粘贴到“Mobile”标签页中:

body .category-list-item.category .posts {
    width: auto;
    margin-left: auto;
}
body .category-list-item>footer,body .subcategory-list-item>footer{
    background-color: var(--primary-very-low);
}
.categories-list .category-list th {
    padding: 0;
}
.category-list-item>footer .category-stat, .subcategory-list-item>footer .category-stat {
    float: right;
}
.category-list-item>footer .category-stat:first-child, .subcategory-list-item>footer .category-stat:first-child{
    margin-right: 0;
}
body .category-list-item.category tr:first-of-type{
    padding: 10px 0;
    border-bottom: 1px solid var(--primary-low);
}
body tr.category-topic-link:last-of-type{
    border-bottom: 1px solid var(--primary-low);
}
body .categories-list .category-list th {
    padding: 0;
}
body .category-list-item {
    border-top: none;
    margin-bottom: 10px;
}
body .category-list-item {
    padding: 0;
    border: 1px solid var(--primary-low)!important;
}
.category-list-item>footer, .subcategory-list-item>footer {
    border-top: none;
}

在桌面和移动分辨率下,效果如下所示:

10 个赞

你好,Cos,非常有趣,感谢分享。本着同样的精神(即获得更好的展示效果),我们尝试在 WordPress 页面前端设置特定的展示样式,并希望将分类名称“发送”到该页面上,例如那些已收到回复的分类、用户选择的分类,或是某个特定分类。您认为这可行吗?如果可行,具体该如何操作?

1 个赞

恐怕仅靠 CSS 无法实现这一点。也许 WordPress Discourse 插件正是您所需要的。此外,wp discourse 短代码插件也是必不可少的。

我们已经在自己的 WordPress 网站上使用了该插件,目前运行效果非常好。以下是该插件在侧边栏小工具中的显示效果:

2 个赞

@sam@cosdesign 的回复有效。有没有办法将此功能集成到核心菜单中,让用户默认关闭它,然后在管理面板中设置组标题的页眉,并在每个分类的属性页面中,从管理面板中启用的部分页眉下拉列表中选择,使分类自动归入相应的页眉下。

这对平台来说添加起来应该不太困难,并且将极大改善拥有多用户角色、多组和多分类的大型安装环境。

1 个赞

Discourse 核心现在支持此类分组:

选择“带有精选主题的子类别”作为“桌面类别页面样式”:

然后您的类别页面将如下所示:

5 个赞

是否可以用 RTL 实现?我试过了但失败了 :broken_heart:

这说得通。核心 Discourse 样式表被翻转以在此处创建 RTL 版本:discourse/lib/stylesheet/compiler.rb at main · discourse/discourse · GitHub CSS 文件会被编译以创建 RTL 版本。如果这是正确的,那就可以解释你在使用 RTL 布局时在使用主题时遇到的问题。

你可以通过向你的站点主题添加一些包含方向的 CSS 规则来确认这一点,然后使用 RTL 区域设置访问该站点,看看方向是否被翻转。我认为它不会被翻转。

例如,如果你将此添加到你的主题中:

.category-list-item footer .category-stat, .subcategory-list-item footer .category-stat {
    float: right;
}

我认为它不会被转换为:

.category-list-item footer .category-stat, .subcategory-list-item footer .category-stat {
    float: left;
}

我同意你的看法,恐怕我仍然不清楚如何使用上面的代码 :confused:

有什么建议吗?

您知道有不适用于 RTL 的主题示例吗?如果您知道,请在此处发布主题链接,我将测试我的理论,并在测试后解释问题所在。

编辑:这是对问题的解释:

对于位于 Discourse 主代码库中的 CSS 文件,RTL CSS 是通过“翻转”大多数依赖于站点布局方向的 CSS 规则来创建的。例如,padding-left 会被翻转为 padding-right。这是通过 RTLcss gem 完成的:https://github.com/discourse/rtlcss。

问题在于 Discourse 主题的 CSS 规则不会被翻转。这意味着,如果一个主题有指定方向的 CSS 规则,那么在使用 RTL 语言时,方向将与使用 LTR 语言时相同。这是一个小例子:

当主题与 RTL 界面一起使用时,padding-left: 8px; 不会被翻转为 padding-right: 8px;。这会导致轻微的对齐问题。我相信在使用 RTL 语言时会出现更严重问题的示例。

对于您添加到主题编辑器中默认 Discourse 主题的任何 CSS,情况也是如此。这是一个使用本主题代码的示例:Can it be done with CSS? Grouping categories on category page - #4 by cosdesign

这是该 CSS 中设置方向的一条规则:

body [data-category-id="2"]::before,body [data-category-id="4"]::before {
    position: absolute;
    top: -35px;
    left: 0; // This needs to be changed
    font-weight: bold;
    font-size: 15px;
    text-transform: uppercase;
    color: var(--primary-medium);
}

在使用 RTL 语言时,这是问题所在:

如果该规则位于核心 Discourse CSS 文件中,当选择 RTL 语言时,left: 0; 将自动转换为 right: 0;。由于 CSS 添加到主题中,您需要手动将其编辑为:

body [data-category-id="2"]::before,body [data-category-id="4"]::before {
    position: absolute;
    top: -35px;
    right: 0; // Changed to the proper position for RTL layouts
    font-weight: bold;
    font-size: 15px;
    text-transform: uppercase;
    color: var(--primary-medium);
}

Discourse 在使用 RTL 布局时会向 html 标签添加一个 rtl 类。主题开发者可以使用此类别使他们的主题同时适用于 LTR 和 RTL 布局。这有效,而且我认为它是正确的,但可能不需要 left: auto 声明。

body [data-category-id="2"]::before,body [data-category-id="4"]::before {
    position: absolute;
    top: -35px;
    left: 0;
    font-weight: bold;
    font-size: 15px;
    text-transform: uppercase;
    color: var(--primary-medium);
}
/* Fix positioning for rtl layouts */
.rtl body [data-category-id="2"]::before,.rtl body [data-category-id="4"]::before {
    right: 0;
    left: auto;
}

我不确定开发者是否应该采用这种方法来开发他们的主题。这很耗时,并且可能导致错误和维护问题。也许 Discourse 可以编译一些主题,并考虑提供 RTL 版本。也许值得用其中一些来测试这种方法:

require "rtlcss"

Rtlcss.flip_css("theme_css")

这本应是一个简短的回答 :slight_smile: 如果我写的内容是正确的,并且没有在其他主题中处理过,也许应该将其移到一个新主题中。

这些 Theme component 也许能满足您的需求。或者可以作为参考代码,获取一些灵感。

“现代分类 + 分组框” 如 Air 主题中所使用的效果很好。