使用您自己的样式自定义帖子的内容

要求

:information_source: 要使用这些技巧和窍门,您必须是自托管 Discourse 实例的管理员,或者拥有高于 BasicDiscourse 托管计划

简介

Discourse 支持多种方法来格式化和自定义帖子内容。您可以在这里找到列表:

但有时,您可能需要更具体的功能,例如,一个看起来像按钮的链接。

Green button

这正是我们要在这里学习的修改类型。

逻辑

我将简要解释其背后的逻辑,但您可以直接进入下一步,查看实际示例 :slight_smile:

Discourse 允许在帖子内容中使用任何以 data- 开头的 HTML 属性。
这些就是我们将通过 CSS 自定义内容的属性。

在本教程中,我将它们称为 data- 属性 :slight_smile:

创建具有这些属性的元素的一种方法是使用类似 BBcode 的标签:[wrap],我们可以为其添加任意值。这里我们选择“button”(也可以是其他任何内容,甚至可以是您狗的名字 :dog:):

[wrap=button]some text[/wrap]

这将输出一个具有以下属性的 HTML 元素:data-wrap="button"

第一个示例:粉色背景

让我们从一个实际示例开始。我们将创建带有粉色背景的文字。

作为 元素

在您的帖子中,在空行上输入:

[wrap=pink]pink text[/wrap]

这将创建一个具有属性 data-wrap="pink"div 元素。

然后,将以下 CSS 添加到您的主题中。
进入管理面板 → 自定义 → 主题 → 您的主题 → 编辑 CSS/HTML → CSS。

将以下 CSS 代码放入其中:

[data-wrap="pink"] {
  background: pink;
}

然后点击保存按钮。

返回您的帖子,查看结果:

是的,它已经很美了 :cherry_blossom:

您会注意到背景覆盖了整个帖子宽度。因为我们的 wrap 是其所在行上的唯一元素,所以它输出一个 元素。
您可以在此处了解 内联 HTML 元素之间的区别:https://www.w3schools.com/html/html_blocks.asp。

如果您希望在多行上显示粉色背景(仍作为 ),则需要确保 [wrap] 标签所在的行没有其他内容或文本:

[wrap=pink]
pink text
pink text
pink text
pink text
[/wrap]

结果如下:

作为 内联 元素

现在,让我们在 [wrap] 之前或之后添加一些文本,或者两者都加 :smile:。例如:

Here is some [wrap=pink]pink text[/wrap] and it's awesome ✨

结果如下:

如果文本或其他元素与您的 [wrap] 标签位于同一行,它将输出一个 内联 元素。

第二个示例:具有按钮外观的链接

操作 [wrap] 标签有时会导致不想要的结果,原因之一是它根据上下文可能是块元素或内联元素。
因此,我们将描述两种实现相同结果的不同方法,但您可以选择最适合您的方法 :v:

使用 [wrap] 创建内联按钮链接

使用 Markdown 创建链接的语法是:[some text](https://some-link.etc)
要自定义文本并使其看起来像按钮,我们将 wrap 插入到方括号内。这是一个示例:

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a blue button 🐳 !

我们不会评论这段代码的输出。既然您写了 [wrap=button],您就知道需要在 CSS 中针对 [data-wrap="button"]

那么,让我们开始吧,添加一些华丽的 CSS 让它变漂亮!:sparkles:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: DodgerBlue;
  color: White;
}

我们不会在此详细说明 CSS 规则。互联网上有很多 CSS 资源,所以如果您想进行更具体的修改,首先需要学习相关知识。:slight_smile:

结果 :magic_wand:

看起来不错,对吧?

使用常规 HTML 内容创建内联按钮链接

由于 Discourse 接受 HTML 代码,我们可以决定不使用 [wrap] 标签,而是使用带有 data- 属性的 HTML。在此示例中,我们将使用常规的 Markdown 语法创建链接,并用 <span> 标签将其包围。
:information_source: 我们不能直接使用链接 <a> 标签,因为它是例外情况,不允许任何 data- 属性。

输入:

This <span data-button>[link](https://discourse.org/)</span> is a green button 🐸 !

这将输出一个 内部 包含 <span> 标签的链接,该标签具有 data-button 属性,这意味着 CSS 会稍微复杂一些。我们将需要同时针对 data-button 和链接:

[data-button] {
  display: inline-block;
  padding: 0.5em 1em;
  background: ForestGreen;
  a {
    color: White;
  }
}

结果如下:

进一步探索

使用 [wrap] 自定义列表

[wrap] 标签和 data- 属性可以在许多上下文中使用,您可以自定义更高级的内容。限制主要在于您的 CSS 知识(以及次要的 HTML 知识)。

我将给出一个自定义列表的示例,其中每个元素前面都会添加一个猫表情符号,无需解释:

文本:

[wrap=cat]

- Felix
- Garfield
- Nat's cat
  [/wrap]

CSS:

[data-wrap="cat"] ul {
  list-style: none;
  li:before {
    content: "🐈";
    margin-right: 0.25em;
  }
}

结果:

使用您自己主题的配色变量

如果您允许用户使用不同的主题或颜色,您的修改可能对每个用户看起来都不太好,特别是如果他们在浅色和深色配色方案之间有选择的话。

一个好的做法是使用 Discourse 的颜色变量,而不是“硬编码”的颜色,如 red#FF0000rgb(255,0,0)

这是一个示例,其中按钮的背景颜色将使用当前调色板的主色,文本将使用次色:

文本:

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a button 🌈 !

CSS:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: var(--primary);
  color: var(--secondary);
}

