들어가며

최근 프로젝트에서 특정 텍스트를 블러 처리해야 하는 요구사항이 있었습니다. 처음에는 단순히 모자이크 효과만 생각했는데, CSS만으로도 여러 가지 흥미로운 방법이 있다는 걸 알게 되었습니다. 이전에는 텍스트를 감싸는 div를 relative로 만들고 그 안에 absolute, z-index 등을 조정한 반투명한 레이어를 올리는 식으로 구현했었는데 다른 방법이 없나 찾아보다가 공부하게 되었습니다.

 text-shadow로 블러 효과 구현하기

가장 먼저 시도해본 방법은 text-shadow와 color: transparent를 조합하는 것이었습니다:

<style>
.blur-text {
  color: transparent;
  text-shadow: 0 0 5px rgba(0,0,0,0.5);
}
</syle>

...

<div class="blur-text">이 텍스트는 블러 처리됩니다.</div>

...

이 방식의 특징은:

  1. 텍스트 자체는 투명하게 처리하고
  2. 그림자 효과로 블러된 모양을 만듭니다
  3. text-shadow의 세 번째 값(blur-radius)을 조절해서 블러 강도를 조절할 수 있습니다

 

 text-shadow의 응용

다른 활용방법은 없나 찾아보다가 예제를 만들어보게 되었습니다.

/* 네온 사인 효과 */
.neon-text {
  color: #fff;
  text-shadow: 
    0 0 5px #fff,
    0 0 10px #fff,
    0 0 20px #0ff,
    0 0 40px #0ff;
}

/* 텍스트 외곽선 효과 */
.outline-text {
  color: white;
  text-shadow: 
    -1px -1px 0 #000,
    1px -1px 0 #000,
    -1px 1px 0 #000,
    1px 1px 0 #000;
}

text-shadow의 값들을 여러 번 지정하면 레이어처럼 쌓이는 효과를 만들 수 있습니다.

네온 사인 효과의 경우:
1. 가장 안쪽부터 바깥쪽으로 점점 커지는 흰색 그림자(0 0 5px #fff, 0 0 10px #fff)로 빛나는 듯한 느낌을 주고
2. 그 위에 하늘색 그림자(0 0 20px #0ff, 0 0 40px #0ff)를 더해 네온 특유의 번짐 효과를 만듭니다

외곽선 효과는 좀 더 재미있는 접근인데요:
1. 텍스트의 상하좌우 네 방향에 1px 크기의 검정 그림자를 배치해서
2. 마치 텍스트에 외곽선을 그린 것처럼 보이게 만듭니다

 

 

 filter: blur 활용하기

/* 기본 블러 */
.blur-element {
  filter: blur(5px);
}

/* 블러와 밝기 조절 */
.blur-and-dark {
  filter: blur(3px) brightness(80%);
}

/* 여러 필터 조합하기 */
.filter-combo {
  filter: blur(2px) brightness(150%) grayscale(50%);
}

filter 속성은 포토샵의 필터처럼 다양한 시각적 효과를 줄 수 있습니다:

기본 블러의 경우:
- blur(5px)는 요소를 마치 핀트가 안 맞는 사진처럼 흐릿하게 만듭니다
- 픽셀값이 클수록 더 흐릿해집니다 블러와 밝기를 조절한 경우:
- blur(3px)로 약간의 흐림 효과를 주고
- brightness(80%)로 전체적인 밝기를 20% 낮춰서
- 마치 서리유리를 통해 보는 것 같은 효과를 만듭니다

필터 조합의 경우:
- blur(2px)로 살짝 흐리게 하고
- brightness(150%)로 밝기를 50% 높이고
- grayscale(50%)로 컬러를 절반만 남겨서
- 마치 빛에 바랜 듯한 효과를 만들어냅니다 이렇게 여러 필터를 조합하면 단순한 블러 이상의 다양한 효과를 만들 수 있습니다.

 예제 통합

<!DOCTYPE html>
<html>
<head>
  <style>
    body {
      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
      max-width: 800px;
      margin: 40px auto;
      padding: 0 20px;
    }
    
    .demo-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
      gap: 20px;
      margin: 20px 0;
    }
    
    .demo-item {
      background: #f8f9fa;
      padding: 20px;
      border-radius: 8px;
      text-align: center;
    }
    
    .demo-label {
      font-size: 14px;
      color: #666;
      margin-bottom: 10px;
    }
    
    .blur-text {
      color: transparent;
      text-shadow: 0 0 5px rgba(0,0,0,0.5);
      font-size: 20px;
    }
    
    .neon-text {
      color: #fff;
      text-shadow: 
        0 0 5px #fff,
        0 0 10px #fff,
        0 0 20px #0ff,
        0 0 40px #0ff;
      font-size: 20px;
      background: #333;
      padding: 10px;
    }
    
    .outline-text {
      color: white;
      text-shadow: 
        -1px -1px 0 #000,
        1px -1px 0 #000,
        -1px 1px 0 #000,
        1px 1px 0 #000;
      font-size: 20px;
      background: #f0f0f0;
    }
    
    .blur-element {
      filter: blur(5px);
      font-size: 20px;
    }
    
    .blur-and-dark {
      filter: blur(3px) brightness(80%);
      font-size: 20px;
    }
    
    .filter-combo {
      filter: blur(2px) brightness(150%) grayscale(50%);
      font-size: 20px;
    }
  </style>
</head>
<body>
  <h2>CSS 블러 효과 데모</h2>
  
  <div class="demo-grid">
    <div class="demo-item">
      <div class="demo-label">text-shadow 블러</div>
      <div class="blur-text">안녕하세요</div>
    </div>
    
    <div class="demo-item">
      <div class="demo-label">네온 효과</div>
      <div class="neon-text">네온사인</div>
    </div>
    
    <div class="demo-item">
      <div class="demo-label">외곽선 효과</div>
      <div class="outline-text">외곽선</div>
    </div>
    
    <div class="demo-item">
      <div class="demo-label">filter: blur()</div>
      <div class="blur-element">블러 필터</div>
    </div>
    
    <div class="demo-item">
      <div class="demo-label">blur + brightness</div>
      <div class="blur-and-dark">블러 + 어둡게</div>
    </div>
    
    <div class="demo-item">
      <div class="demo-label">여러 필터 조합</div>
      <div class="filter-combo">필터 조합</div>
    </div>
  </div>
</body>
</html>

 

 실제 구현 결과

생각보다 네온사인은 적절히 사용하면 꽤 괜찮은 상황이 있을 것 같고

개인적인 저의 취향에는 text-shadow 블러를 가볍게 사용하거나 filter blur를 쓸 때는 brightness를 같이 사용하고 싶네요

 

각 효과의 특징과 활용법

실제로 구현해보니 각각의 방식이 장단점이 있었습니다

  1. text-shadow 방식:
    • 텍스트만 블러 처리가 필요할 때 좋습니다
    • 투명도와 그림자 강도를 조절해 다양한 효과를 낼 수 있습니다
    • 네온사인이나 외곽선 같은 특수한 효과도 만들 수 있습니다
  2. filter: blur 방식:
    • 요소 전체에 블러를 주고 싶을 때 좋습니다
      • 이미지에 대한 블러라던지 페이지 자체에 대한 블러처리에선 더 간편하게 줄 수 있습니다.
    • brightness, grayscale 등 다른 필터와 조합이 가능합니다
    • 블러 정도를 픽셀 단위로 정확하게 조절할 수 있습니다

+ Recent posts