La nostra soluzione per sfocare i contenuti NSFW

Nel forum di Blender Artists abbiamo una politica sui contenuti piuttosto liberale che consente nudità e violenza (entro certi limiti). Sebbene la maggior parte dei membri sia a suo agio con questo tipo di contenuti, esistono ovviamente pubblici e situazioni in cui non è appropriato (per noi principalmente scuole e bambini). Dato che facciamo ampio uso di gallerie a piastrelle con il plugin Topic List Preview, avevamo bisogno di un modo per rendere questo tipo di contenuti opzionali e tenerli nascosti di default.

La soluzione è stata più semplice da implementare del previsto e ho deciso di condividerla qui nel caso in cui qualcun altro possa trarne beneficio. Avvertenza: linkerò a contenuti NSFW. Andiamo!

Richiedevamo già il tag #nsfw per tutti i post pertinenti e lo abbiamo applicato rigorosamente negli ultimi mesi. Il nostro plugin AdSense è configurato per non mostrare annunci su queste pagine, poiché ciò ci avrebbe (e lo ha già!) messo nei guai con Google. (Un grande grazie a @neil per aver aggiunto questa funzione!)

Utilizzando del CSS, abbiamo aggiunto un effetto sfocatura e un testo di sovrapposizione per tutti i media all’interno di tali argomenti. La sfocatura verrà rimossa al passaggio del mouse:

/* visualizza sfocatura NSFW e testo di sovrapposizione su tutti i media negli argomenti #nsfw */
.tag-nsfw { 
	.topic-body .cooked img, 
	.topic-body .cooked iframe, 
	.topic-body .cooked .lazyYT-container, 
	.topic-thumbnail img {
        filter: blur(10px);	
        -webkit-transition: .3s ease-in-out;
        transition: .2s ease-in-out;
	}

	.topic-body:hover .cooked img, 
	.topic-body:hover .cooked iframe,
	.topic-body:hover .cooked .lazyYT-container, 			
	.topic-thumbnail:hover img {
        filter: blur(0);	
        -webkit-transition: .3s ease-in-out;
        transition: .2s ease-in-out;
	}

	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before,
	.topic-thumbnail a:before {
	    z-index:2;
        padding: 5px;
        font-size:1em;
        position:absolute;

        color:#fff;
        content: '⚠️ Contenuto maturo - Passa il mouse per mostrare';
        background: #e86800;

	}
	
	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before {
        top: 15px;
        left: 10px;
	}

	.topic-thumbnail a:before {
        top: 65px;
        left: 20px;
	}
	
	.topic-body .cooked a.lightbox:hover:before, 
	.topic-body .cooked iframe:hover:before,
	.topic-thumbnail a:hover:before {		
	    display:none;
	}
}

Immagini e video in un argomento ora appaiono così:

E in tutte le gallerie a piastrelle TLP, abbiamo:

Successivamente, abbiamo aggiunto una preferenza che permette agli utenti di disabilitare la sfocatura per il proprio account. Si è rivelato più semplice da implementare di quanto pensassi, utilizzando campi personalizzati.

Abbiamo iniziato creando un campo personalizzato di tipo casella di controllo:

Poi, abbiamo riutilizzato del codice per aggiungere il tag ‘nsfw-always-show’ alla classe del body per questi utenti:

<!-- aggiungi le preferenze NSFW dell'utente corrente al tag body -->
<script type="text/discourse-plugin" version="0.8">

// https://meta.discourse.org/t/css-classes-for-group-membership-for-simplified-ui-mode/60838/2
if (window.jQuery) {
    window.jQuery(function ($) {
        var u = Discourse.User.current();

        // mostra sempre NSFW
        if (u.custom_fields.user_field_2) {
            console.log('mostra nsfw per l\'utente');
            $('body').addClass('nsfw-always-show' );
        }

    });
};

</script>

Un ultimo pezzo di CSS rimuove la sfocatura per questi utenti:

/* nascondi campi personalizzati dal modulo di registrazione */

.login-form .user-fields {display:none;}

/* disabilita sfocatura NSFW per gli utenti che lo hanno impostato nelle loro preferenze */

.nsfw-always-show .tag-nsfw {
	.topic-body .cooked img, 
	.topic-body .cooked iframe, 
	.topic-body .cooked .lazyYT-container, 
	.topic-thumbnail img {
        filter: blur(0px);	
	}
	
	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before,
	.topic-thumbnail a:before {
	    display:none;
	    content: none;
	}
}

Un problema noto con questo approccio è che non funziona ancora bene su mobile, poiché :hover non è supportato.