以下是使用 Solarized Light 配色方案的用户看到的效果:

如果他们使用 Solarized Dark 配色方案:

结论

您现在掌握了使用 [wrap] 元素和 data- 属性创建自定义元素的基础知识。

要进行更高级的自定义,学习 CSS 至关重要。您可以在互联网上找到许多教程。

以下 Discourse 指南也可能有所帮助:Making custom CSS changes on your site
使用浏览器的开发者工具还可以轻松显示 Discourse 颜色变量列表及其外观:


:raised_hand_with_fingers_splayed: 欢迎为此指南提出任何修改建议!


本文档受版本控制 - 建议更改 在 GitHub 上

23 个赞

感谢 @Canapin

一个使用这些概念的主题组件的优秀示例是这个:

4 个赞

干得好!

我很想看看用户们还能用 data 属性想出什么其他创意解决方案。


使用 HTML <span> data-button</span> 是否比 BBCode [wrap="button"] 有任何优势?

2 个赞

没怎么仔细想,我会说使用 <span> 允许你将一个内联元素作为单行上的唯一内容。

在没有其他内容的情况下,在单行上使用 [wrap] 将自动输出一个元素。里面的文本也会被段落 <p> 标签包裹。

除此之外,这可能只是个人喜好的问题。我也没有提到 [wrap] 和 HTML 元素可以有多个 -data 属性,因为我认为这对于大多数用途来说用处不大。

3 个赞

如何在帖子/主题中添加 Bootstrap “卡片”

…有些人可能会说这很疯狂、太复杂或多此一举,但我喜欢它 :smiley:

  • 添加了一些颜色,以便更好地看到 BBCode 的嵌套。

停止! 不要使用我的代码

而是使用 @Canapin 发布的改进代码 点击这里

要包含在主题/帖子中的 BBCode

[wrap="card"]
[wrap="card-header"]**卡片标题**[/wrap]
[wrap="card-body"]
[wrap="card-title"]**卡片标题**[/wrap]
[wrap="card-text"]卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本[/wrap]
[/wrap]
[/wrap]

要添加到主题的 CSS 代码。

// Bootstrap Card Box
[data-wrap="card"] {
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
    word-wrap: break-word;
    background-color: #fff;
    background-clip: border-box;
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0.25rem;
}

// Bootstrap Card Header
[data-wrap="card-header"] {
    padding: 0.5rem 1rem;
    margin-bottom: 0;
    border-bottom: 1px solid rgba(0,0,0,.125);
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0px 0px;
    
}

// Bootstrap Card Body
[data-wrap="card-body"] {
    flex: 1 1 auto;
    padding: 1rem 1rem;
}

// Bootstrap Card Title
[data-wrap="card-title"] {
    margin-bottom: 0.5rem;
}

// Bootstrap Card Text
[data-wrap="card-text"] {
    margin-top: 0;
    margin-bottom: 1rem;
}
4 个赞

当然,这取决于您打算在其中放置什么,但要实现与您的示例完全相同的视觉效果,您可以大大优化您的代码:

[wrap="card-header"]**卡片标题**[/wrap]
[wrap="card-body"]
**卡片标题**

卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本,卡片文本
[/wrap]
[data-wrap="card-header"] {
    padding: 0.5em 1em;
    border: 1px solid rgba(0,0,0,.125);
    border-bottom: 0;
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0 0;
}

[data-wrap="card-body"] {
    padding: 1em;    
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0 0 5px 5px;
}

5 个赞

啊啊!好多了!非常感谢你做出改进!<3

太棒了![wrap]...[/wrap] 元素中的 markdown 是何时处理的,或者有什么技巧可以使其在包含在 wrap 中之前进行渲染?

例如,我尝试在元素中将一些文本格式化为 粗体斜体,但它没有像预期的那样渲染——在浏览器中保存后,我只看到页面上的 _text_**text** :frowning:

1 个赞

确实,如果在同一行有其他内容,[wrap] 中的格式(无论是 HTML、Markdown 还是 BBcode)似乎都无法正常工作(如果它是内联元素):

您需要为此创建一个 <span>

2 个赞