Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    Dissolvenza funziona in uscita ma non in entrata

    Ciao a tutti, avrei bisogno di supporto per risolvere una problematica CSS.

    Nel mio sito ho un form di contatto.
    A seguito dell'invio del modulo, apparirà un messaggio di conferma o di errore.

    Tutto questo viene gestito via php con l'inserimento di un codice html all'interno:

    codice:
    if ($result) {    echo "<input type='checkbox' id='success-checkbox' class='hidden-checkbox'>
              <div class='message-container'>
                <div class='success-message'>Messaggio inviato con successo!</div>
                <label for='success-checkbox' class='close-button'>Chiudi</label>
              </div>
              <div class='sfondo-message-container'></div>";
    } else {
        echo "<input type='checkbox' id='error-checkbox' class='hidden-checkbox'>
              <div class='message-container'>
                <div class='error-message'>Si è verificato un errore durante l'invio del messaggio. Riprova più tardi.</div>
                <label for='error-checkbox' class='close-button'>Chiudi</label>
              </div>
              <div class='sfondo-message-container'></div>";
    }
    Ora, gli elementi ".message-container" e ".sfondo-messange-container" vorrei che apparissero e sparissero in dissolvenza.

    Per farli sparire, volendo gestire tutto via CSS, senza JS, ho utilizzato l'espediente di un "Checkbox", come potete vedere dal codice CSS:

    codice:
    /* Stili per il contenitore del messaggio */.message-container {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: 400px;
        height: 300px;
        background-color: white;
        border: 1px solid #ccc;
        z-index: 999;
        display: flex;
        justify-content: center;
        align-items: center;
        flex-direction: column;
        transition: opacity 0.5s ease-in-out;
    
    
    }
    
    
    
    
    .sfondo-message-container {
        width: 100%;
        height: 100%;
        z-index: 998;
        background-color: rgba(0, 0, 0, 0.5); 
        position: absolute;
        transition: opacity 0.5s ease-in-out;
    
    
    }
    
    
    
    
    /* Stili per il messaggio di successo */
    .success-message {
        color: green;
        font-size: 18px;
        text-align: center;
    }
    
    
    /* Stili per il messaggio di errore */
    .error-message {
        color: red;
        font-size: 18px;
        text-align: center;
    }
    
    
    /* Stili per il pulsante Chiudi */
    .close-button {
        background-color: #007bff;
        color: white;
        border: none;
        padding: 10px 20px;
        cursor: pointer;
        font-size: 16px;
        margin-top: 10px;
    }
    
    
    
    
    .hidden-checkbox {
        display: none;
    }
    
    
    .hidden-checkbox:checked ~ .sfondo-message-container {
        opacity: 0;
        pointer-events: none;
    }
    
    
    /* Mostra il messaggio di successo o di errore quando l'input checkbox è selezionato */
    .hidden-checkbox:checked ~ .message-container {
        opacity: 0;
        pointer-events: none;
    }
    Funziona correttamente ma c'è un problema.

    Io ho impostato la dissolvenza in entrata e in uscita.

    In uscita (cioè all'attivazione del Checkbox che fa chiudere gli elementi) la dissolvenza funziona correttamente.

    In entrata tuttavia, la dissolvenza non funziona, in quanto gli elementi appaiono tutti in una volta.

    Potete aiutarmi a risolvere questo aspetto?

    Grazie!

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Quote Originariamente inviata da ivanisevic82
    In entrata tuttavia, la dissolvenza non funziona, in quanto gli elementi appaiono tutti in una volta.
    Ciao, la dissolvenza in entrata non avviene per via del CSS applicato per lo stato normale di quell'elemento.

    Non c'è infatti alcuna proprietà che indichi di nasconderlo inizialmente; perciò, nel momento in cui viene creato, questo appare già con opacity:1 (valore di default).

    La dissolvenza quindi non ha luogo perché andrebbe dal valore 1 allo stesso valore 1.

    Ovviamente mettere opacity:0 per lo stato normale, non risolverebbe se non viene riportato in qualche modo al valore 1.

    Questo potresti farlo in vari modi usando un minimo di JavaScript. Ad esempio potresti definire una classe CSS per lo stato "nascosto" degli elementi, quindi applicarla inizialmente e rimuoverla attraverso un setTimeout, per poi riapplicarla magari al click del pulsante "chiudi" (anziché usare un checkbox).

    Qui il tuo esempio rielaborato:
    codice:
    <div class='message-container nascosto'>
    <?php if ($result) { ?>  <div class='success-message'>Messaggio inviato con successo!</div>
    <?php } else { ?>  <div class='error-message'>Si è verificato un errore durante l'invio del messaggio. Riprova più tardi.</div>
    <?php } ?>  <button class='close-button'>Chiudi</button>
    </div>
    <div class='sfondo-message-container'></div>
    <script>
      (() => {
        const btnChiudi = document.querySelector('.close-button');
        const msg = document.querySelector('.message-container');
        setTimeout(() => {
          msg.classList.remove('nascosto');
        }, 1);
        btnChiudi.addEventListener('click', e => {
          msg.classList.add('nascosto');
        });
      })();
    </script>
    e relativo CSS:
    codice:
    .message-container {  position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      width: 400px;
      height: 300px;
      background-color: white;
      border: 1px solid #ccc;
      z-index: 999;
      display: flex;
      justify-content: center;
      align-items: center;
      flex-direction: column;
    }
    .sfondo-message-container {
      width: 100%;
      height: 100%;
      z-index: 998;
      background-color: rgba(0, 0, 0, 0.5);
      position: absolute;
    }
    .success-message {
      color: green;
      font-size: 18px;
      text-align: center;
    }
    .error-message {
      color: red;
      font-size: 18px;
      text-align: center;
    }
    .close-button {
      background-color: #007bff;
      color: white;
      border: none;
      padding: 10px 20px;
      cursor: pointer;
      font-size: 16px;
      margin-top: 10px;
    }
    .message-container,
    .sfondo-message-container {
      transition: opacity 0.5s ease-in-out;
    }
    .message-container.nascosto,
    .message-container.nascosto + .sfondo-message-container {
      pointer-events: none;
      opacity: 0;
    }

    Quote Originariamente inviata da ivanisevic82
    volendo gestire tutto via CSS, senza JS
    Forse mi sbaglio ma percepisco un tuo timore (che in questo caso ritengo infondato) nell'usare JavaScript. In casi del genere penso sia la scelta più logica e semplice per ottenere ciò che ti serve, a meno che non ci sia qualche particolare ragione per cui pensi sia meglio evitarlo

    Ad ogni modo, per i puristi CSS si potrebbe risolvere facendo ricorso ad animation che, rispetto a transition, permette di definire le proprietà attraverso una timeline, così che sia possibile applicare una dissolvenza anche in apertura, cioè nel momento in cui gli elementi sono creati.

    Qui il solo CSS rielaborato, che potresti applicare al tuo esempio:
    codice:
    .message-container {  position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      width: 400px;
      height: 300px;
      background-color: white;
      border: 1px solid #ccc;
      z-index: 999;
      display: flex;
      justify-content: center;
      align-items: center;
      flex-direction: column;
    }
    .sfondo-message-container {
      width: 100%;
      height: 100%;
      z-index: 998;
      background-color: rgba(0, 0, 0, 0.5);
      position: absolute;
    }
    .success-message {
      color: green;
      font-size: 18px;
      text-align: center;
    }
    .error-message {
      color: red;
      font-size: 18px;
      text-align: center;
    }
    .close-button {
      background-color: #007bff;
      color: white;
      border: none;
      padding: 10px 20px;
      cursor: pointer;
      font-size: 16px;
      margin-top: 10px;
    }
    .hidden-checkbox {
      display: none;
    }
    .message-container,
    .sfondo-message-container {
      animation: fade-in 0.5s ease-in-out;
    }
    .hidden-checkbox:checked ~ .sfondo-message-container,
    .hidden-checkbox:checked ~ .message-container {
      pointer-events: none;
      animation: fade-out 0.5s ease-in-out forwards;
    }
    @keyframes fade-in {
      from {
        opacity: 0;
      }
    }
    @keyframes fade-out {
      to {
        opacity: 0;
      }
    }
    Senza entrare nei dettagli, ho definito e applicato le due animazioni per la dissolvenza in entrata e in uscita.
    Quella in entrata verrà chiaramente eseguita nel momento che gli elementi vengono creati nella pagina, mentre quella in uscita è eseguita attraverso il tuo checkbox.

    Ritengo comunque che una soluzione JavaScript sia più adatta e facile da gestire in casi del genere, piuttosto che fossilizzarsi su "stratagemmi" CSS che a lungo andare possono risultare limitanti e inadeguati.

    Vedi tu cosa usare.
    Ultima modifica di KillerWorm; 20-07-2023 a 02:04
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Caro Killer, hai perfettamente ragione, c'è spesso da parte mia un timore, evidentemente infondato, ad usare JS.

    Sono alle battute finali per la chiusura del mio sito e la questione dei messaggi di risposto all'invio del form mi sta impegnando da giorni...

    Ho fatto alcuni passi avanti rispetto a quanto sopra descritto.

    Ho capito che l'unico modo che avevo per far si che il messaggio di conferma o errore apparisse nella stessa pagine, senza ricaricare, era usare JS - o meglio - integrare la parte JS che già stavo usando, con nuova parte di codice.

    Dunque ho modificato la parte PHP eliminando il codice HTML sopra postato e sostuendolo semplicemente con questo:

    codice:
    if ($result) {    echo "success";
    } else {
        echo "error";
    }
    Poi ho aggiornato il mio JS, il cui codice al momento è questo:

    codice:
    <script>  var nomeInput = document.getElementById('nome');
      var cognomeInput = document.getElementById('cognome');
      var emailInput = document.getElementById('email');
      var telefonoInput = document.getElementById('telefono');
      var form = document.querySelector('form');
    
    
      nomeInput.addEventListener('input', toggleNomeCognomeRequired);
      cognomeInput.addEventListener('input', toggleNomeCognomeRequired);
      emailInput.addEventListener('input', toggleEmailTelefonoRequired);
      telefonoInput.addEventListener('input', toggleEmailTelefonoRequired);
    
    
      function toggleNomeCognomeRequired() {
        var nomeValue = nomeInput.value.trim();
        var cognomeValue = cognomeInput.value.trim();
    
    
        if (!nomeValue && !cognomeValue) {
          nomeInput.setCustomValidity("Compila almeno uno dei campi nome / cognome");
          cognomeInput.setCustomValidity("Compila almeno uno dei campi nome / cognome");
        } else {
          nomeInput.setCustomValidity('');
          cognomeInput.setCustomValidity('');
        }
      }
    
    
      function toggleEmailTelefonoRequired() {
        var emailValue = emailInput.value.trim();
        var telefonoValue = telefonoInput.value.trim();
    
    
        if (!emailValue && !telefonoValue) {
          emailInput.setCustomValidity("Compila almeno uno dei campi email / telefono");
          telefonoInput.setCustomValidity("Compila almeno uno dei campi email / telefono");
        } else {
          emailInput.setCustomValidity('');
          telefonoInput.setCustomValidity('');
        }
      }
    
    
      form.addEventListener('submit', function (event) {
        event.preventDefault();
    
    
        var nomeValue = nomeInput.value.trim();
        var cognomeValue = cognomeInput.value.trim();
        var emailValue = emailInput.value.trim();
        var telefonoValue = telefonoInput.value.trim();
        var errorMessageNomeCognome = "Compila almeno uno dei campi nome / cognome";
        var errorMessageEmailTelefono = "Compila almeno uno dei campi email / telefono";
        var isValid = true;
    
    
        if (!nomeValue && !cognomeValue) {
          nomeInput.setCustomValidity(errorMessageNomeCognome);
          cognomeInput.setCustomValidity(errorMessageNomeCognome);
          isValid = false;
        } else {
          nomeInput.setCustomValidity('');
          cognomeInput.setCustomValidity('');
        }
    
    
        if (!emailValue && !telefonoValue) {
          emailInput.setCustomValidity(errorMessageEmailTelefono);
          telefonoInput.setCustomValidity(errorMessageEmailTelefono);
          isValid = false;
        } else {
          emailInput.setCustomValidity('');
          telefonoInput.setCustomValidity('');
        }
    
    
        if (isValid) {
          var formData = new FormData(form);
    
    
          fetch(form.action, {
            method: 'POST',
            body: formData,
          })
            .then(function (response) {
              if (response.ok) {
                // Il form è stato inviato con successo
                form.reset();
                showMessage('success', 'Grazie per averci contattato. Vi risponderemo nel più breve tempo possibile.');
              } else {
                // Errore durante l'invio del form
                showMessage('error', 'Si è verificato un errore durante l\'invio del messaggio. Riprova più tardi.');
              }
            })
            .catch(function (error) {
              console.error('Error:', error);
            });
        }
      });
    
    
      function showMessage(type, message) {
        var messageContainer = document.createElement('div');
        messageContainer.classList.add('message-container');
    
    
        if (type === 'success') {
          messageContainer.innerHTML = `
            <input type='checkbox' id='success-checkbox' class='hidden-checkbox'>
    
    
              <div class='success-message'>${message}</div>
              <label for='success-checkbox' class='close-button' onclick="closeMessage()">Chiudi</label>
    
    
          `;
        } else {
          messageContainer.innerHTML = `
            <input type='checkbox' id='error-checkbox' class='hidden-checkbox'>
    
    
              <div class='error-message'>${message}</div>
              <label for='error-checkbox' class='close-button' onclick="closeMessage()">Chiudi</label>
    
    
          `;
        }
    
    
        document.body.appendChild(messageContainer);
      }
    
    
      function closeMessage() {
        var messageContainer = document.querySelector('.message-container');
        document.body.removeChild(messageContainer);
      }
    
    
    </script>
    In pratica la parte html viene ora gestita dal JS, in modo da poterla far apparire a seguito dell'invio del form senza necessità di risarcimento della pagina.

    La parte CSS aggiornata è invece questa:

    codice:
    /* Stili per il contenitore del messaggio */.message-container {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: auto;
        height: auto;
    	padding: 25px;
        background-color: white;
        border: 1px solid #999;
        z-index: 999;
        display: flex;
        justify-content: center;
        align-items: center;
        flex-direction: column;
        transition: opacity 0.5s ease-in-out;
        animation: fadeIn-message 0.5s ease-in-out;
    	border-radius: 8px;
    }
    
    
    
    
    .sfondo-message-container {
        width: 100%;
        height: 100%;
        z-index: 998;
        background-color: rgba(0, 0, 0, 0.5); 
        position: absolute;
        transition: opacity 0.5s ease-in-out;
    	animation: fadeIn-message 0.5s ease-in-out;
    }
    
    
    /* Stili per il messaggio di successo */
    .success-message {
        color: #333;
        text-align: center;
    	line-height: 1.7;
    }
    
    
    /* Stili per il messaggio di errore */
    .error-message {
        color: red;
        text-align: center;
    }
    
    
    /* Stili per il pulsante Chiudi */
    .close-button {
        background-color: #054363;
        color: white;
        border: none;
        padding: 10px 20px;
        cursor: pointer;
    	margin-top: 15px;
    	border-radius: 6px;
    }
    
    
    .hidden-checkbox {
        display: none;
    }
    
    
    .hidden-checkbox:checked ~ .sfondo-message-container {
        opacity: 0;
        pointer-events: none;
    }
    
    
    /* Mostra il messaggio di successo o di errore quando l'input checkbox è selezionato */
    .hidden-checkbox:checked ~ .message-container {
        opacity: 0;
        pointer-events: none;
    }
    
    
    
    
      @keyframes fadeIn-message {
        from {
          opacity: 0;
        }
        to {
          opacity: 1;
        }
      }
    Ora, tutto sembra funzionare a dovere, ma rimane un problema: la chiusura del pannello con il messaggio di successo/errore, contenuto nel div "message-container", non avviene con dissolvenza.

    L'apparizione del pannello invece si.

    In pratica mi trovo nella situazione opposta rispetto all'inizio, anche se credo di aver fatto diversi passi avanti integrando meglio la parte JS.

    La domanda dunque è questa: perché la chiusura non funziona con dissolvenza?

    Devo intervenire lato CSS o forse devo apportare qualche modifica alla parte JS?

    Grazie mille per il prezioso supporto!

  4. #4
    Ps: ho letto meglio la tua soluzione e l’ho compresa.

    È molto più lineare e sensata dell’ultima cosa che ho postato…la testerò domani e vedrò se riesco a adottarla.

    Ti aggiorno, grazie!

  5. #5
    Ho provato il codice ma non riesco a farlo funzionare bene, sicuramente sbaglio qualcosa.

    In particolare, noto i seguenti comportamenti:

    1) Il messaggio appare subito, al caricamento della pagina, senza che il form sia stato inviato.

    2) Appaiono contemporaneamente sia il messaggio di successo che quello di errore.

    3) Se provo ugualmente ad inviare il form il messaggio appare di nuovo (sempre sia successo sia errore), ma dopo il caricamento della pagina.

    Tutte queste cose mi fanno capire che non ho collegato in maniera opportuna la funzione "if result" (ovverosia l'invio del form) con il codice che mi hai fornito.

    Provo ad inserire più informazioni per cercare di capire cosa sbaglio.

    Innanzitutto posto il PHP completo, che gestisce l'invio delle email tramite il plugin WP mail SMTP.
    Questo codice è inserito all'interno del file functions.php:

    codice:
    function send_contact_email() {    if (isset($_POST['nome']) && isset($_POST['cognome']) && isset($_POST['email']) && isset($_POST['telefono']) && isset($_POST['messaggio'])) {
            $nome = sanitize_text_field($_POST['nome']);
            $cognome = sanitize_text_field($_POST['cognome']);
            $email = sanitize_email($_POST['email']);
            $telefono = sanitize_text_field($_POST['telefono']);
            $messaggio = sanitize_textarea_field($_POST['messaggio']);
    
    
            $to = 'info@avvocatobonfiglio.it'; // Indirizzo email in cui ricevere la richiesta di contatto
            $subject = 'Nuova richiesta di contatto'; // Oggetto dell'email
    
    
            $message = "Hai ricevuto una nuova richiesta di contatto:\n\n";
            $message .= "Nome: $nome\n";
            $message .= "Cognome: $cognome\n";
            $message .= "Email: $email\n";
            $message .= "Telefono: $telefono\n";
            $message .= "Messaggio:\n$messaggio\n";
    
    
            $headers = array(
                'From: ' . $nome . ' ' . $cognome . ' <' . $email . '>',
                'Reply-To: ' . $email
            );
    
    
            $result = wp_mail($to, $subject, $message, $headers);
    
    
    if ($result) {
        echo "success";
    } else {
        echo "error";
    }
    
    
    
    
    
        }
    }
    
    
    add_action('template_redirect', 'send_contact_email');
    Siccome la parte relativa alla gestione del risultato è già compresa nel tuo codice (che rivedremo a breve), ho eliminato questa parte di codice:

    codice:
    if ($result) {    echo "success";
    } else {
        echo "error";
    }
    Fatto questo ho aggiunto, si seguito al codice html del mio form di contatto, il codice da te elaborato:

    codice:
    <div class='message-container nascosto'><?php if ($result) { ?>  <div class='success-message'>Messaggio inviato con successo!</div>
    <?php } else { ?>  <div class='error-message'>Si è verificato un errore durante l'invio del messaggio. Riprova più tardi.</div>
    <?php } ?>  <button class='close-button'>Chiudi</button>
    </div>
    <div class='sfondo-message-container'></div>
    <script>
      (() => {
        const btnChiudi = document.querySelector('.close-button');
        const msg = document.querySelector('.message-container');
        setTimeout(() => {
          msg.classList.remove('nascosto');
        }, 1);
        btnChiudi.addEventListener('click', e => {
          msg.classList.add('nascosto');
        });
      })();
    </script>
    Infine ho sostituito il mio CSS con il tuo.

    Anche se non credo che contenga informazioni utili ai nostri fini, riporto anche lo script che gestisce il funzionamento del form e dei relativi campi di testo:

    codice:
    <script>
        var nomeInput = document.getElementById('nome');
        var cognomeInput = document.getElementById('cognome');
        var emailInput = document.getElementById('email');
        var telefonoInput = document.getElementById('telefono');
        var errorMessageNomeCognome = "Compila almeno uno dei campi nome / cognome";
        var errorMessageEmailTelefono = "Compila almeno uno dei campi email / telefono";
    
    
        nomeInput.addEventListener('input', toggleNomeCognomeRequired);
        cognomeInput.addEventListener('input', toggleNomeCognomeRequired);
        emailInput.addEventListener('input', toggleEmailTelefonoRequired);
        telefonoInput.addEventListener('input', toggleEmailTelefonoRequired);
    
    
        function toggleNomeCognomeRequired() {
            var nomeValue = nomeInput.value.trim();
            var cognomeValue = cognomeInput.value.trim();
    
    
            if (!nomeValue && !cognomeValue) {
                nomeInput.setCustomValidity(errorMessageNomeCognome);
                cognomeInput.setCustomValidity(errorMessageNomeCognome);
            } else {
                nomeInput.setCustomValidity('');
                cognomeInput.setCustomValidity('');
            }
        }
    
    
        function toggleEmailTelefonoRequired() {
            var emailValue = emailInput.value.trim();
            var telefonoValue = telefonoInput.value.trim();
    
    
            if (!emailValue && !telefonoValue) {
                emailInput.setCustomValidity(errorMessageEmailTelefono);
                telefonoInput.setCustomValidity(errorMessageEmailTelefono);
            } else {
                emailInput.setCustomValidity('');
                telefonoInput.setCustomValidity('');
            }
        }
    
    
        // Aggiunta della validazione iniziale all'avvio dello script
        toggleNomeCognomeRequired();
        toggleEmailTelefonoRequired();
    </script>
    Questo è tutto.

    Al di là degli errore di implementazione che posso aver commesso, ho la sensazione (ma potrei sbagliarmi) che non avendo posto da prima la questione del "ricaricamento" della pagina, tu non ti sia preoccupato di evitarlo.

    Infatti quando invio il form la pagina di ricarica.

    Con lo script che ho riportato nel post sopra questo, avevo risolto questo problema e l'invio del form e la visualizzazione dei messaggi risultava corretta.

    Restava il problema della transizione in uscita...

    Pensi sia meglio lavorare su quello o cercare di implementare correttamente il tuo (dedicandosi anche alla questione dell'evitare il ricevimento della pagina all'invio)?

    Grazie per il prezioso supporto!

  6. #6
    Non mandatemi a quel paese per il triplo post, ma forse è meglio scrivere gli aggiornamenti, prima che qualcuno impieghi del tempo su una situazione che si è nel frattempo modificata.

    Preciso che NON apporterò altre modifiche, dal momento che adesso tutto funziona come volevo, fino a quando non ci saranno delle risposte sul forum.

    Ciò in quanto - lo premetto - il risultato è quello che volevo, ma il percorso per arrivarci è tortuoso e poco sensato.

    Per il momento lo tengo così, ma vorrei migliorare questo codice.

    Ecco lo script funzionante:

    codice:
    <script>  var nomeInput = document.getElementById('nome');
      var cognomeInput = document.getElementById('cognome');
      var emailInput = document.getElementById('email');
      var telefonoInput = document.getElementById('telefono');
      var form = document.querySelector('form');
    
    
      nomeInput.addEventListener('input', toggleNomeCognomeRequired);
      cognomeInput.addEventListener('input', toggleNomeCognomeRequired);
      emailInput.addEventListener('input', toggleEmailTelefonoRequired);
      telefonoInput.addEventListener('input', toggleEmailTelefonoRequired);
    
    
      function toggleNomeCognomeRequired() {
        var nomeValue = nomeInput.value.trim();
        var cognomeValue = cognomeInput.value.trim();
    
    
        if (!nomeValue && !cognomeValue) {
          nomeInput.setCustomValidity("Compila almeno uno dei campi nome / cognome");
          cognomeInput.setCustomValidity("Compila almeno uno dei campi nome / cognome");
        } else {
          nomeInput.setCustomValidity('');
          cognomeInput.setCustomValidity('');
        }
      }
    
    
      function toggleEmailTelefonoRequired() {
        var emailValue = emailInput.value.trim();
        var telefonoValue = telefonoInput.value.trim();
    
    
        if (!emailValue && !telefonoValue) {
          emailInput.setCustomValidity("Compila almeno uno dei campi email / telefono");
          telefonoInput.setCustomValidity("Compila almeno uno dei campi email / telefono");
        } else {
          emailInput.setCustomValidity('');
          telefonoInput.setCustomValidity('');
        }
      }
    
    
      form.addEventListener('submit', function (event) {
        event.preventDefault();
    
    
        var nomeValue = nomeInput.value.trim();
        var cognomeValue = cognomeInput.value.trim();
        var emailValue = emailInput.value.trim();
        var telefonoValue = telefonoInput.value.trim();
        var errorMessageNomeCognome = "Compila almeno uno dei campi nome / cognome";
        var errorMessageEmailTelefono = "Compila almeno uno dei campi email / telefono";
        var isValid = true;
    
    
        if (!nomeValue && !cognomeValue) {
          nomeInput.setCustomValidity(errorMessageNomeCognome);
          cognomeInput.setCustomValidity(errorMessageNomeCognome);
          isValid = false;
        } else {
          nomeInput.setCustomValidity('');
          cognomeInput.setCustomValidity('');
        }
    
    
        if (!emailValue && !telefonoValue) {
          emailInput.setCustomValidity(errorMessageEmailTelefono);
          telefonoInput.setCustomValidity(errorMessageEmailTelefono);
          isValid = false;
        } else {
          emailInput.setCustomValidity('');
          telefonoInput.setCustomValidity('');
        }
    
    
        if (isValid) {
          var formData = new FormData(form);
    
    
          fetch(form.action, {
            method: 'POST',
            body: formData,
          })
            .then(function (response) {
              if (response.ok) {
                // Il form è stato inviato con successo
                form.reset();
                showMessage('success', 'Grazie per averci contattato. Vi risponderemo nel più breve tempo possibile.');
              } else {
                // Errore durante l'invio del form
                showMessage('error', 'Si è verificato un errore durante l\'invio del messaggio. Riprova più tardi.');
              }
            })
            .catch(function (error) {
              console.error('Error:', error);
            });
        }
      });
    
    
    function showMessage(type, message) {
      var messageContainer = document.createElement('div');
      messageContainer.classList.add('message-container');
    
    
      if (type === 'success') {
        messageContainer.classList.add('success-message-container');
        messageContainer.innerHTML = `
          <input type='checkbox' id='success-checkbox' class='hidden-checkbox'>
          <div class='success-message'>${message}</div>
          <label for='success-checkbox' class='close-button' onclick="closeMessage()">Chiudi</label>
        `;
      } else {
        messageContainer.classList.add('error-message-container');
        messageContainer.innerHTML = `
          <input type='checkbox' id='error-checkbox' class='hidden-checkbox'>
          <div class='error-message'>${message}</div>
          <label for='error-checkbox' class='close-button' onclick="closeMessage()">Chiudi</label>
        `;
      }
    
    
      document.body.appendChild(messageContainer);
    }
    
    
    function closeMessage() {
      var messageContainer = document.querySelector('.message-container');
      messageContainer.classList.add('hidden');
      setTimeout(function () {
        document.body.removeChild(messageContainer);
      }, 500);
    }
    
    
    document.getElementById('myForm').addEventListener('submit', function (event) {
      event.preventDefault();
    
    
      var isValid = true; // Presumo che tu abbia già il controllo sulla validità del form
      if (isValid) {
        var formData = new FormData(this);
    
    
        fetch(this.action, {
          method: 'POST',
          body: formData,
        })
          .then(function (response) {
            if (response.ok) {
              // Il form è stato inviato con successo
              document.getElementById('myForm').reset();
              showMessage('success', 'Grazie per averci contattato. Vi risponderemo nel più breve tempo possibile.');
            } else {
              // Errore durante l'invio del form
              showMessage('error', 'Si è verificato un errore durante l\'invio del messaggio. Riprova più tardi.');
            }
          })
          .catch(function (error) {
            console.error('Error:', error);
          });
      }
    });
    </script>
    E qui la parte CSS:

    codice:
    /* Stili per il contenitore del messaggio */.message-container {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: auto;
        height: auto;
    	padding: 25px;
        background-color: white;
        border: 1px solid #999;
        z-index: 999;
        display: flex;
        justify-content: center;
        align-items: center;
        flex-direction: column;
        animation: fadeIn-message 0.5s ease-in-out;
    	border-radius: 8px;
        opacity: 1;
        transition: opacity 0.5s;
    }
    
    
    
    
    .sfondo-message-container {
        width: 100%;
        height: 100%;
        z-index: 998;
        background-color: rgba(0, 0, 0, 0.5); 
        position: absolute;
        transition: opacity 0.5s ease-in-out;
    	animation: fade-in 0.5s ease-in-out;
    }
    
    
    /* Stili per il messaggio di successo */
    .success-message {
        color: #333;
        text-align: center;
    	line-height: 1.7;
    }
    
    
    /* Stili per il messaggio di errore */
    .error-message {
        color: red;
        text-align: center;
    }
    
    
    /* Stili per il pulsante Chiudi */
    .close-button {
        background-color: #054363;
        color: white;
        border: none;
        padding: 10px 20px;
        cursor: pointer;
    	margin-top: 15px;
    	border-radius: 6px;
    }
    
    
    .hidden-checkbox {
        display: none;
    }
    
    
    .hidden-checkbox:checked ~ .sfondo-message-container {
        opacity: 0;
        pointer-events: none;
    }
    
    
    /* Mostra il messaggio di successo o di errore quando l'input checkbox è selezionato */
    .hidden-checkbox:checked ~ .message-container {
        opacity: 0;
        pointer-events: none;
    }
    
    
      @keyframes fadeIn-message {
        from {
          opacity: 0;
        }
        to {
          opacity: 1;
        }
      }
    
    
    /* Stile per nascondere il messaggio con animazione di dissolvenza */
    .message-container.hidden {
      /* Imposta l'opacità a 0 per nascondere il messaggio */
      opacity: 0;
    }
    In pratica all'apparizione del messaggio di successo/errore, la dissolvenza viene gestita via CSS con keyframes.

    Alla chiusura, viene gestita via JS.

    Ovviamente tutto ciò, anche se funziona, non ha molto senso.

    Seguendo il consiglio di Killerworm, vorrei modificare lo script semplificandolo, per far si che sia la il messaggio in entrata, che quello in uscita, con le relative dissolvenze, siano gestiti via JS.

    Questo mi consterebbe anche di eliminare il Checkbox che costituisce ovviamente un espediente CSS per fare una cosa che tipicamente si realizza con JS.

    Mi rendo conto che a questo punto il topic rischierebbe di prendere una piego più da JS che la CSS.

    Chiedo pertanto ai moderatori se possiamo continuare (per chiudere) qui o se bisogno spostarsi in JS.

    Grazie!

  7. #7
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Oops, ho visto solo ora gli ultimi tuoi post... troppo lungo, non riesco a seguire.

    Quote Originariamente inviata da ivanisevic82
    Chiedo pertanto ai moderatori se possiamo continuare (per chiudere) qui o se bisogno spostarsi in JS.
    Per ora lasciamo qui. Non so se l'altra tua discussione in JavaScript ("Script funziona solo se mal posizionato") riguardi sempre questo argomento.

    Ho risposto anche lì ma, se serve proseguire qui, ti chiedo personalmente di fare un breve punto della situazione.

    Fai sapere.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  8. #8
    Quote Originariamente inviata da KillerWorm Visualizza il messaggio
    Oops, ho visto solo ora gli ultimi tuoi post... troppo lungo, non riesco a seguire.



    Per ora lasciamo qui. Non so se l'altra tua discussione in JavaScript ("Script funziona solo se mal posizionato") riguardi sempre questo argomento.

    Ho risposto anche lì ma, se serve proseguire qui, ti chiedo personalmente di fare un breve punto della situazione.

    Fai sapere.
    Ciao Killer, rispondo alle tue domanda.

    1) L'altra discussione non ha niente a che vedere con questa.

    2) Per quanto concerne questa discussione puoi basarti anche solo sul mio ultimo post prima di questo.

    Il codice ora funzione e produce esattamente l'effetto che volevo (messaggio popup con dissolvenza sia in entrata che in uscita).

    Il problema è che l'entrata viene gestita via JS, mentre l'uscita via CSS (o viceversa, non mi ricordo).

    Mi piacerebbe uniformare il tutto e usare solo JS per l'animazione e l'apparizione / sparizione del popup, così come tu avevi suggerito all'inizio.

    Tuttavia non sono in grado di modificare il codice JS.

    Grazie per il supporto!

  9. #9
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, perdona il ritardo.

    Ho visto ma mi viene difficile riprodurre un esempio realistico per poterti dare uno script pronto. Nel caso ti chiedo se puoi fornire tu un esempio minimo funzionante in modo che si possa partire eventualmente da quello.

    Ad ogni modo dovrai intanto rimuovere il sistema col checkbox; nel mio post iniziale ti ho indicato un primo metodo usando JavaScript per applicare/rimuovere una classe che gestisce appunto la dissolvenza.

    Fai qualche prova o fornisci magari un esempio anche online (su qualche code playground) su cui poter lavorare; sarà più semplice darti aiuto
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  10. #10
    Caro Killer, non ho nulla di cui perdonarti...mi sembra che ti sobbarchi quasi da solo l'assistenza per la risoluzione dei problemi di buona parte del forum, il tuo impegno è veramente encomiabile

    Piccolo OT prima darti il codice richiesto: oggi sono particolarmente soddisfatto perché ho finito la validazione del codice!

    Ogni pagina del mio sito adesso passa il controllo W3C senza errore, senza warning e senza nemmeno info!

    E' stata davvero una gran fatica...di fatto sembra non essere cambiato nulla, ma adesso il codice è infinitamente più pulito e questo credo che mi aiuterà anche in termini di performance nel caricamento delle pagine e di posizionamento in rete.

    Chiusa questa piccola parenti, riporto di seguito un blocco di codice completo e pronto all'uso, contenuto la parte html, quella CSS e quella JS.

    Ho testato sul "try it" di W3C e funziona.

    Mi scuso che la parte CSS non è ordinata e razionale (devo ancora fare pulizia del foglio di stile nel sito...è il prossimo obbiettivo che mi sono dato), ma ciò che conta adesso è la sostanza.

    codice:
    <div class="scrivici">Scrivici per maggiori informazioni</div><div class="container_form">
      <form method="post">
        <div class="form-group">
          <div>
            <input type="text" id="nome" name="nome" class="form-control" placeholder="Nome">
          </div>
          <div>
            <input type="text" id="cognome" name="cognome" class="form-control" placeholder="Cognome">
          </div>
        </div>
        <div class="form-group">
          <div>
            <input type="email" id="email" name="email" class="form-control" placeholder="Email">
          </div>
          <div>
            <input type="tel" id="telefono" name="telefono" class="form-control" pattern="[0-9]+" title="Inserisci un numero di telefono valido" placeholder="Telefono">
          </div>
        </div>
        <div class="form-group">
          <textarea id="messaggio" name="messaggio" class="form-control message" required placeholder="Messaggio"></textarea>
        </div>
        <button type="submit" class="btn_contatti_page">Invia</button>
      </form>
    </div>
    
    
    
    
    <style>
    
    
    /* Contatti */
    
    
          .container_form {
            max-width: 100%;
            margin: auto;
          }
       
          
          .form-control {
            display: block;
            width: 100%;
            border: 1px solid #ccc;
            border-radius: 0;
            padding: 10px;
            font-size: 15px;
            line-height: 1.5;
            margin-bottom: 10px;
          }
    
    
    .form-control#nome, .form-control#cognome, .form-control#email, .form-control#telefono {
      height: 55px;
    }
          
          .form-control:focus {
            outline: none;
            border-color: #666;
          }
          
          .form-group {
            display: flex;
            flex-wrap: wrap;
            justify-content: space-between;
            margin-bottom: 20px;
          }
    
    
          .form-group > div {
            width: calc(50% - 10px);
          }
    
    
          .form-group > div:first-child {
            margin-right: 20px;
          }
          
          .form-group label {
            display: block;
            margin-bottom: 5px;
            font-weight: 400;
          }
          
          .btn {
            display: block;
            width: 100%;
            background-color: #1b6991;
            color: #fff;
            border: none;
            border-radius: 0;
            padding: 10px;
            font-size: 15px;
            cursor: pointer;
            transition: background-color 0.3s ease-in-out;
            width: 60px;
    text-align: center;
    margin: 0 auto;
    margin-top: -20px;
          }
          
          .btn:hover {
            background-color: #054363;
          }
          .message {
      height: 200px;
    }
    
    
    .scrivici {
    text-align: center;
    padding-bottom: 20px;
    font-size: 24px;
    font-weight: 600;
    color: #054363; 
    }
    
    
    
    
    label {
      font-size: 15px;
    }
    
    
    
    
    /**** IMPORTATO DA CONTATTI ****/
      
      .btn_contatti_page {
        display: block;
        width: 100%;
        background-color: #1b6991;
        color: #fff;
        border: none;
        border-radius: 0;
        padding: 10px;
        font-size: 15px;
        cursor: pointer;
        transition: background-color 0.3s ease-in-out;
        width: 60px;
        text-align: center;
        margin: 0 auto;
      }
      
      /**** RESPONSIVE ****/
      
      @media (max-width: 930px) {
        .form-group>div {
          width: 100%;
          margin-right: 0;
        }
        
        .form-group>div:first-child {
          margin-right: 0 !important;
        }
        
        #email {
          margin-left: 0 !important;
        }
        
        #telefono {
          margin-left: 0 !important;
        }
        
        .form-group {
          margin-bottom: 0 !important;
        }
        .form-control {
        margin-bottom: 20px;
        }
    .btn {
        margin-top: 0;
    }
    }	  
    
    
    
    
    .mappa_contatti {
    width: 100%;
    height: 368px;
    border: none;
    }
    
    
    .mappa_contatti_sidebar {
    width: 100%;
    height: 369px;
    border: 1px solid #ccc;
    }
      
    	  
    @media (min-width: 931px) {
    #mappa-desktop-container { display: none; }
    }
    
    
    @media (max-width: 930px) {
    .scrivici_maps {
    text-align: center;
    padding-bottom: 0px;
    font-size: 24px;
    font-weight: 600;
    color: #054363; 
    }
    
    
    #mappa-desktop-container {
    margin-top: 20px;
    }
    
    
    .maps_responsive {
    margin-top: 20px;
    }
    
    
    }
    
    
    /* Stili per il contenitore del messaggio */
    .message-container {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: auto;
        height: auto;
    	padding: 25px;
        background-color: white;
        border: 1px solid #999;
        z-index: 999;
        display: flex;
        justify-content: center;
        align-items: center;
        flex-direction: column;
        animation: fadeIn-message 0.5s ease-in-out;
    	border-radius: 8px;
        opacity: 1;
        transition: opacity 0.5s;
    }
    
    
    
    
    /* Stili per il messaggio di successo */
    .success-message {
        color: #333;
        text-align: center;
    	line-height: 1.7;
    }
    
    
    /* Stili per il messaggio di errore */
    .error-message {
        color: red;
        text-align: center;
    }
    
    
    /* Stili per il pulsante Chiudi */
    .close-button {
        background-color: #054363;
        color: white;
        border: none;
        padding: 10px 20px;
        cursor: pointer;
    	margin-top: 15px;
    	border-radius: 6px;
    }
    
    
    .hidden-checkbox {
        display: none;
    }
    
    
    .hidden-checkbox:checked ~ .sfondo-message-container {
        opacity: 0;
        pointer-events: none;
    }
    
    
    /* Mostra il messaggio di successo o di errore quando l'input checkbox è selezionato */
    .hidden-checkbox:checked ~ .message-container {
        opacity: 0;
        pointer-events: none;
    }
    
    
      @keyframes fadeIn-message {
        from {
          opacity: 0;
        }
        to {
          opacity: 1;
        }
      }
    
    
    /* Stile per nascondere il messaggio con animazione di dissolvenza */
    .message-container.hidden {
      /* Imposta l'opacità a 0 per nascondere il messaggio */
      opacity: 0;
    }
    
    
    
    
    </style>
    
    
    
    
    <script>
      var nomeInput = document.getElementById('nome');
      var cognomeInput = document.getElementById('cognome');
      var emailInput = document.getElementById('email');
      var telefonoInput = document.getElementById('telefono');
      var form = document.querySelector('form');
    
    
      nomeInput.addEventListener('input', toggleNomeCognomeRequired);
      cognomeInput.addEventListener('input', toggleNomeCognomeRequired);
      emailInput.addEventListener('input', toggleEmailTelefonoRequired);
      telefonoInput.addEventListener('input', toggleEmailTelefonoRequired);
    
    
      function toggleNomeCognomeRequired() {
        var nomeValue = nomeInput.value.trim();
        var cognomeValue = cognomeInput.value.trim();
    
    
        if (!nomeValue && !cognomeValue) {
          nomeInput.setCustomValidity("Compila almeno uno dei campi nome / cognome");
          cognomeInput.setCustomValidity("Compila almeno uno dei campi nome / cognome");
        } else {
          nomeInput.setCustomValidity('');
          cognomeInput.setCustomValidity('');
        }
      }
    
    
      function toggleEmailTelefonoRequired() {
        var emailValue = emailInput.value.trim();
        var telefonoValue = telefonoInput.value.trim();
    
    
        if (!emailValue && !telefonoValue) {
          emailInput.setCustomValidity("Compila almeno uno dei campi email / telefono");
          telefonoInput.setCustomValidity("Compila almeno uno dei campi email / telefono");
        } else {
          emailInput.setCustomValidity('');
          telefonoInput.setCustomValidity('');
        }
      }
    
    
      form.addEventListener('submit', function (event) {
        event.preventDefault();
    
    
        var nomeValue = nomeInput.value.trim();
        var cognomeValue = cognomeInput.value.trim();
        var emailValue = emailInput.value.trim();
        var telefonoValue = telefonoInput.value.trim();
        var errorMessageNomeCognome = "Compila almeno uno dei campi nome / cognome";
        var errorMessageEmailTelefono = "Compila almeno uno dei campi email / telefono";
        var isValid = true;
    
    
        if (!nomeValue && !cognomeValue) {
          nomeInput.setCustomValidity(errorMessageNomeCognome);
          cognomeInput.setCustomValidity(errorMessageNomeCognome);
          isValid = false;
        } else {
          nomeInput.setCustomValidity('');
          cognomeInput.setCustomValidity('');
        }
    
    
        if (!emailValue && !telefonoValue) {
          emailInput.setCustomValidity(errorMessageEmailTelefono);
          telefonoInput.setCustomValidity(errorMessageEmailTelefono);
          isValid = false;
        } else {
          emailInput.setCustomValidity('');
          telefonoInput.setCustomValidity('');
        }
    
    
        if (isValid) {
          var formData = new FormData(form);
    
    
          fetch(form.action, {
            method: 'POST',
            body: formData,
          })
            .then(function (response) {
              if (response.ok) {
                // Il form è stato inviato con successo
                form.reset();
                showMessage('success', 'Grazie per averci contattato. Vi risponderemo nel più breve tempo possibile.');
              } else {
                // Errore durante l'invio del form
                showMessage('error', 'Si è verificato un errore durante l\'invio del messaggio. Riprova più tardi.');
              }
            })
            .catch(function (error) {
              console.error('Error:', error);
            });
        }
      });
    
    
    function showMessage(type, message) {
      var messageContainer = document.createElement('div');
      messageContainer.classList.add('message-container');
    
    
      if (type === 'success') {
        messageContainer.classList.add('success-message-container');
        messageContainer.innerHTML = `
          <input type='checkbox' id='success-checkbox' class='hidden-checkbox'>
          <div class='success-message'>${message}</div>
          <label for='success-checkbox' class='close-button' onclick="closeMessage()">Chiudi</label>
        `;
      } else {
        messageContainer.classList.add('error-message-container');
        messageContainer.innerHTML = `
          <input type='checkbox' id='error-checkbox' class='hidden-checkbox'>
          <div class='error-message'>${message}</div>
          <label for='error-checkbox' class='close-button' onclick="closeMessage()">Chiudi</label>
        `;
      }
    
    
      document.body.appendChild(messageContainer);
    }
    
    
    function closeMessage() {
      var messageContainer = document.querySelector('.message-container');
      messageContainer.classList.add('hidden');
      setTimeout(function () {
        document.body.removeChild(messageContainer);
      }, 500);
    }
    
    
    document.getElementById('myForm').addEventListener('submit', function (event) {
      event.preventDefault();
    
    
      var isValid = true; // Presumo che tu abbia già il controllo sulla validità del form
      if (isValid) {
        var formData = new FormData(this);
    
    
        fetch(this.action, {
          method: 'POST',
          body: formData,
        })
          .then(function (response) {
            if (response.ok) {
              // Il form è stato inviato con successo
              document.getElementById('myForm').reset();
              showMessage('success', 'Grazie per averci contattato. Vi risponderemo nel più breve tempo possibile.');
            } else {
              // Errore durante l'invio del form
              showMessage('error', 'Si è verificato un errore durante l\'invio del messaggio. Riprova più tardi.');
            }
          })
          .catch(function (error) {
            console.error('Error:', error);
          });
      }
    });
    </script>
    Spero la situazione non sia troppo complessa...in fin dei conti funziona anche così, ma nella stessa ottico con cui mi sono approcciato alla validazione, vorrei a questo punto avere un codice razionale e coerente nelle scelte.

    Grazie per il prezioso supporto!

    PS: qualsiasi cosa ti vada di controllare o verificare, anche se ti fa piacere con riferimento alla validazione, le tue credenziali per l'accesso sono sempre valide!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.