Beiträge mit eigenen Stilen anpassen

Voraussetzungen

:information_source: Um diese Tipps und Tricks nutzen zu können, müssen Sie Administrator einer selbst gehosteten Discourse-Instanz oder eines Discourse-gehosteten Tarifs höher als Basic sein.

Einführung

Discourse unterstützt mehrere Methoden, um den Inhalt eines Beitrags zu formatieren und anzupassen. Die Liste finden Sie hier:

Manchmal möchte man jedoch etwas Spezifischeres, zum Beispiel einen Link, der wie ein Button aussieht.

Green button

Genau diese Art von Änderung werden wir hier lernen.

Die Logik

Ich erkläre kurz die Logik dahinter, aber Sie können auch direkt zum nächsten Schritt übergehen und ein praktisches Beispiel ansehen :slight_smile:

Discourse erlaubt jedes HTML-Attribut, das mit data- beginnt, im Inhalt eines Beitrags.
Diese Attribute werden wir mit CSS verwenden, um unseren Inhalt anzupassen.

Ich nenne sie in diesem Tutorial data--Attribute :slight_smile:

Eine Möglichkeit, Elemente mit diesen Attributen zu erstellen, ist ein BBcode-ähnliches Tag: [wrap], dem wir einen Wert unserer Wahl hinzufügen. Hier wählen wir “button” (das könnte auch alles andere sein, sogar der Name Ihres Hundes :dog:):

[wrap=button]some text[/wrap]

Dies gibt ein HTML-Element mit dem folgenden Attribut aus: data-wrap="button".

Erstes Beispiel: ein rosa Hintergrund

Beginnen wir mit einem praktischen Beispiel. Wir erstellen Text mit einem rosa Hintergrund.

Als Block-Element

Schreiben Sie in Ihrem Beitrag auf einer leeren Zeile:

[wrap=pink]pink text[/wrap]

Dies erstellt ein div-Element mit dem Attribut data-wrap="pink".

Fügen Sie dann das folgende CSS zu Ihrem Theme hinzu.
Gehen Sie zu Admin-Bereich → Anpassen → Themes → Ihr Theme → CSS/HTML bearbeiten → CSS.

Geben Sie den folgenden CSS-Code ein:

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

Klicken Sie dann auf die Schaltfläche Speichern.

Gehen Sie zurück zu Ihrem Beitrag und sehen Sie sich das Ergebnis an:

Ja, es ist schon schön :cherry_blossom:

Sie werden feststellen, dass der Hintergrund die gesamte Breite des Beitrags abdeckt. Da unser Wrap das einzige Element auf seiner Zeile ist, gibt es ein Block-Element aus.
Sie können mehr über den Unterschied zwischen Block- und Inline-HTML-Elementen hier erfahren: HTML Block and Inline Elements.

Wenn Sie Ihren rosa Hintergrund auf mehreren Zeilen haben möchten (immer noch als Block), müssen beide Ihre [wrap]-Tags keine anderen Inhalte oder Text auf derselben Zeile haben:

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

So wird es aussehen:

Als Inline-Element

Fügen Sie nun etwas Text vor dem [wrap] hinzu, oder danach, oder beides :smile:. Zum Beispiel:

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

Hier ist das Ergebnis:

Wenn Text oder andere Elemente auf derselben Zeile wie eines Ihrer [wrap]-Tags sind, wird ein Inline-Element ausgegeben.

Zweites Beispiel: ein Link mit dem Aussehen eines Buttons.

Das Hantieren mit dem [wrap]-Tag kann aus verschiedenen Gründen zu unerwünschten Ergebnissen führen, eines davon ist, dass es je nach Kontext ein Block- oder ein Inline-Element sein kann.
Daher beschreiben wir zwei verschiedene Methoden, die dasselbe Ergebnis erzielen, aber Sie können diejenige auswählen, die Ihnen am besten gefällt :v:

Ein Inline-Button-Link mit [wrap]

Die Syntax, um einen Link mit Markdown zu erstellen, lautet: [some text](https://some-link.etc).
Um den Text anzupassen und ihn wie einen Button erscheinen zu lassen, fügen wir den Wrap innerhalb der eckigen Klammern ein. Hier ist ein Beispiel:

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

Wir werden nicht kommentieren, was dieser Code ausgibt. Sie wissen, dass, weil Sie [wrap=button] geschrieben haben, Sie [data-wrap="button"] in Ihrem CSS ansprechen müssen.

Also, los geht’s, fügen wir etwas schickes CSS hinzu, um es hübsch zu machen! :sparkles:

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

Wir werden die CSS-Regeln hier nicht im Detail erklären. Es gibt viele CSS-Ressourcen im Internet, also wenn Sie spezifischere Änderungen vornehmen möchten, müssen Sie sich zuerst darüber informieren. :slight_smile:

Das Ergebnis :magic_wand: :

Sieht das nicht gut aus?

Ein Inline-Button-Link mit normalem HTML-Inhalt

Da Discourse HTML-Code akzeptiert, können wir beschließen, die [wrap]-Tags nicht zu verwenden und stattdessen HTML mit einem data--Attribut zu nutzen. In diesem Beispiel verwenden wir die normale Markdown-Syntax für den Link und umgeben ihn mit <span>-Tags.
:information_source: Wir können nicht direkt ein Link-<a>-Tag verwenden, da es eine Ausnahme ist und kein data--Attribut zulässt.

Schreiben Sie:

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

Dies gibt einen Link innerhalb eines <span>-Tags mit einem data-button-Attribut aus, was bedeutet, dass das CSS etwas komplizierter wird. Wir müssen sowohl data-button als auch den Link ansprechen:

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

Und hier ist das Ergebnis!

Um weiterzugehen

Eine angepasste Liste mit [wrap]

[wrap]-Tags und data--Attribute können in vielen Kontexten verwendet werden und Sie können fortgeschrittenere Inhalte anpassen. Die Grenze ist größtenteils Ihr CSS-Wissen (und in geringerem Maße HTML).

Ich gebe ein einzelnes Beispiel ohne Erklärung, indem ich eine Liste anpasse, in der jedes Element mit einem Katzen-Emoji beginnt:

Text:

[wrap=cat]

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

CSS:

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

Ergebnis:

Verwendung der Farbwerte Ihres eigenen Themes

Wenn Sie Benutzern erlauben, verschiedene Themes oder Farben zu verwenden, sehen Ihre Änderungen für jedes Theme möglicherweise nicht gut aus, insbesondere wenn sie zwischen hellen und dunklen Farbschemata wählen können.

Eine gute Praxis ist die Verwendung der Farbwerte von Discourse anstelle von “harten” Farben wie red, #FF0000 oder rgb(255,0,0).

Hier ist ein Beispiel, in dem die Hintergrundfarbe des Buttons die Primärfarbe der aktuellen Palette verwendet und der Text die Sekundärfarbe:

Text:

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);
}

