Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di madquake
    Registrato dal
    Jun 2008
    residenza
    Manchester
    Messaggi
    85

    Porre un <div> sopra un altro <div>

    Salve a tutti,
    Ho un problemone enorme generato da un sito creato con Wordpress. So che questo � un forum legato ad html e css [e altri linguaggi] e che i cms non vengono qui trattati, ma questo problema � inerente proprio il CSS.

    Sto tentando di modificare un template in maniera tale da adattarlo alle mie esigenze. Pur sapendo costruire siti in html e css non sono ancora molto pratico di siti dinamici costruiti partendo da zero [questo � ahim� il motivo per il quale utilizzo Wordpress].

    Il sito in questione � quello del mio portfolio personale [sono un motion graphics designer]. Nella home mi ritrovo con una griglia di immagini e testi, in cui ciascun elemento porta alla pagina inerente quel particolare progetto.
    Il template fa esattamente quello che voglio, solo che la griglia sulla home fa troppo "ragioniere" e poco "creativo". Vorrei utilizzare quella figata di script che si chiama "Masonry" che permette di creare un pattern di immagini pi� o meno grandi riempiendo tutto lo spazio. I miei amici pi� esperti la fanno abbastanza facile, dicendo che basta modificare qua e la... in realt� prendo questo problema come un modo per imparare qualcosa di nuovo. Senza addentrarmi nel "Masonry" script, cosa alla quale arriver� con moltissima calma forse in un'altra vita, quello che sto cercando di fare � porre i testi di descrizione delle immagini al di sopra delle stesse. Una volta fatto questo, con l'aiuto di qualche divinit� dell'informatica riuscir� a far apparire i testi con qualche bell'effetto solo quando ci si passa sopra col mouse. Html e css sono per� gli stessi sia in Wordpress che al di fuori di esso e quindi porgo a voi il quesito... Come faccio a portare il div contenente il testo al di sopra delle immagini?

    Il sistema nel sito � abbastanza semplice... ho un <div> che contiene tutto il resto e che � allineato al centro della pagina. All'interno di esso una serie di <div>, uno per ogni progetto. Ogniuno di questi div interni � a sua volta composto da due <div>... uno contente l'immagine e uno il testo.
    Voi mi direte... allora basta utilizzare il parametro z-index, il quale permette di specificare su quale "livello" piazzare ogni elemento. In realt� non � cos� semplice, in quanto questo parametro funziona [da quanto ho capito] solo se il parametro "position" del div contenente l'immagine � settato su "absolute". Il problema che ho col template � che settando questo parametro in questo modo tutte le immagini vengono poste una sull'altra [questo perch� per intanto ho ignorato il div contenente il testo attraverso il parametro display: none;]. Se invece il testo fosse visibile la griglia originale si sfalderebbe tutta.

    Ho preparato un piccolo esempio in maniera tale da capire meglio di cosa sto parlando:

    codice:
    <html>    <head>
            <title>PROVA CON Z-INDEX</title>
    
    
    <style>
        .tutto{
    background-color: gold;
    width: 900px;
    height: 100%;
    position: relative;
    margin: 0 auto;
    }
    
    
        .sotto{
    position: absolute;
    width: 280px;
    height: 280px;
    background-color: #fff;
    }
    
    
        .sopra{
    position: relative;
    width: 280px;
    height: 280px;
        }
    
    
        .container{
    padding: 0px;
    position: relative;
        }
    
    
        .interno{
    float: left;
    padding: 10px;
    position: relative;
        }
    </style>
    
    
        </head>
        <body>
    <div class="tutto">
    
    
    <div class="container">
    
    
    <div class="interno">
    <div class="sotto">
        
    </div>
            
    <div class="sopra">
        Ciao Ragazzi!
    </div>
    </div>
    
    
    <div class="interno">
    <div class="sotto">
    
    
    </div>
            
    <div class="sopra">
        Funziona?
    </div>
    </div>
    
    
    <div class="interno">
    <div class="sotto">
        
    </div>
            
    <div class="sopra">
        Prova
    </div>
    </div>
    
    
    <div class="interno">
    <div class="sotto">
        
    </div>
            
    <div class="sopra">
        Uno
    </div>
    </div>
    
    
    <div class="interno">
    <div class="sotto">
    
    
    </div>
            
    <div class="sopra">
        DUE
    </div>
    </div>
    
    
    <div class="interno">
    <div class="sotto">
        
    </div>
            
    <div class="sopra">
        TRE
    </div>
    </div>
    
    
    </div>
    
    
    </div>
        </body>
    </html>
    Come si nota .sotto ha come parametro position:absolute; in quanto cambiando questo con "relative" i <div> .sopra smettono di stare "sopra".

    Se volete posso postare l'indirizzo del mio sito in maniera tale da provare a capirci qualcosa di pi�... Ispezionando gli elementi � possibile vedere come questo sia costruito.
    So che questo � veramente un piccolo passo per uno che vorrebbe arrivare a creare una griglia "Masonry" modificando un template di Wp, ma come dice zio Paperone "Per fare i miliardi bisogna partire dai penny".
    Scherzi a parte... il web design � fatto di piccole cose messe insieme, quindi un pezzo oggi, uno domani fra qualche centinaio d'anni dovrei essere in grado di mettere insieme qualcosa di decente

    Grazie mille a tutti quelli che vorranno darmi un aiuto... molto molto apprezzato
    Spero che questo possa essere d'aiuto anche ad altri neofiti come me!

    Ciao a tutti!

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,691
    Ciao.

    Come faccio a portare il div contenente il testo al di sopra delle immagini?
    Credo che in questo caso non serva utilizzare z-index.

    Come si nota .sotto ha come parametro position:absolute; in quanto cambiando questo con "relative" i <div> .sopra smettono di stare "sopra".
    Ti spiego: questo comportamento è dato dal fatto che l'elemento a cui attribuisci position absolute viene tolto dal normale flusso del testo con la conseguenza che lo spazio originariamente occupato va a collassarsi e i contenuti a seguire vanno ad occupare quello spazio. A differenza invece di position relative per cui lo spazio, che occuperebbe originariamente l'elemento a cui è applicato, resta invariato.

    A mio parere puoi lasciare il div immagine con position static (di default), dovrai invece applicare il position absolute solo al div testo. La conseguenza è che il testo risulti in un livello superiore rispetto all'immagine, anche senza dover intervenire sullo z-index.

    Il discorso cade però nell'uso delle proprietà di posizionamento (top, right, bottom, left). Se non specificate, l'elemento a cui hai applicato position absolute, resterà nella sua posizione originaria (a parte che sarà tolto dal normale flusso del testo, come spiegato sopra). Per cui ti basterà specificare opportunamente tali proprietà per ottenere il posizionamento desiderato. Generalmente si usa azzerare top e left in modo che l'elemento si porti in alto a sinistra rispetto al suo contenitore di riferimento (cioè il contenitore più prossimo, nell'ordine gerarchico, che abbia position diverso da static).

    Chiaramente si tratta di nozioni di base, ma già se riesci a capire questi concetti potrai proseguire in modo più logico. Per approfondire meglio ti invito a seguire qualche guida CSS sul posizionamento. Nel caso puoi dare uno sguardo tra i link utili, c'è molto materiale su cui puoi studiare e prendere spunto.

    Qualche nota sul tuo codice:
    - Sempre meglio specificare il doctype.
    - Sempre consigliabile specificare l'encoding della pagina.
    - Si consiglia, in linea generale, di usare nomi autoesplicativi per le classi, cioè che possano rendere l'idea del ruolo che ha quello specifico elemento.
    - Fai attenzione quando imposti height:100% ad un elemento contenitore che è figlio diretto di body. In tal caso, per funzionare, bisognerà specificare height anche sugli elementi body e html. In questi casi, si consiglia inoltre di usare min-height anziché height (vedi questo articolo). Ad ogni modo, nel tuo caso, non mi sembra ci sia bisogno di impostare height:100% sul contenitore (vedi mio esempio sotto).
    - Fai piutosto attenzione quando usi il float su elementi contenuti dentro un elemento senza float. Se tutto il contenuto è flottante allora il contenitore collasserà. Ci sono comunque vari sistemi per ovviare a questo (vedi mio esempio sotto).

    Per l'effetto che vuoi applicare, per la comparsa del testo, bisogna capire esattamente cosa vuoi ottenere. Ora, senza addentrarsi in script di terzi, puoi giusto provare a dare qualche semplice effettodi transizione sul testo. Per fare questo puoi usare la proprietà transition.

    Il consiglio poi è quello di cercare sul web qualche effetto che ti piaccia e provare a riprodurlo tu stesso col CSS, cercando magari di capire come è stato elaborato ed eventualmente, se dovesse servire, chiedendo aiuto sul forum.

    Giusto come spunto, posto un esempio che ho elaborato partendo dal tuo codice:
    codice:
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>Esempio</title>
        <meta charset="utf-8">
        <style>
          html,body{
            margin: 0;
            padding: 0;
            background: #445;
          }
          .tutto{
            width: 900px;
            position: relative;
            margin: 0 auto;
            background: gold;
          }
          .tutto:after{
            content: '';
            display: block;
            clear: both; /* Interrompe l'effetto del float applicato ai box. Evita che il contenitore collassi su se stesso */
          }
          .box{
            width: 280px;
            height: 280px;
            margin: 10px;
            float: left;
            position: relative;
            overflow: hidden;
            cursor: pointer;
            box-shadow: 0 0 2px rgba(0,0,0,.1);
            transition: .4s;
          }
          .img{
            position: relative;
            width: 100%;
            height: 100%;
            background: #ffe;
          }
          .txt{
            position: relative;
            left: 0;
            bottom: 0;
            height: 40px;
            opacity: 0;
            color: #003;
            background: rgba(200,150,0,.3);
            text-align: center;
            transition: .4s;
          }
          .box:hover>.txt{
            bottom: 40px;
            opacity: 1;
          }
          .box:hover{
            box-shadow: 0 0 6px rgba(0,0,0,.5);
          }
        </style>
      </head>
      <body>
        <div class="tutto">
          <div class="container">
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Ciao Ragazzi!
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Funziona?
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Prova
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Uno
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                DUE
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                TRE
              </div>
            </div>
          </div>
        </div>
      </body>
    </html>
    Buon lavoro
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Utente di HTML.it L'avatar di madquake
    Registrato dal
    Jun 2008
    residenza
    Manchester
    Messaggi
    85
    Ciao KillerWorm!
    Grazie mille della risposta! Appena ho un attimo lo provo e ti aggiorno su come è andata!

  4. #4
    Utente di HTML.it L'avatar di madquake
    Registrato dal
    Jun 2008
    residenza
    Manchester
    Messaggi
    85
    Ho avuto modo di leggere bene quello che mi hai scritto e ti devo veramente ringraziare perché hai specificato delle nozioni non richieste ma che sono veramente utili... me ne ricorderò anche per le prossime pagine che creerò nelle quali il problema del posizionamento sopra non sarà presente...

    Molto molto utile il consiglio di non specificare "float" su elementi contenuti in altri neo quali questo attributo non è presente... e ancora più utile quello riferito alla specifica di min-height!

    In realtà il codice che ho postato qui lo ho creato con meno elementi possibile in maniera tale da verificare quale fosse il problema effettivo. Il mio sito essendo stato creato in Wordpress ha tutti i problemi del cms... in molti casi non sono realmente in grado di capire se un elemento faccia parte del css o sia generato attraverso il codice... nel primo caso sono in grado di modificarlo o nel caso di chiedere come fare, ma nel secondo no... ho provato a imparare php ma non so per quale motivo arrivo a un certo punto e trovo un muro... e non riesco a proseguire. E' come se dopo aver fatto calcolare al server quanto fa 2 + 2 lo step successivo sia creare un tetris partendo dal codice... non fraintendermi... se riuscissi a imparare sarei non felice, di piu... mi interessa molto anche la parte di coding.

    Non so se proseguire coi miei esperimenti in questo specifico post... magari qualcuno è interessato a vedere come questo vada avanti, visto che questo tipo di problemi sono molto comuni.

    Non so se sul forum si tratti anche l'argomento Wordpress... Ho notato che esistono due forum specifici, me in uno richiedono di registrarsi e pubblicare tramite i loro server, in quanto essi stessi mettono mano al codice per tuo conto... e per me questa soluzione è da escludere in quanto quello che voglio è proprio imparare come fare... Nel secondo forum invece pare non ci sia una comunità così vivace... quindi c'è poco da imparare...

    Sapete per caso se qui si tratta Wordpress, anche solo per cose inerenti modifiche al codice in maniera tale da ottenere effetti desiderati?
    Grazie mille

    Chiedo perdono per la lunghezza del post...

  5. #5
    Utente di HTML.it L'avatar di madquake
    Registrato dal
    Jun 2008
    residenza
    Manchester
    Messaggi
    85
    Ho provato a sperimentare un po col tuo codice in maniera tale da capire ciò che ancora non conosco... In realtà non so bene cosa ho capito...
    Andando per ordine:
    .tutto:after dovrebbe inserire un elemento dopo .tutto. Quindi modificando questo in .tutto:before l'elemento in questione dovrebbe essere inserito prima degli altri contenuti. A noi in realtà cambierebbe poco in quanto la posizione di .txt cambia a seconda se il mouse sia sopra o meno.

    Volevo però provare a far comparire gli elementi non da sotto ma da sopra e ho modificato il codice in questa maniera:

    codice:
    <head>    <title>Esempio</title>
        <meta charset="utf-8">
        <style>
          html,body{
            margin: 0;
            padding: 0;
            background: #445;
          }
          .tutto{
            width: 900px;
            position: relative;
            margin: 0 auto;
            background: gold;
          }
          .tutto:before{
            content: '';
            display: block;
            clear: both; /* Interrompe l'effetto del float applicato ai box. Evita che il contenitore collassi su se stesso */
          }
          .box{
            width: 280px;
            height: 280px;
            margin: 10px;
            float: left;
            position: relative;
            overflow: hidden;
            cursor: pointer;
            box-shadow: 0 0 2px rgba(0,0,0,.1);
            transition: .4s;
          }
          .img{
            position: relative;
            width: 100%;
            height: 100%;
            background: #ffe;
          }
          .txt{
            position: relative;
            left: 0;
            top: 0;
            height: 40px;
            opacity: 0;
            color: #003;
            background: rgba(200,150,0,.3);
            text-align: center;
            transition: .4s;
          }
          .box:hover>.txt{
            top: -40px;
            opacity: 1;
          }
          .box:hover{
            box-shadow: 0 0 6px rgba(0,0,0,.5);
          }
        </style>
      </head>
      <body>
        <div class="tutto">
          <div class="container">
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Ciao Ragazzi!
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Funziona?
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Prova
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Uno
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                DUE
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                TRE
              </div>
            </div>
          </div>
        </div>
      </body>
    </html>
    Il problema è che non cambia nulla.
    Ti spiego cosa avevo nella mente in maniera tale da capire dove sia il mio errore e di conseguenza correggerlo...
    In teoria modificando l'attributo bottom con top dovrei spostare il punto di ancoraggio [la distanza dell'origine del div] da sotto a sopra. Di conseguenza impostandola a -40px [va in giu non in su] non dovrebbe comparire da sopra?

    Credo di aver sbagliato qualcosa...

  6. #6
    Utente di HTML.it L'avatar di madquake
    Registrato dal
    Jun 2008
    residenza
    Manchester
    Messaggi
    85
    Perdono... ci sto smanettando e ho capito qualche errore... chiedo scusa per aver scritto in preda all'ansia da comprensione!

  7. #7
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,691
    Perdono... ci sto smanettando e ho capito qualche errore... chiedo scusa per aver scritto in preda all'ansia da comprensione!
    No problem. Non capisco però se hai quindi risolto o se ti serve ancora aiuto.

    Non so se sul forum si tratti anche l'argomento Wordpress...
    Non in maniera specifica ma, nel caso di argomenti che riguardano in generale il mondo dei CMS, puoi postare nella relativa sezione CMS.

    .tutto:after dovrebbe inserire un elemento dopo .tutto
    Sì, più precisamente lo inserisce dentro .tutto ma dopo i suoi contenuti.
    Ho usato questo sistema (uno dei vari clearfix hack) per risolvere il problema del float.
    In genere, un sistema alternativo (e più pulito) può essere quello di impostare overflow:auto sull'elemento contenitore (in questo caso su .tutto).
    Non ha comunque nulla a che fare con l'effetto del testo.
    Ad ogni modo ci sono altri sistemi più odierni per disporre al meglio gli elementi. Vedi l'uso di flexbox. Puoi trovare varie guide e informazioni tra i link utili capitolo 9.

    Mi sono reso conto che nel codice che ti ho postato sopra, alla fine (tra le prove che stavo facendo) ho postato quello con position:relative sui due div testo e immagine, anziché usare absolute sul testo come ti avevo indicato . Scusa per l'eventuale confusione creata.

    Posto quindi il codice rivisto (come da indicazioni iniziali), usando inoltre overflow:auto e l'effetto di uscita dall'alto. Può esserti utile a capire meglio il meccanismo di funzionamento delle transizioni.
    codice:
    <!DOCTYPE HTML>
    <html>
      <head>
        <title>Esempio</title>
        <meta charset="utf-8">
        <style>
          html,body{
            margin: 0;
            padding: 0;
            background: #445;
          }
          .tutto{
            width: 900px;
            position: relative;
            margin: 0 auto;
            background: gold;
            overflow: auto;
          }
          .box{
            width: 280px;
            height: 280px;
            margin: 10px;
            float: left;
            position: relative;
            overflow: hidden;
            cursor: pointer;
            box-shadow: 0 0 2px rgba(0,0,0,.1);
            transition: .4s;
          }
          .img{
            width: 100%;
            height: 100%;
            background: #ffe;
          }
          .txt{
            position: absolute;
            width: 100%;
            left: 0;
            top: -40px;
            height: 40px;
            opacity: 0;
            color: #003;
            background: rgba(200,150,0,.3);
            text-align: center;
            transition: .4s;
          }
          .box:hover>.txt{
            top: 0;
            opacity: 1;
          }
          .box:hover{
            box-shadow: 0 0 6px rgba(0,0,0,.5);
          }
        </style>
      </head>
      <body>
        <div class="tutto">
          <div class="container">
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Ciao Ragazzi!
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Funziona?
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Prova
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                Uno
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                DUE
              </div>
            </div>
            <div class="box">
              <div class="img">
              </div>
              <div class="txt">
                TRE
              </div>
            </div>
          </div>
        </div>
      </body>
    </html>
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.