¡Bienvenido a PHPost!

Para participar en el foro, descargar complementos y acceder al chat, es necesario tener una cuenta activa. Regístrate con un correo válido para completar la activación.

📦 Foro Archivado — Risus 1.3

Risus 1.3 ha finalizado su ciclo de vida y ya no recibe mantenimiento, soporte técnico ni actualizaciones de seguridad. Esta sección se conserva únicamente como archivo histórico y repositorio de descargas para consulta de la comunidad.

Importante: Esta versión contiene vulnerabilidades de seguridad conocidas que han sido corregidas en Risus Nova. No se recomienda utilizar Risus 1.3 en instalaciones nuevas ni en sitios expuestos a Internet.

Si encuentras un tema, complemento o modificación desarrollada para Risus 1.3 que te interese utilizar, no es necesario instalar una versión obsoleta. Puedes solicitar su adaptación en la sección de pedidos de Risus Nova para que sea compatible con la versión actual.

Gracias a todos los usuarios que formaron parte de la etapa de Risus 1.3. El desarrollo continúa en Risus Nova, donde se concentran todas las mejoras, correcciones y nuevas funcionalidades del proyecto.

⚖️ Aviso Legal y Normas de Contenido

PHPost.es es una comunidad dedicada al soporte, desarrollo y difusión de software libre para la creación y administración de comunidades en línea.

Compromiso con la legalidad: No se permite la publicación, promoción o distribución de software pirateado, contenido warez ni material que infrinja derechos de autor o cualquier otra normativa aplicable.

Responsabilidad: Cada usuario es responsable del contenido alojado en su propio sitio web y del uso que haga del software. Los administradores y desarrolladores de Risus Nova no controlan ni supervisan los servidores o contenidos gestionados por terceros.

⚠️ Aviso de seguridad

Risus Nova se distribuye únicamente a través de phpost.es, que es la fuente oficial del proyecto donde publicamos las versiones verificadas.

Recomendamos no utilizar copias obtenidas desde sitios de terceros, ya que podrían haber sido modificadas y no contar con la integridad del código original, lo que puede suponer riesgos de seguridad en la instalación.

Para garantizar una instalación segura y actualizada, descarga siempre la versión oficial desde el botón disponible en esta página.

Importante: No pediremos donaciones en ningún momento ni en ninguna plataforma (Ko-fi, PayPal, redes sociales u otras). Si encuentras campañas de donación que utilicen el nombre de Risus Nova o PHPost, no tienen ninguna relación con el proyecto.

🔄 Desarrollo activo

Risus Nova forma parte de una nueva etapa del proyecto PHPost, en evolución constante con mejoras, correcciones y nuevas funciones. Puedes seguir el progreso y los cambios oficiales a través del changelog y la comunidad.

Risus Nova 2.1 Estable Desarrollo activo Última actualización: 21/07/2026 Ver Demo Changelog 278 Desarrollo del tema: 75% (fase actual de desarrollo) Descargar
Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

DESCARGAS Efecto de Nieve con JavaScript
#1
Question 

6
Mejor respuesta del mensaje Efecto de Nieve con JavaScript¡Hola a todos!
Esta mañana, mientras navegaba por aqui, me encontré con un interesante efecto de veladoras que me inspiró a desarrollar un pequeño código que genera un efecto de nieve.
Quiero compartirlo con ustedes, ya que puede darle un toque especial a sus sitios web.

Ligero:
El script pesa apenas 3 KB sin minificar, por lo que no impactará significativamente en el rendimiento de tu sitio.
Responsivo:
El número de copos de nieve se ajusta automáticamente según el tamaño de la pantalla, con un máximo de 200 copos para evitar sobrecargas.
Interactivo:
si un usuario hace clic en uno, este se elimina. Esto garantiza que no interfiera con la interacción del usuario en tu sitio, como hacer clic en botones o enlaces.
Fácil de personalizar:
El código está diseñado para ser sencillo y claro, permitiéndote personalizar fácilmente aspectos como tamaño, velocidad o cantidad de copos.
Seguro y optimizado:
Incluye medidas para evitar la sobrecarga del DOM, gracias a un manejo eficiente de temporizadores y la limpieza de elementos no necesarios.

Demo:
Debes agradecer para ver el contenido...

Instalación:
  1. Copia el fragmento de código y pégalo en tu archivo HTML.
  2. Ubicación recomendada:
    Puedes colocarlo dentro de las etiquetas 
    <head> o al final de <body>, dependiendo de tus necesidades:
    • Dentro de <head> 
      si quieres que los estilos y animaciones estén disponibles desde el inicio de la carga de la página.
    • Dentro de <body>
       si prefieres cargar el efecto después del contenido principal.