Se vuoi vedere questo in azione puoi visitare la nostra pagina del tag #nsfw, ma, beh, potresti vedere alcuni contenuti NSFW lì :slight_smile:

Spero che questo sia stato utile per qualcuno!

55 Mi Piace

Inoltre, su desktop, se un’immagine occupa spazio sullo schermo, puoi facilmente passarci sopra con il mouse per errore.
Invece di passare con il mouse per rimuovere la sfocatura, che ne dici di aggiungere dinamicamente un pulsante “mostra l’immagine NSFW” sopra o sotto ogni immagine NSFW?

4 Mi Piace

Su krita-artists.org l’abbiamo leggermente modificato in modo che si attivi al clic e non al passaggio del mouse. Tuttavia, l’impostazione utilizzata nel profilo non funziona. Anche se l’utente ha impostato la visualizzazione dei contenuti NSFW, riceve comunque i contenuti sfocati. Esiste una soluzione?

Non riesco più a modificare il mio OP, ma ecco il codice aggiornato. Ti dispiace condividere anche la tua soluzione ‘on click’?

<!-- aggiungi le preferenze NSFW dell'utente corrente al tag body -->
<script type="text/discourse-plugin" version="0.8.7">

// https://meta.discourse.org/t/css-classes-for-group-membership-for-simplified-ui-mode/60838/2
if (window.jQuery) {
    window.jQuery(function ($) {

        let currentUser = api.getCurrentUser();
        
        if (currentUser) {
            api.container.lookup('store:main').find('user', currentUser.username).then((user) => {

                if (user.user_fields[2]) {
                    $('body').addClass('nsfw-always-show' );
                }
            });
        }
    });
};
</script>
2 Mi Piace

La nostra soluzione onlick è un po’ un lavoro di fortuna e penso che potrebbe non essere ideale: abbiamo semplicemente rimosso l’effetto sfocatura dall’hover e aggiunto lo sfocato come valore predefinito. Anche il messaggio è stato modificato per indicare che l’utente deve cliccare per accedere al post. Ora l’utente deve cliccare per andare al post e cliccare di nuovo per rivelare l’immagine NSFW nella lightbox. È macchinoso, ma previene la visualizzazione accidentale tramite hover. Potrebbe essere utile utilizzare JavaScript per rimuovere lo sfocato al clic.

/* visualizza sfocatura e testo di sovrapposizione per i contenuti NSFW in qualsiasi media nei topic #nsfw */
.tag-nsfw { 
.topic-thumbnail {
    overflow:hidden;
}

	.topic-body .cooked .lightbox img, 
	.topic-body .cooked iframe, 
	.topic-body .cooked .lazyYT-container, 
	.topic-thumbnail img {
    filter: blur(30px);	
    -webkit-transition: .3s ease-in-out;
    transition: .2s ease-in-out;
	}

	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before,
	.topic-thumbnail a:before {
	    z-index:2;
    padding: 5px;
    font-size:1em;
    position:absolute;

    color:#fff;
    content: '⚠️ Contenuto maturo - Clicca per vedere l'immagine';
    background: #000;

	}
	
	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before {
    top: 50%;
    left: 10px;
    right: 10px;
    text-align:center;
	}

	.topic-thumbnail a:before {
    top: 65px;
    left: 20px;
	}
	
}

/* nascondi campi personalizzati dal modulo di registrazione */
.login-form .user-fields {display:none;}

/* disabilita lo sfocamento NSFW per gli utenti che lo hanno impostato nelle loro preferenze */
.nsfw-always-show .tag-nsfw {
	.topic-body .cooked img, 
	.topic-body .cooked iframe, 
	.topic-body .cooked .lazyYT-container, 
	.topic-thumbnail img {
    filter: blur(0px);	
	}
	
	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before,
	.topic-thumbnail a:before {
	    display:none;
	    content: none;
	}
}

@bartv @Terrapop

Se qualcuno volesse occuparsene, è possibile utilizzare Discourse Image Filter per creare un plugin di auto sfocatura NSFW.

4 Mi Piace

Ciao, cosa devo fare per rimuovere l’effetto sfocato e rendere invece il testo un iperlink, dato che vogliamo che punti a una donazione esterna?

1 Mi Piace

Mi dispiace, ma non puoi farlo solo con CSS; dovrai aggiungere il tuo codice per farlo.

2 Mi Piace

Basta rimuovere le righe filter: blur(10px); dal CSS.

5 Mi Piace

@bartv Ho creato il primo post come wiki, sentiti libero di aggiornarlo se necessario! :folded_hands:

10 Mi Piace