React problema con lo stacking context dopo aver applicato filter

di il
10 risposte

React problema con lo stacking context dopo aver applicato filter

Salve a tutti. Ho, grazie all'aiuto di By65Franco sono riuscito ad implementare la dark mode in un mio sito fatto interamente con react. Ma, purtroppo, l'applicazione di filter ad un banner ha creato dei problemi di stacking.

In modalità mobile quando apro la modale del menu, il banner rimane visibile. Ho provato, essendo tutti gli elementi posizionati, a giocare con lo z-index ma non c'è stato verso.

A complicare la cosa c'è anche il fatto che il pulsante del menu si trova nel componente NAV mentre il banner si trova nel componente Header. Avevo pensato di creare una funzione per spegnere il banner quando si apre il menu ma non posso farlo perchè non riesco a far uscire la funzione con lo state dal componente Header e portarlo in NAV... o meglio, non ho idea di come farlo. 

Comunque anche questa soluzione sarebbe un paliativo in quanto lo stesso problema di "sovraimpressione" ce l'ho non solo con il banner ma anche con il pulsante della dark mode anche lui rimane bello bello visibile sopra la modale

10 Risposte

  • Re: React problema con lo stacking context dopo aver applicato filter

    Ciao,

    25/05/2025 - ilchiuri ha scritto:

    l'applicazione di filter ad un banner ha creato dei problemi di stacking.

    Questo vuol dire che filter, creando un nuovo stacking, stà interferendo sul normale flusso.

    E z-index funziona solo se gli elementi si trovano sullo stesso stacking

    Se bunner e button si  trovano in contesti diversi, z-index non funziona più come dovrebbe

    25/05/2025 - ilchiuri ha scritto:

    A complicare la cosa c'è anche il fatto che il pulsante del menu si trova nel componente NAV mentre il banner si trova nel componente Header. Avevo pensato di creare una funzione per spegnere il banner quando si apre il menu ma non posso farlo perchè non riesco a far uscire la funzione con lo state dal componente Header e portarlo in NAV... o meglio, non ho idea di come farlo. 

    Perchè hai una separazione tra Header e Nav... essendo fratelli serve sollevarli dalgenitore.

    Per esempio : (ti incollo un esempio che ho trovato)

    // App.js
    import { useState } from "react";
    import Header from "./Header";
    import Nav from "./Nav";
    
    function App() {
      const [isMenuOpen, setIsMenuOpen] = useState(false);
    
      return (
        <div>
          <Header isMenuOpen={isMenuOpen} />
          <Nav isMenuOpen={isMenuOpen} setIsMenuOpen={setIsMenuOpen} />
        </div>
      );
    }
    
    export default App;
    
    
    // Header.js
    function Header({ isMenuOpen }) {
      return (
        <header style={{ background: "#222", color: "white", padding: "20px" }}>
          {!isMenuOpen && (
            <div className="banner" style={{ background: "orange", padding: "10px" }}>
              This is the banner (hidden when menu is open)
            </div>
          )}
        </header>
      );
    }
    
    export default Header;
    
    
    // Nav.js
    function Nav({ isMenuOpen, setIsMenuOpen }) {
      const toggleMenu = () => setIsMenuOpen(prev => !prev);
    
      return (
        <nav style={{ padding: "20px", background: "#444", color: "white" }}>
          <button onClick={toggleMenu}>
            {isMenuOpen ? "Close Menu" : "Open Menu"}
          </button>
          {isMenuOpen && (
            <div
              style={{
                background: "rgba(0,0,0,0.9)",
                color: "white",
                padding: "20px",
                marginTop: "10px"
              }}
            >
              This is the menu content
            </div>
          )}
        </nav>
      );
    }
    
    export default Nav;
    

    In questo cosa:

    • Il banner nel header scompare quando il menu si apre
    • Il menu nel Nav è visibile solo quando isMenuOpen è true.
    • E la funzione che apre e chiude il menu è in App

    Adesso puoi applicare il dark mode senza infierire sui componenti.... ma sempre a livello di app e non dentro i componenti.
    In questo modo tutti i componenti reagiranno al darkmode
    Esempio:

    function App() {
      const [isDarkMode, setIsDarkMode] = useState(false);
    
      return (
        <div className={isDarkMode ? 'dark' : ''}>
          <Nav isDarkMode={isDarkMode} toggleDarkMode={() => setIsDarkMode(!isDarkMode)} />
          <Header isDarkMode={isDarkMode} />
          {/* altri componenti */}
        </div>
      );
    }
    
  • Re: React problema con lo stacking context dopo aver applicato filter

    Ma così devo spostare tutta la logica della dark mode su app al posto che tenerla su header????? Per un banner fituso!!! Nooooooooo!!!!! 

    Non dirmelo!!!! 

    Cioè per un filter devo fare una modifica sostanziale al codice di un sito intero????? Ma questa non è vita!!!

  • Re: React problema con lo stacking context dopo aver applicato filter

    A questo punto faccio prima a spostare tutto il jsx del NAV nella header e allora a quel punto faccio quello che voglio con lo z-index o con lo scope della funzione... sono tutti li

  • Re: React problema con lo stacking context dopo aver applicato filter

    25/05/2025 - ilchiuri ha scritto:

    A questo punto faccio prima a spostare tutto il jsx del NAV nella header e allora a quel punto faccio quello che voglio con lo z-index o con lo scope della funzione... sono tutti li

    ti capisco, diventa faticoso.... Purtroppo ti crea un nuovo stacking là dove già ne esiste uno e da lì in poi va tutto a pallino...  ;-(

    E' fondamentale la struttura... se ben organizzata ne esci indenne, altrimenti qualche problemino prima o dopo viene fuori.

  • Re: React problema con lo stacking context dopo aver applicato filter

    Allora, ho spostato tutto il nav dentro l'header... adesso con lo z-index tutto funziona perfettamente... mi rimane solo un dubbio

    come ti avevo detto oltre al banner compariva nel menu anche il tastino della dark mode... se gli metto z-index -1 non si vede quando apro il menu, ma il tasto non è nemmeno più cliccabile... se invece lo lascio anche con z-index 0 il tasto è cliccabile, funziona, ma compare piccolino li anche quando apre il menu (non dà tanto fastidio quindi l'idea è di lasciarlo) ma giusto per capire come mai... e se c'è un modo per risolverlo

  • Re: React problema con lo stacking context dopo aver applicato filter

    Se imposti z-index: 0 o auto, rimane visibile e cliccabile anche se risulta dietro alla modale.  
    - o lo rendi invisibile :   { !isMenuOpen && <DarkModeButton /> } temporaneamente
    - o lo potresti spostare quando il menu risulta aperto utilizzando una condizione:   
    <button className={isMenuOpen ? 'dark-button-hidden' : 'dark-button-visible'} />
    e allora... 

    .dark-button-hidden {
      opacity: 0;
      pointer-events: none;
    }
    
    .dark-button-visible {
      opacity: 1;
    }

    - oppure lo tieni fuori dal flusso e gli dai il layout che preferisci e non sarà influenzato dalla modale che lo sposta secondo le sue necessità e non hai più a che fare con z.index  

  • Re: React problema con lo stacking context dopo aver applicato filter

    Grazie mille per i suggerimenti... ti dico come mi sono mosso.

    Ho provato lo z-index auto... niente di fatto... allora mi sono ricordato di un effetto css...

    Ho spostato il pulsante fuori dallo schermo, si vede solo un pezzo di padding, all'hover del mouse il pulsante compare e si può mettere o togliere la dark mode.

    Il background color del pulsante è uguale a quello del menu... morale della favola? La linguetta scompare alla vista quando si apre il menu... quindi tutto sembra a posto.

    Ora devo verificare (ma non so come prima di pubblicarlo) se su mobile quella linguetta toccandola esce fuori e sta fuori già così oppure devo usare una pseudo classe tipo focus o focus visible

  • Re: React problema con lo stacking context dopo aver applicato filter

    26/05/2025 - ilchiuri ha scritto:

    Grazie mille per i suggerimenti... ti dico come mi sono mosso.

    Ho provato lo z-index auto... niente di fatto... allora mi sono ricordato di un effetto css...

    Ciao,

    bene!  direi che hai scelto la soluzione più pulita e di facile manutenzione nel tempo.

    Bravo!

    Fammi sapere per il Mobile come si comporta, sono curioso  ;-)

  • Re: React problema con lo stacking context dopo aver applicato filter

    Ho messo tutto online... non è male come effetto. Toccando nella linguetta esce fuori e resta fuori fino a quando non si tocca da qualche altra parte... nel menu non si vede... direi perfetto... l'unico problemino è che bisognerebbe trovare un modo per far capire che la dark mode si trova li... da mobile intendo... anche se la linguetta è ben visibile...

    Per ora lascio tutto così se mi viene in mente qualcosa implemento... tanto in quel sito c'è sempre qualcosa da aggiungere.

    Grazie mille... 

  • Re: React problema con lo stacking context dopo aver applicato filter

    26/05/2025 - ilchiuri ha scritto:

    Per ora lascio tutto così se mi viene in mente qualcosa implemento... tanto in quel sito c'è sempre qualcosa da aggiungere.

    e già.... comunque mi sembra tu abbia fatto un buon lavoro

    Bene così

    alla prox

Devi accedere o registrarti per scrivere nel forum
10 risposte