Verhindern Sie, dass die Leiste für den letzten Besuch Farben durcheinander bringt

Wir haben abwechselnde Farben für alle unsere Beiträge (und kleinen Aktionen) über nth-child eingerichtet, was so aussieht:

Allerdings zählt die neue “letzter Besuch”-Funktion von 2.8 als kleine Aktion und wird daher in diese abwechselnden Beitragsfarben einbezogen:

Was wir am liebsten hätten, wäre etwas wie das Folgende:

Wo die “letzter Besuch”-Leiste nicht als Kind für die Zwecke von nth-child gezählt wird, um zu bestimmen, welche Farbe ihr Hintergrund haben soll.

Mein erster Instinkt war, JavaScript zu verwenden, um einfach ein neues div nach allen letzten Besuchsleisten hinzuzufügen, was tatsächlich wie gewünscht funktioniert:

via

<script type="text/discourse-plugin" version="0.8">
    var addedElement;
    
    api.onPageChange(() => {
        addedElement = false;
        //window.onload = lastPostFix();
    });

    async function lastPostFix()
    {
        var elements = document.getElementsByClassName('topic-post-visited');
        
        var newElement = document.createElement("div");
        newElement.classList.add('small-action');
        
        while(elements.length > 0 && !addedElement)
        {
            elements[0].parentNode.insertBefore(newElement, elements[0].nextSibling);
            addedElement = true;
        }
    }
</script>

Wenn Sie jedoch nach oben oder unten scrollen, scheint dies eine Reihe von Problemen zu verursachen, von Beiträgen, die sich einfach weigern zu laden, über riesige Leerzeichen bis hin zu dem, was auch immer auf dem dritten Bild vor sich geht:



Hat jemand eine bessere Idee, wie wir das erreichen können?

Versuchen Sie es mit etwas wie diesem.

.small-action.topic-post-visited {
  height: 0;
}

Obwohl das es dünner macht, ist das hier nicht wirklich das Problem – das Beispiel, das ich als unser Ideal gegeben habe, wurde von mir durch Bearbeiten des CSS erstellt, was im Grunde trivial ist – das Problem ist, dass unsere Hintergrundfarbe für Beiträge über einen nth-child-Selektor erfolgt und das Element .small-action.topic-post-visited als Kind gezählt wird und daher nth-child umschaltet, wenn wir das nicht wollen.

Visuell würde das Folgendes ergeben:

Wo die helle Farbe als Hintergrund für das letzte Besuchelement verwendet wird, wodurch der Beitrag direkt darüber und darunter beide unsere dunklere Farbe haben.

Kontrast mit unserem Ideal, wo das Farbwechseln dieses neue Element ignoriert:

Wir erhalten auch ein lustiges Verhalten, wenn Sie weit genug scrollen, damit die Leiste entladen wird – die Beiträge blinken alle hin und her, während die Website neu entscheidet, was als was gefärbt werden soll, wenn die „zuletzt besuchte“ Leiste verschwindet.

Das ist unglaublich ungünstig und angesichts der alternierenden Farben ist es uns mehr wert als die Anzeige des letzten Besuchs, daher hätten wir sehr gerne eine Möglichkeit, dies entweder richtig zu handhaben oder die Funktion ganz zu deaktivieren.

Okay, also in der Annahme, dass dies aufgrund der fehlenden Antworten unmöglich ist

Wie können wir die Funktion vollständig deaktivieren?

Es ist nicht lohnenswert, dass alle unsere Beiträge in Farben flackern für eine temporäre Leiste

Das wird nicht mit :nth-child oder :nth-of-type funktionieren. Diese zählen nur die Kindelemente, sind also nicht klassenspezifisch und es gibt keine Möglichkeit, nach Klasse zu filtern.

Was Sie tatsächlich benötigen, ist :nth-child(2n of .topic-post), aber dies wird bisher nur von Safari unterstützt.


Aber Sie können so etwas versuchen.

Header
Dies fügt jeder zweiten Beitragsklasse .every-second hinzu, ausgenommen kleine Aktionen, also nur Thema-Beiträge. Dann können Sie sie einfach mit CSS ansprechen.

<script type="text/discourse-plugin" version="0.8">
  api.addPostClassesCallback((attrs) => {
    const postNum = attrs.post_number;
    if (postNum % 2 === 0) {
      return ['every-second']
    }
  });
</script>

CSS

.topic-post {
  background: var(--primary-very-low);
  &.every-second {
    background: var(--primary-low);
  }
}

.small-action.topic-post-visited {
  height: 0;
}

Themenbeitrag-Besucht-Linie


Scrollen

1 „Gefällt mir“

Ist es nicht möglich, hier einen spezifischeren Selektor zu verwenden, um bei einer reinen CSS-Lösung zu bleiben?

Können Sie einen Ausschnitt Ihrer aktuellen CSS-Regel teilen?

1 „Gefällt mir“

Es ist möglich, denselben Effekt nur mit CSS zu erzielen, aber es ist irgendwie umständlich und funktioniert nur im Beitrags-Stream. Es funktioniert nicht in der Themenliste. Dort wird Javascript benötigt, da nur Safari die Syntax :nth-child( of <selector>) unterstützt und soweit ich weiß, gibt es keine Attribute, die gezielt angesprochen werden können, um den Effekt anzuwenden.

@orangeandblack5, du musst das article-Element innerhalb der Beiträge ansprechen. Beachte, dass das id-Attribut dem Muster id=post_N folgt, wobei N die Nummer des Beitrags im Stream ist.

Du kannst also nur die geraden mit etwas wie dem unten stehenden CSS ansprechen:

.topic-post {
    article[id$="0"], article[id$="2"], article[id$="4"], article[id$="6"], article[id$="8"] {
        background-color: peachpuff;
    }
}

Kann das versuchen, aber mit kleinen Aktionen diese Woche – ich hatte auf eine reine CSS-Lösung gehofft, wenn möglich, aber ja, wir hatten auch damit kein Glück.

Fun Fact – nicht alle kleinen Aktionen sind gleichwertig!

Ich habe mir überlegt, die reine CSS-Idee auszuprobieren, und leider zählen einige kleine Aktionen (wie das Sperren, Entsperren oder Anheften eines Threads) als vollständiger Beitrag und erhalten ihre eigene eindeutige ID, die wir zum Einfärben verwenden könnten, aber nicht alle tun das.

Beachten Sie, dass dies auch die von @Don bereitgestellte JS-Korrektur betrifft – ich werde sehen, ob ich einen Weg finde, dies zu umgehen, aber meine JS-Kenntnisse sind weitaus schlechter als die von CSS.