Snippet jQuery
$(window).scroll(function() {
/* fai cose ogni volta che la pagina viene scrollata */
});
Quando un elemento raggiunge la distanza specificata in 'pixelFromTop' dalla cima del viewport, fai un'azione. Funzione adattata da una trovata qui qui
function isScrolledIntoView(elem, pixelFromTop){
/* quanto ci vuole per raggiungere top 0 del sito a partire dalla posizione dello scroll attuale*/
var docViewTop = $(window).scrollTop();
/* console.log(docViewTop); */
/* docViewTop + il 100vh, trovo il bordo inferiore dello schermo */
/* var docViewBottom = docViewTop + $(window).height(); */
/* quanto bisogna scrollare per rendere visibile il top di un dato elemento */
var elemTop = $(elem).offset().top;
/* quanto bisogna scrollare per renvere visibile la fine di un dato elemento */
var elemBottom = elemTop + $(elem).height();
/* if (pixelFromTop == "65"){
pixelFromTop = $(window).height() / 10;
} */
return (elemTop <= (docViewTop + pixelFromTop));
}
Se un padre ha figli, e vogliamo vincolare il click solo al padre stesso e non ai figli, basta fare così
$('.padre-con-figli').on('click', function(e) {
if (e.target !== this)
return;
//fai cose
});
jQuery(document).ready(function($) {
});
/*Richiamo la funzione al document ready per posizionare correttamente la parallax fin da subito*/
effettoParallasse('.selettore', 0.05, 0);
/* e poi allo scroll, la richiamo */
window.addEventListener('scroll', () => {
effettoParallasse('.selettore', 0.05, 0);
});
function effettoParallasse(selettoreCSSElementoConParallasse, velocitaParallasse, distanzaTopBackground){
let altezzaViewport = $(window).height();
/* altezza elemento su cui applicare la parallasse */
let hElementoParallax = $(selettoreCSSElementoConParallasse).height();
/* quanto la cima dell'elemento dista da top 0 del viewport */
let cimaElementoParallax = $(selettoreCSSElementoConParallasse).offset().top;
/* quanto la fine dell'elemento dista da top 0 del viewport */
let fineElementoParallax = $(selettoreCSSElementoConParallasse).offset().top + hElementoParallax;
let spostamentoBackground;
/* se l'elemento è già visibile */
if (altezzaViewport > cimaElementoParallax) {
spostamentoBackground = ((window.scrollY + 1) * velocitaParallasse) + distanzaTopBackground;
} else if ((window.scrollY + altezzaViewport) > cimaElementoParallax) { //altrimenti, quando diventa visibile, scrolla per tutta la sua altezza ma non oltre
spostamentoBackground = (((window.scrollY + altezzaViewport) - cimaElementoParallax + 1) * velocitaParallasse) + distanzaTopBackground;
if (spostamentoBackground > 100){
spostamentoBackground = 100;
}
} else { /* altrimenti ripristina la posizione iniziale */
spostamentoBackground = distanzaTopBackground;
}
$(selettoreCSSElementoConParallasse).css({"background-position": "50%"+ spostamentoBackground +"%"});
}
Se vengono aggiunti elementi nel DOM che non c'erano al caricamento del js, questi elementi non saranno direttamente raggingibili dal js, per questo usiamo la Event Delegation, delegando l'azione a un elemento padre rispetto all'elemento 'non raggiungibile'
$( "body o comunque un padre" ).on( "click change keyup paste: SI POSSONO INSERIRE VARIE AZIONI, SENZA VIRGOLE", "selettore", function() {
/* fai cose agli eventi specificati sul selettore */
});
soluzione utilizzata qui e qui
Struttura HTML per far funzionare il js
<div class="gruppoFiltro filtro">
<!-- tanti attributi quanti servono -->
<div class="attributo ">
<h3>Nome Attributo</h3>
<div class="options">
<!-- mettere tanti "single-input" checkbox quante sono necessarie all\interno di questo gruppo -->
<div class="single-input">
<input type="checkbox" id="identificativo_checkbox" name="identificativo_gruppo_checkbox" data-filtro="la classe che unisce la checkbox e il div/prodotto corrispondente su cui filntrare">
<label for="identificativo_checkbox">Nome label</label>
</div>
</div>
</div>
<div class="azzeraFiltri" style="">
<p>Azzera Filtri</p>
</div>
</div>
Stampare nome variabile senza scrivela prima
jQuery(function ($) {
/* ASCOLTO IL CAMBIAMENTO DELLA SELEZIONE DEL FILTRO PER MOSTRARE O NASCCONDERE I PRODOTTI CORRISPONDENTI */
$( ".gruppoFiltro input" ).change( function() {
/* var categoria = $("#categorie input:checked").val();
console.log(categoria); */
var filtriSelezionati = [];
$(".gruppoFiltro input:checked").each(
function(){
filtriSelezionati.push($(this).data("filtro"));
}
)
/* console.log(filtriSelezionati); */
$.fn.extend({
hasAllClasses: function (selectors) {
var self = this;
var contatore = 0;
/* Per ciascun elemento, controllo conto quante delle classi selezionate ha */
for (var i in selectors) {
if ($(self).hasClass(selectors[i]))
contatore++
}
/* se le ha tutte, return true, altrimenti false */
if (selectors.length == contatore){
return true;
} else {
return false;
}
}
});
var listaProdotti = $(".single-product");
listaProdotti.each(function( index ) {
/* se non sono selezionati filtri, mostro tutti i prodotti */
if (filtriSelezionati.length == 0){
listaProdotti.show();
} else {
if ($(this).hasAllClasses(filtriSelezionati)){
$(this).show();
} else {
$(this).hide();
}
}
});
});
/* per ogni gruppo di checkbox (identificato dal name), può esserne selezionata solo 1 */
$("input:checkbox").on('click', function() {
var inputCliccato = $(this);
/* se la checkbox di un gruppo è cliccata, deseleziona tutte le checkbox del gruppo e riseleziona solo quella cliccata, altrimenti deselezionala */
if (inputCliccato.is(":checked")) {
var group = "input:checkbox[name='" + inputCliccato.attr("name") + "']";
$(group).prop("checked", false);
inputCliccato.prop("checked", true);
} else {
inputCliccato.prop("checked", false);
}
});
/* AZZERA FILTRI */
$('.azzeraFiltri').click(function(){
$(".gruppoFiltro input:checked").each(function(){
$(this).prop("checked", false);
});
$(".single-product").show();
});
});
Collega più funzioni diverse e eventi diversi in un unico selettore
$(".classe").on({
mouseenter : function(){ /* fai cose */ },
mouseout: function(){ /* fai altre */ }
});
Come impostare e come leggere una variabile locale
Impostare variabile locale
// impostare una che si chiama "nomeVariabileLocale"
function variabileSessione(elem){
window.localStorage.setItem('nomeVariabileLocale', 'valore della variabile locale');
}
Leggere variabile locale
var valoreVariabileLocale = window.localStorage.getItem('nomeVariabileLocale');
$(".testoPassword").on({
mouseenter : function(){ $(this).closest(".pwrd").removeClass("blurPassword") },
mouseout: function(){ $(this).closest(".pwrd").addClass("blurPassword") }
});
Se un elemento non è visibile, scrolla il padre per renderlo interamente visibile
/* scrollo il contenuto di un elemento padre, finche l'elemento selezionato finche non risulta pienamente visibile */
var elem = $('.selettore')
/* distanza dell'elem dal top 0 del padre */
distanzaDaTopContainer = elem.offset().top;
/* altezza finale, data da distanzaDaTopContainer e l'altezza dell'elemento stesso */
quantoDeveScrollare = distanzaDaTopContainer + elem.height();
/* se l'elemento non è visibile, anima lo scroll in 900ms per renderlo interamente visibile */
if (quantoDeveScrollare > $(window).height() ) {
/* $('#menu').scrollTop(quantoDeveScrollare); */
$('#menu').animate({
scrollTop: quantoDeveScrollare
}, 900, 'linear');
}
Varie tipologie di console log
Stampare nome variabile senza scrivela prima
/* Se si mettono variabili dentro il console log racchiuse fra le graffe,
vengono stampate come nome valore senza necessità anteporci davanti una stringa di spiegazione */
var ciao = "a tutti";
console.log({ciao});
stamperà {ciao: "a tutti"}}