Blur Animation

Smoothly focus or blur elements with blur effects

Blur Animation

The Blur animation applies blur effects to elements, useful for shifting focus or creating soft backgrounds. It provides visual depth and elegant transition effects.

Basic Usage

import { transition } from '@ssgoi/react';
import { blur } from '@ssgoi/react/transitions';

function Component() {
  const [isVisible, setIsVisible] = useState(true);
  
  return (
    <div>
      {isVisible && (
        <div ref={transition({ key: 'blur-element', ...blur() })}>
          Element with blur animation
        </div>
      )}
    </div>
  );
}

Options

interface BlurOptions {
  amount?: number | string;  // Blur intensity (default: 10)
  opacity?: number;          // Starting opacity (default: 0)
  scale?: boolean;           // Add scale effect (default: false)
  fade?: boolean;            // Add fade effect (default: true)
  spring?: {
    stiffness?: number;      // Spring stiffness (default: 300)
    damping?: number;        // Damping coefficient (default: 30)
  };
}

Option Details

  • amount: Blur intensity (in pixels or CSS value)
  • opacity: Starting opacity (0-1)
  • scale: Whether to apply scale effect with blur
  • fade: Whether to apply fade effect with blur
  • spring: Spring physics settings

Usage Examples

Heavy Blur Effect

const heavyBlur = blur({
  amount: 20,  // Strong blur
  spring: { stiffness: 200, damping: 25 }
});

<div ref={transition({ key: 'heavy-blur', ...heavyBlur })}>
  Heavily blurred element
</div>

Blur + Scale Combination

const blurScale = blur({
  amount: 15,
  scale: true,  // Add scale effect
  spring: { stiffness: 400, damping: 35 }
});

<div ref={transition({ key: 'blur-scale', ...blurScale })}>
  Blur with scale down effect
</div>

Blur Only (No Fade)

const blurOnly = blur({
  fade: false,     // Remove fade effect
  opacity: 1,      // Maintain full opacity
  amount: '2rem'   // Using rem units
});

<div ref={transition({ key: 'blur-only', ...blurOnly })}>
  Blur without opacity change
</div>

Practical Use Cases

Background Blur Effect

function BlurredBackground() {
  const [isModalOpen, setIsModalOpen] = useState(false);
  
  return (
    <div className="relative">
      {/* Background content */}
      <div className="p-8">
        <h1>Main Content</h1>
        <button onClick={() => setIsModalOpen(true)}>
          Open Modal
        </button>
      </div>
      
      {/* Blur overlay */}
      {isModalOpen && (
        <div 
          ref={transition({ 
            key: 'blur-overlay', 
            ...blur({ amount: 8, opacity: 0.5 }) 
          })}
          className="fixed inset-0 bg-black/20"
          onClick={() => setIsModalOpen(false)}
        />
      )}
    </div>
  );
}

Image Loading Effect

function BlurredImage({ src, alt }) {
  const [isLoaded, setIsLoaded] = useState(false);
  
  return (
    <div className="relative">
      {/* Placeholder */}
      {!isLoaded && (
        <div 
          ref={transition({ 
            key: 'image-placeholder', 
            ...blur({ amount: 20 }) 
          })}
          className="absolute inset-0 bg-gray-200"
        />
      )}
      
      {/* Actual image */}
      <img
        src={src}
        alt={alt}
        onLoad={() => setIsLoaded(true)}
        className={isLoaded ? 'opacity-100' : 'opacity-0'}
      />
    </div>
  );
}

Focus Transition Effect

function FocusableCards() {
  const [focusedId, setFocusedId] = useState(null);
  
  return (
    <div className="grid grid-cols-3 gap-4">
      {[1, 2, 3].map(id => (
        <div
          key={id}
          onClick={() => setFocusedId(id)}
          className="relative cursor-pointer"
        >
          {/* Blur effect */}
          {focusedId && focusedId !== id && (
            <div 
              ref={transition({ 
                key: `blur-${id}`, 
                ...blur({ amount: 5, opacity: 0.7 }) 
              })}
              className="absolute inset-0 z-10"
            />
          )}
          
          {/* Card content */}
          <div className="p-6 bg-white rounded-lg shadow">
            <h3>Card {id}</h3>
            <p>Click to focus</p>
          </div>
        </div>
      ))}
    </div>
  );
}

Advanced Usage

Dynamic Blur Intensity

function DynamicBlur() {
  const [blurAmount, setBlurAmount] = useState(10);
  
  const dynamicBlur = blur({
    amount: blurAmount,
    spring: { stiffness: 300, damping: 30 }
  });
  
  return (
    <div>
      <input
        type="range"
        min="0"
        max="30"
        value={blurAmount}
        onChange={(e) => setBlurAmount(Number(e.target.value))}
      />
      
      <div ref={transition({ key: `blur-${blurAmount}`, ...dynamicBlur })}>
        Blur intensity: {blurAmount}px
      </div>
    </div>
  );
}

Text Spoiler

function Spoiler({ children }) {
  const [isRevealed, setIsRevealed] = useState(false);
  
  return (
    <span 
      className="relative inline-block cursor-pointer"
      onClick={() => setIsRevealed(!isRevealed)}
    >
      {!isRevealed && (
        <span 
          ref={transition({ 
            key: 'spoiler-blur', 
            ...blur({ amount: 8, fade: false }) 
          })}
          className="absolute inset-0"
        />
      )}
      <span className={!isRevealed ? 'select-none' : ''}>
        {children}
      </span>
    </span>
  );
}

Performance Considerations

  • Blur effects use GPU acceleration but are more computationally intensive than other effects
  • May cause performance degradation when applied to large areas or many elements simultaneously
  • Consider reducing blur intensity on mobile devices

Performance Optimization Tips

// Mobile optimization
const isMobile = window.innerWidth < 768;
const optimizedBlur = blur({
  amount: isMobile ? 5 : 15,  // Reduce blur on mobile
  spring: { 
    stiffness: isMobile ? 400 : 300,  // Faster animation on mobile
    damping: 35 
  }
});

Browser Compatibility

  • Supported in all modern browsers
  • Safari may require -webkit-backdrop-filter
  • IE11 does not support CSS filters
  • Modals/Dialogs: Blurring background content
  • Image Loading: Transitioning from placeholder to actual image
  • Focus Effects: Emphasizing important elements
  • Spoiler Text: Hiding content before user interaction
  • Depth Expression: Distinguishing UI layers