<script>
    (async function () {
        const loadStyles = () => {
            const style = document.createElement("style");
            style.innerHTML = `.snowflake {position: fixed;width: 11px;height: 11px;background: white;border-radius: 50%;animation: fall linear infinite;top: -16px;transition: width 0.6s ease, height 0.6s ease;}.small-snowflakes .snowflake {width: 7px;height: 7px;}@keyframes fall {0% {transform: translate(var(--start-x), -10px) scale(var(--scale));opacity: var(--opacity);}50% {transform: translate(var(--end-x), var(--mid-y)) scale(var(--scale));opacity: var(--opacity);}100% {transform: translate(var(--end-x-final), 100vh) scale(var(--scale));opacity: 0;}}`;
            document.head.appendChild(style);
        };
        const generateSnowflakes = () => {
            const screenWidth = window.innerWidth;
            const baseCount = 200;
            const snowflakeCount = Math.min(baseCount, Math.floor(screenWidth / 5));
            for (let i = 0; i < snowflakeCount; i++) {
                const snowflake = document.createElement('div');
                snowflake.className = 'snowflake';
                const startX = Math.random() * 100 + 'vw';
                snowflake.style.setProperty('--start-x', startX);
                snowflake.style.setProperty('--end-x', `calc(${startX} + ${(Math.random() - 0.5) * 20}vw)`);
                snowflake.style.setProperty('--end-x-final', `calc(${startX} + ${(Math.random() - 0.5) * 10}vw)`);
                snowflake.style.setProperty('--mid-y', Math.random() * 50 + 50 + '%');
                snowflake.style.setProperty('--scale', Math.random() * 0.5 + 0.5);
                snowflake.style.setProperty('--opacity', Math.random() * 0.5 + 0.5);
                snowflake.style.animationDuration = Math.random() * 15 + 10 + 's';
                snowflake.style.animationDelay = Math.random() * -30 + 's';
                document.body.appendChild(snowflake);
            }
            clearTimeout(window.snowTimer);
            window.snowTimer = setTimeout(() => {
                document.body.classList.add('small-snowflakes');
            }, 3000);
        };
        const debounceResize = (func, delay = 300) => {
            let timer;
            return function (...args) {
                clearTimeout(timer);
                timer = setTimeout(() => func.apply(this, args), delay);
            };
        };
        const init = () => {
            loadStyles();
            generateSnowflakes();
            document.body.addEventListener('click', event => {
                if (event.target.classList.contains('snowflake')) {
                    event.target.remove();
                }
            });
            const handleResize = debounceResize(() => {
                document.querySelectorAll('.snowflake').forEach(snowflake => snowflake.remove());
                generateSnowflakes();
            });
            window.addEventListener('resize', handleResize);
        };
        while (true) {
            if (document.readyState === 'complete') {
                init();
                break;
            }
            await new Promise(resolve => setTimeout(resolve, 100));
        }
    })();
</script>
Responder Compartir
#2

3
Hola, para ponerlo en el script hay que ponerlo así, si no, va a dar error.
 
<script>
{
literal}
XXXXXXXXXXXX
{/literal}
</
script


<script>
{
literal}
    (
async function () {
        const 
loadStyles = () => {
            const 
style document.createElement("style");
            
style.innerHTML = `.snowflake {position: fixed;width: 11px;height: 11px;background: white;border-radius: 50%;animation: fall linear infinite;top: -16px;transition: width 0.6s ease, height 0.6s ease;}.small-snowflakes .snowflake {width: 7px;height: 7px;}@keyframes fall {0% {transform: translate(var(--start-x), -10px) scale(var(--scale));opacity: var(--opacity);}50% {transform: translate(var(--end-x), var(--mid-y)) scale(var(--scale));opacity: var(--opacity);}100% {transform: translate(var(--end-x-final), 100vh) scale(var(--scale));opacity: 0;}}`;
            
document.head.appendChild(style);
        };
        const 
generateSnowflakes = () => {
            const 
screenWidth window.innerWidth;
            const 
baseCount 200;
            const 
snowflakeCount Math.min(baseCountMath.floor(screenWidth 5));
            for (
let i 0snowflakeCounti++) {
                const 
snowflake document.createElement('div');
                
snowflake.className 'snowflake';
                const 
startX Math.random() * 100 'vw';
                
snowflake.style.setProperty('--start-x'startX);
                
snowflake.style.setProperty('--end-x', `calc(${startX} + ${(Math.random() - 0.5) * 20}vw)`);
                
snowflake.style.setProperty('--end-x-final', `calc(${startX} + ${(Math.random() - 0.5) * 10}vw)`);
                
snowflake.style.setProperty('--mid-y'Math.random() * 50 50 '%');
                
snowflake.style.setProperty('--scale'Math.random() * 0.5 0.5);
                
snowflake.style.setProperty('--opacity'Math.random() * 0.5 0.5);
                
snowflake.style.animationDuration Math.random() * 15 10 's';
                
snowflake.style.animationDelay Math.random() * -30 's';
                
document.body.appendChild(snowflake);
            }
            
clearTimeout(window.snowTimer);
            
window.snowTimer setTimeout(() => {
                
document.body.classList.add('small-snowflakes');
            }, 
3000);
        };
        const 
debounceResize = (funcdelay 300) => {
            
let timer;
            return function (...
args) {
                
clearTimeout(timer);
                
timer setTimeout(() => func.apply(thisargs), delay);
            };
        };
        const 
init = () => {
            
loadStyles();
            
generateSnowflakes();
            
document.body.addEventListener('click'event => {
                if (
event.target.classList.contains('snowflake')) {
                    
event.target.remove();
                }
            });
            const 
handleResize debounceResize(() => {
                
document.querySelectorAll('.snowflake').forEach(snowflake => snowflake.remove());
                
generateSnowflakes();
            });
            
window.addEventListener('resize'handleResize);
        };
        while (
true) {
            if (
document.readyState === 'complete') {
                
init();
                break;
            }
            
await new Promise(resolve => setTimeout(resolve100));
        }
    })();
    {/
literal}
</
script

[Imagen: y3cm3zC.gif]


Gracias por compartirlo, saludos.
Responder Compartir


Compartir en:

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)