So wird es für einen Benutzer aussehen, der das Farbschema Solarized Light verwendet:

Und wenn sie das Farbschema Solarized Dark verwenden:

Fazit

Sie haben nun die Grundlagen, um benutzerdefinierte Elemente mit dem [wrap]-Element und den data--Attributen zu erstellen.

Um fortgeschrittenere Anpassungen vorzunehmen, ist das Lernen von CSS von entscheidender Bedeutung. Sie werden viele Tutorials im Internet finden.

Der folgende Leitfaden von Discourse kann auch hilfreich sein: Making custom CSS changes on your site.
Die Entwickler-Tools Ihres Internet-Browsers zeigen Ihnen auch leicht die Liste der Farbwerte von Discourse und wie jedes aussieht:


:raised_hand_with_fingers_splayed: Vorschläge für Änderungen an diesem Leitfaden sind willkommen!


Dieses Dokument wird versioniert - Vorschläge für Änderungen auf github.

23 „Gefällt mir“

Danke @Canapin

Ein gutes Beispiel für eine Theme-Komponente, die einige dieser Konzepte verwendet, ist diese:

4 „Gefällt mir“

Gute Arbeit!

Ich bin gespannt, welche kreativen Lösungen Benutzer mit dem data-Attribut noch entwickeln werden.


Gibt es einen Vorteil bei der Verwendung von HTML <span data-button> gegenüber BBCode [wrap="button"]?

2 „Gefällt mir“

Ohne viel darüber nachzudenken, würde ich sagen, dass die Verwendung eines <span> es Ihnen ermöglicht, ein inline-Element als einzigen Inhalt in einer einzelnen Zeile zu platzieren.

Die Verwendung von [wrap] in einer einzelnen Zeile ohne weiteren Inhalt daneben gibt automatisch ein block-Element aus. Der Text darin wird auch mit Absatz-Tags <p> umschlossen.

Abgesehen davon ist es wahrscheinlich Geschmackssache. Ich habe auch nicht erwähnt, dass ein [wrap] und ein HTML-Element mehrere -data-Attribute haben können, da ich nicht glaube, dass dies für die meisten Zwecke sehr nützlich ist.

3 „Gefällt mir“

So fügen Sie Bootstrap-„Karten“ in Ihre Beiträge/Themen ein

…manche mögen sagen, das ist verrückt, zu kompliziert oder übertrieben, aber ich liebe es :smiley:

  • Einige Farben hinzugefügt, um die Verschachtelung des BBCode besser erkennen zu können.

STOPP! Verwenden Sie meinen Code nicht

Verwenden Sie stattdessen den verbesserten Code von @Canapin HIER KLICKEN

BBCode zum Einfügen in Thema/Beitrag

[wrap="card"]
[wrap="card-header"]**Kartenkopfzeile**[/wrap]
[wrap="card-body"]
[wrap="card-title"]**Kartentitel**[/wrap]
[wrap="card-text"]Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext[/wrap]
[/wrap]
[/wrap]

CSS-Code zum Hinzufügen zum Thema.

// 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 „Gefällt mir“

Natürlich hängt es davon ab, was Sie hineinlegen möchten, aber um das exakt gleiche visuelle Ergebnis wie in Ihrem Beispiel zu erzielen, können Sie Ihren Code erheblich optimieren:

[wrap="card-header"]**Kartenkopfzeile**[/wrap]
[wrap="card-body"]
**Kartenüberschrift**

Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext, Kartentext
[/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 „Gefällt mir“

Ahhh! Das ist so viel besser! Vielen Dank für die Verbesserungen! <3

Schön! Wann wird das Markdown im [wrap]...[/wrap]-Element verarbeitet, oder gibt es einen Trick, um es rendern zu lassen, bevor es in den Wrap aufgenommen wird?

Zum Beispiel habe ich versucht, Text im Element als fett oder kursiv zu formatieren, und es wird nicht so gerendert – ich sehe nur _text_ oder **text** auf der Seite in meinem Browser, sobald ich sie speichere :frowning:

1 „Gefällt mir“

Es scheint tatsächlich so zu sein, dass Formatierungen (egal ob HTML, Markdown oder BBcode) in [wrap] nicht funktionieren, wenn es sich um ein Inline-Element handelt (wenn sich anderer Inhalt in derselben Zeile befindet):

Dafür müssen Sie einen <span> erstellen.

2 „Gefällt mir“