Prometeo
Account
AP
App
Generale
App
Pagine generate
Pagine generate
Pagine generate
Indietro
Layout
Layout
Layout
Indietro
Blocchi
Blocchi
Blocchi stilati
Blocchi master
Indietro
Stili grafici
Stili grafici
Stili grafici
Varianti grafiche
Indietro
Importa stili grafici
Importa stili grafici
Importazioni
Blocchi importati
Indietro
Immagini
Immagini
Libreria
Indietro
Impostazioni
Impostazioni
Dati per anteprime
Intelligenza artificiale
Siti destinazione
Tipi di campi
Tipi di pagina
Tipi di blocco
Indietro
Demo
Demo
Ricette
Ingredienti
Indietro
Più spazio
Modifica blocco
Salva
Name
Tipo
---------
Content
CTA
FAQ
Features
Hero
Navigation
Descrizione
Sezione statistiche con titolo e colonne numeriche animate (da data-from-value a data-to-value al scroll). Variante sfondo rosso con classe color_scheme «red».
Codice blocco
HTML template
<div class="block-with-dynamic-numbers {{ content.color_scheme }}"> {% if content.title %}<h2>{{ content.title }}</h2>{% endif %} <div class="numbers"> {% for item in content.numbers %} <div class="number"> <span class="number-wrapper"> {% if item.prefix %}<span class="number-prefix">{{ item.prefix }}</span>{% else %}<span class="number-prefix"></span>{% endif %} <span class="number-value" data-from-value="{{ item.from_value|default:0 }}" data-to-value="{{ item.to_value }}" data-duration="{{ item.duration|default:2000 }}" >{{ item.from_value|default:0 }}</span> {% if item.suffix %}<span class="number-suffix">{{ item.suffix }}</span>{% else %}<span class="number-suffix"></span>{% endif %} </span> <span class="number-label">{{ item.label }}</span> </div> {% endfor %} </div> </div>
Styleable elements (JSON)
["root", "title"]
Lista slot stileabili, es. [{"slot": "title", "default": "h2"}].
CSS base
.block-with-dynamic-numbers { display: flex; padding: 40px; flex-direction: column; gap: 40px; } .block-with-dynamic-numbers h2 { font-size: 65px; font-weight: 700; text-transform: uppercase; line-height: 1.2em; color: #AB1E24; text-align: center; margin: 0; } .block-with-dynamic-numbers .numbers { display: flex; justify-content: space-around; gap: 20px; } .block-with-dynamic-numbers .numbers .number { display: flex; flex-direction: column; align-items: center; } .block-with-dynamic-numbers .numbers .number .number-wrapper { display: flex; font-size: 65px; font-weight: 700; line-height: 1em; letter-spacing: 1px; color: #000000; text-align: center; gap: 5px; } .block-with-dynamic-numbers .numbers .number .number-label { font-size: 26px; font-weight: 400; line-height: 1.2em; color: #000000; } .block-with-dynamic-numbers.red { background-color: #AB1E24; } .block-with-dynamic-numbers.red h2, .block-with-dynamic-numbers.red .numbers .number .number-wrapper, .block-with-dynamic-numbers.red .numbers .number .number-label { color: #FFFFFF; } @media (max-width: 1024px) { .block-with-dynamic-numbers h2 { font-size: 45px; } .block-with-dynamic-numbers .numbers .number .number-wrapper { font-size: 45px; } .block-with-dynamic-numbers .numbers .number .number-label { font-size: 20px; } } @media (max-width: 767px) { .block-with-dynamic-numbers { padding: 40px 20px; } .block-with-dynamic-numbers h2 { font-size: 32px; } .block-with-dynamic-numbers .numbers { flex-wrap: wrap; } .block-with-dynamic-numbers .numbers .number { width: calc(50% - 10px); } } @media (max-width: 320px) { .block-with-dynamic-numbers .numbers { flex: auto; flex-direction: column; } .block-with-dynamic-numbers .numbers .number { width: 100%; } }
JS base (legacy)
Deprecato. Preferire js_shared + js_instance_template.
JS condiviso
(function () { 'use strict'; var DEFAULT_DURATION = 2000; function parseNumber(value, fallback) { var n = parseFloat(value); return Number.isFinite(n) ? n : fallback; } function easeOutCubic(t) { return 1 - Math.pow(1 - t, 3); } function formatValue(value, element) { var decimals = element.getAttribute('data-decimals'); if (decimals !== null && decimals !== '') { return value.toFixed(parseInt(decimals, 10)); } return String(Math.round(value)); } function animateCounter(element) { if (element.dataset.counterAnimated === 'true') { return; } element.dataset.counterAnimated = 'true'; var from = parseNumber(element.getAttribute('data-from-value'), 0); var to = parseNumber(element.getAttribute('data-to-value'), from); var duration = parseNumber(element.getAttribute('data-duration'), DEFAULT_DURATION); if (duration <= 0) { duration = DEFAULT_DURATION; } var startTime = null; function tick(timestamp) { if (startTime === null) { startTime = timestamp; } var elapsed = timestamp - startTime; var progress = Math.min(elapsed / duration, 1); var current = from + (to - from) * easeOutCubic(progress); element.textContent = formatValue(current, element); if (progress < 1) { requestAnimationFrame(tick); } else { element.textContent = formatValue(to, element); } } element.textContent = formatValue(from, element); requestAnimationFrame(tick); } function initCounterAnimations(root) { var counters = root.querySelectorAll('[data-from-value]'); if (!counters.length) { return; } if (!('IntersectionObserver' in window)) { counters.forEach(animateCounter); return; } var observer = new IntersectionObserver( function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { animateCounter(entry.target); observer.unobserve(entry.target); } }); }, { threshold: 0.2, rootMargin: '0px 0px -5% 0px' } ); counters.forEach(function (el) { observer.observe(el); }); } function boot() { document.querySelectorAll('.block-with-dynamic-numbers').forEach(initCounterAnimations); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); } else { boot(); } })();
Library/behavior, incluso una sola volta per blocco.
JS per istanza
Template con {{ block_id }}, eseguito per ogni occorrenza.
Schema contenuti
Content schema json
{}
Default content json
{"title": "", "numbers": "", "color_scheme": ""}