Vue에서 특정 요소에 다중 행 워터마크 적용하기

Canvas 기반 워터마크 유틸리티 구현

utils/Watermark.js 파일 생성:


const watermarkUtil = {
  createMark: (line1, line2, targetElement) => {
    const elementId = 'watermark-element'
    
    if (!targetElement) return
    
    const existingMark = document.getElementById(elementId)
    if (existingMark) existingMark.remove()
    
    const containerWidth = targetElement.offsetWidth
    const containerHeight = targetElement.offsetHeight
    targetElement.style.position = 'relative'
    
    // 캔버스로 배경 패턴 생성
    const canvas = document.createElement('canvas')
    canvas.width = 380
    canvas.height = 220
    const ctx = canvas.getContext('2d')
    
    ctx.rotate(-18 * Math.PI / 180)
    ctx.font = '18px Segoe UI'
    ctx.fillStyle = 'rgba(180, 180, 180, 0.35)'
    ctx.textBaseline = 'middle'
    
    ctx.fillText(line1, 30, canvas.height * 0.6)
    ctx.fillText(line2, 30, canvas.height * 0.85)
    
    // 워터마크 컨테이너 생성
    const markContainer = document.createElement('div')
    markContainer.id = elementId
    markContainer.style.cssText = `
      position: absolute;
      top: 0;
      left: 0;
      width: ${containerWidth}px;
      height: ${containerHeight}px;
      pointer-events: none;
      z-index: 1000;
      background: url(${canvas.toDataURL('image/png')}) repeat;
    `
    
    targetElement.appendChild(markContainer)
    return elementId
  },
  
  apply: (text1, text2, container) => {
    let markId = watermarkUtil.createMark(text1, text2, container)
    
    // 주기적으로 워터마크 존재 확인
    const checker = setInterval(() => {
      if (!document.getElementById(markId)) {
        markId = watermarkUtil.createMark(text1, text2, container)
      }
    }, 1000)
    
    // 창 크기 변경 시 재적용
    window.addEventListener('resize', () => {
      watermarkUtil.createMark(text1, text2, container)
    })
  }
}

export default watermarkUtil

Vue 컴포넌트에서 사용법

템플릿 구조:


<template>
  <div ref="targetContainer">
    <!-- 모달 내용 또는 워터마크 적용 대상 영역 -->
  </div>
</template>

컴포넌트 로직:


import watermark from '@/utils/Watermark'

export default {
  methods: {
    showWatermark() {
      this.$nextTick(() => {
        watermark.apply(
          '첫 번째 텍스트', 
          '두 번째 텍스트',
          this.$refs.targetContainer
        )
      })
    }
  }
}

모달 사용 시 주의사항:

  • 모달이 완전히 렌더링된 후 적용해야 함 (this.$nextTick 또는 open 이벤트 후)
  • 대상 컨테이너는 position: relative 속성 필요
  • 동적 크기 변경 시 자동 재생성 처리됨

태그: Vue.js canvas 워터마크 프론트엔드

7월 14일 06:47에 게시됨