Impedire alla barra dell'ultima visita di rovinare i colori

Abbiamo impostato colori alternati per tutti i nostri post (e piccole azioni) tramite nth-child, che appare così:

Tuttavia, la novità di 2.8 “ultima visita” conta come piccola azione, e quindi finisce per essere inclusa in questi colori alternati dei post:

Quello che ci piacerebbe di più è avere qualcosa di simile a quanto segue:

Dove la barra “ultima visita” non venga conteggiata come figlio ai fini di nth-child nel determinare di quale colore dovrebbe essere il suo sfondo.

La mia prima idea è stata di usare JavaScript per aggiungere semplicemente un nuovo div dopo qualsiasi barra dell’ultima visita, il che funziona come desiderato:

tramite

<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>

Tuttavia, quando scorri su o giù, ci sono un sacco di problemi che questo sembra causare, da post che semplicemente si rifiutano di caricarsi a enormi spazi vuoti a qualunque cosa stia succedendo nella terza immagine:



Qualcuno ha un’idea migliore su come possiamo raggiungere questo obiettivo?

Prova qualcosa del genere.

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

Sebbene ciò lo renda più sottile, non è questo il problema qui: l’esempio che ho fornito come ideale è stato realizzato da me modificando il CSS, il che è fondamentalmente banale: il problema è che il colore di sfondo dei nostri post viene gestito tramite un selettore nth-child e l’elemento .small-action.topic-post-visited conta come figlio e quindi attiva nth-child quando non vogliamo che lo faccia.

Visivamente, ciò darebbe questo:

Dove il colore chiaro viene utilizzato come sfondo per l’ultimo elemento visitato, facendo sì che il post direttamente sopra e sotto siano entrambi del nostro colore più scuro.

Contrasto con il nostro ideale, dove l’alternanza dei colori ignora questo nuovo elemento:

Otteniamo anche un comportamento divertente quando scorri abbastanza lontano da scaricare la barra: i post lampeggiano avanti e indietro mentre il sito decide di nuovo cosa colorare come cosa quando la barra “ultima visita” scompare.

Questo è incredibilmente poco ideale e, considerando i colori alternati, vale più per noi dell’indicatore dell’ultima visita, vorremmo molto un modo per affrontare questo problema correttamente o semplicemente disabilitare completamente la funzionalità.

Okay, quindi supponendo dalla mancanza di risposte che questo sia impossibile

Come possiamo disabilitare completamente la funzionalità?

Non vale la pena che tutti i nostri post lampeggino a colori per una barra temporanea

Non funzionerà con :nth-child o :nth-of-type. Questi contano solo gli elementi figli, quindi non sono specifici per la classe e non c’è modo di filtrare per classe.

In realtà avrai bisogno di :nth-child(2n of .topic-post), ma questo è supportato solo da Safari per ora.


Ma puoi provare qualcosa del genere.

Header
Aggiungerà questa classe .every-second a ogni secondo post escludendo le piccole azioni, quindi solo i post dell’argomento. Quindi puoi facilmente puntarlo con il CSS.

<script type="0.8 discourse-plugin">
  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;
}

Linea del post visitato dell’argomento


Scorrimento

1 Mi Piace

Non è possibile utilizzare un selettore più specifico qui per rimanere in una soluzione CSS pura?

Puoi condividere uno snippet della tua attuale regola CSS?

1 Mi Piace

È possibile ottenere lo stesso effetto usando solo CSS, ma è un po’ una forzatura e funzionerà solo nello stream dei post. Non funzionerà nell’elenco degli argomenti. Sarà necessario Javascript poiché solo Safari seleziona la sintassi :nth-child( di <selettore>) e, per quanto ne so, non ci sono attributi che possano essere presi di mira per applicare l’effetto.

@orangeandblack5, devi selezionare l’elemento article all’interno dei post. Nota che l’attributo id segue il pattern id=post_N dove N è il numero del post nello stream.

Quindi puoi selezionare solo quelli pari con qualcosa come il CSS sottostante:

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

Posso provarci, ma includendo piccole azioni questa settimana - speravo in una soluzione CSS pura, se possibile, ma anche noi non abbiamo avuto fortuna con quella.

Fatto divertente: non tutte le piccole azioni sono create uguali!

Ho pensato di provare l’idea del puro CSS e, sfortunatamente, mentre alcune piccole azioni (come bloccare, sbloccare o fissare un thread) contano come un post completo e ottengono il proprio ID univoco che potremmo usare per colorarle, non tutte lo fanno.

Nota che questo influisce anche sulla correzione JS fornita da @Don: vedrò se riesco a trovare un modo per aggirare questo problema, ma la mia conoscenza di JS è molto più rudimentale di quella di CSS.