💧 ウォーターマーク - あなたのコンテンツ守護者
🌟 紹介
大切なコンテンツを無断利用から守りたいですか?Watermark ウォーターマークコンポーネントがあなたの心強い守護者となります!🛡️
ページに優雅にテキストや画像のウォーターマークを追加し、まるでコンテンツに専用の印章を押すように📝、重要な文書、デザイン作品、機密情報などを効果的に保護します。
🎯 コア機能:
- 🔤 テキストウォーターマーク:カスタムテキストコンテンツとスタイルをサポート
- 🖼️ 画像ウォーターマーク:ロゴ、署名などの画像ウォーターマークをサポート
- 🎨 HTML ウォーターマーク:リッチテキストと複雑なスタイルをサポート
- 📐 柔軟なレイアウト:間隔、角度、透明度をカスタマイズ
- 🌍 フルスクリーンカバー:部分またはフルスクリーン表示を選択可能
- ⚡ パフォーマンス最適化:軽量実装でページパフォーマンスに影響なし
💡 バージョン要件:このコンポーネントを使用するには
vantを >= 4.2.0 にアップグレードしてください。
📦 インポート
以下の方法でグローバルにコンポーネントを登録します。他の登録方法はコンポーネント登録をご参照ください。
js
import { createApp } from 'vue';
import { Watermark } from 'vant';
const app = createApp();
app.use(Watermark);🎮 コードデモ
📝 文字ウォーターマーク
最も基本的な使用方法です。content 属性を使用して水印のテキストを設定します。これは版権表示、機密情報保護などに便利です。
vue
<template>
<div class="demo-container">
<van-watermark content="Vant Watermark">
<div class="content">
<h3>📄 重要文書</h3>
<p>ここには重要な内容が含まれています...</p>
<p>ウォーターマークは内容の上方に自動配置され、保護効果を提供します。</p>
</div>
</van-watermark>
</div>
</template>
<style>
.demo-container {
height: 300px;
background: #f7f8fa;
}
.content {
padding: 20px;
background: white;
border-radius: 8px;
margin: 20px;
}
</style>🖼️ 画像ウォーターマーク
画像ウォーターマークは、企業ロゴや個人署名などを使用して、コンテンツの专业性と品牌識別度を高めます。
vue
<template>
<div class="demo-container">
<van-watermark
image="https://fastly.jsdelivr.net/npm/@vant/assets/vant-logo.png"
:opacity="0.3"
:width="120"
:height="64"
>
<div class="content">
<h3>🎨 設計作品</h3>
<p>これは、版権保護が必要な設計作品です</p>
<div class="image-placeholder">
[設計画像エリア]
</div>
</div>
</van-watermark>
</div>
</template>
<style>
.image-placeholder {
width: 100%;
height: 150px;
background: linear-gradient(45deg, #f0f0f0, #e0e0e0);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
color: #999;
margin-top: 16px;
}
</style>📏 カスタム間隔
水印間距を調整して、異なる視覺効果を創造します。これにより、設計需求に合わせた保護効果を実現できます。
vue
<template>
<div class="demo-container">
<!-- 密集水印 -->
<van-watermark
content="CONFIDENTIAL"
:gap-x="50"
:gap-y="50"
text-color="#ff6b6b"
:opacity="0.15"
>
<div class="content">
<h3>🔒 機密文書</h3>
<p>密集のウォーターマークは、保護効果を提供します</p>
</div>
</van-watermark>
<!-- 稀疏水印 -->
<van-watermark
content="DRAFT"
:gap-x="200"
:gap-y="150"
text-color="#4ecdc4"
:opacity="0.2"
>
<div class="content">
<h3>📋 草稿文書</h3>
<p>稀疏のウォーターマークは、内容の清晰度を保持します</p>
</div>
</van-watermark>
</div>
</template>🔄 カスタム傾斜角度
水印角度を調整して、自然な視覺効果を創造します。これにより、内容との衝突を避けることができます。
vue
<template>
<div class="demo-container">
<!-- 轻微倾斜 -->
<van-watermark
content="© 2024 Your Company"
:rotate="-15"
text-color="#95a5a6"
>
<div class="content">
<h3>📊 データレポート</h3>
<p>轻微傾斜のウォーターマークは、自然な視覺効果を提供します</p>
</div>
</van-watermark>
<!-- 垂直水印 -->
<van-watermark
content="SAMPLE"
:rotate="90"
text-color="#e74c3c"
:opacity="0.1"
>
<div class="content">
<h3>📋 樣本文書</h3>
<p>垂直ウォーターマークは、特殊な場面で有用です</p>
</div>
</van-watermark>
</div>
</template>🌍 表示範囲制御
必要に応じて、局部または全屏のウォーターマークを表示します。これにより、保護効果を柔軟に適用できます。
vue
<template>
<div class="demo-container">
<!-- 局部水印 -->
<div class="section">
<h4>📍 局部ウォーターマーク</h4>
<van-watermark content="Local Watermark">
<div class="content">
<p>ウォーターマークはこの領域にのみ表示されます</p>
</div>
</van-watermark>
</div>
<!-- 全屏水印 -->
<div class="section">
<h4>🌐 全屏ウォーターマーク</h4>
<van-watermark
content="Full Page Watermark"
:full-page="true"
:opacity="0.05"
>
<div class="content">
<p>ウォーターマークは整個ページを覆います</p>
</div>
</van-watermark>
</div>
</div>
</template>🎨 HTML ウォーターマーク
使用 HTML 創建複雜のウォーターマーク効果,支援多行文字、画像組合等高級樣式。
vue
<template>
<div class="demo-container">
<van-watermark>
<template #content>
<div style="color: #3498db; font-size: 16px; text-align: center;">
<div style="font-weight: bold;">🏢 Your Company</div>
<div style="font-size: 12px; margin-top: 4px;">© 2025 All Rights Reserved</div>
<div style="font-size: 10px; color: #95a5a6;">ID: WM-001</div>
</div>
</template>
<div class="content">
<h3>🎯 高級ウォーターマーク</h3>
<p>使用 HTML 插槽創建複雜のウォーターマーク効果</p>
<p>支援多行文字、不同樣式の組合</p>
</div>
</van-watermark>
</div>
</template>🎪 動態水印
結合 Vue 的響應式特性,創建動態變化のウォーターマーク効果。
vue
<template>
<div class="demo-container">
<van-watermark
:content="dynamicContent"
:rotate="currentRotate"
:opacity="currentOpacity"
text-color="#9b59b6"
>
<div class="content">
<h3>⚡ 動態ウォーターマーク</h3>
<p>当当前時間:{{ currentTime }}</p>
<p>ユーザー:{{ currentUser }}</p>
<div class="controls">
<button @click="toggleAnimation">
{{ isAnimating ? '停止アニメーション' : '開始アニメーション' }}
</button>
</div>
</div>
</van-watermark>
</div>
</template>
<script setup>
import { ref, computed, onMounted, onUnmounted } from 'vue';
const currentTime = ref(new Date().toLocaleString());
const currentUser = ref('ユーザー名');
const currentRotate = ref(-22);
const currentOpacity = ref(0.1);
const isAnimating = ref(false);
let timer = null;
let animationTimer = null;
// 動態內容
const dynamicContent = computed(() => {
return `${currentUser.value} - ${currentTime.value}`;
});
// 更新時間
const updateTime = () => {
currentTime.value = new Date().toLocaleString();
};
// 動畫效果
const toggleAnimation = () => {
isAnimating.value = !isAnimating.value;
if (isAnimating.value) {
animationTimer = setInterval(() => {
currentRotate.value = -22 + Math.sin(Date.now() / 1000) * 10;
currentOpacity.value = 0.1 + Math.sin(Date.now() / 500) * 0.05;
}, 100);
} else {
clearInterval(animationTimer);
currentRotate.value = -22;
currentOpacity.value = 0.1;
}
};
onMounted(() => {
timer = setInterval(updateTime, 1000);
});
onUnmounted(() => {
clearInterval(timer);
clearInterval(animationTimer);
});
</script>
<style>
.controls {
margin-top: 16px;
}
.controls button {
padding: 8px 16px;
background: #3498db;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
</style>📚 API 參考
Props
| 參數 | 說明 | 類型 | 默認值 | 示例 |
|---|---|---|---|---|
| width | 💾 水印の幅 | number | 100 | 120 |
| height | 📏 水印の高さ | number | 100 | 64 |
| z-index | 🔝 水印の z-index 層級 | number | string | 100 | 999 |
| content | 📝 文字水印の内容 | string | - | '© 2025 Company' |
| image | 🖼️ 画像水印の内容,優先級高於 content | string | - | 'logo.png' |
| rotate | 🔄 水印の回転角度(度) | number | string | -22 | 45 |
| full-page | 🌍 水印是否全屏顯示 | boolean | false | true |
| gap-x | ↔️ 水印之間の水平間隔 | number | 0 | 100 |
| gap-y | ↕️ 水印之間の垂直間隔 | number | 0 | 80 |
| text-color | 🎨 文字水印の色 | string | #dcdee0 | '#ff6b6b' |
| opacity | 👻 水印の透明度 | number | string | - | 0.3 |
Slots
| 名稱 | 說明 | 示例 |
|---|---|---|
| content | 🎨 HTML 水印の内容,僅支援行內樣式,優先級最高 | 複雜の多行水印 |
類型定義
組件導出以下類型定義:
ts
import type { WatermarkProps } from 'vant';
// 水印組件の属性類型
interface WatermarkProps {
width?: number;
height?: number;
zIndex?: number | string;
content?: string;
image?: string;
rotate?: number | string;
fullPage?: boolean;
gapX?: number;
gapY?: number;
textColor?: string;
opacity?: number | string;
}🎯 実際アプリケーションシナリオ
📄 文檔保護
vue
<!-- 企業内部文檔 -->
<van-watermark
content="内部機密 - 禁止外傳"
text-color="#e74c3c"
:opacity="0.15"
:gap-x="150"
:gap-y="100"
>
<div class="document">
<!-- 文檔内容 -->
</div>
</van-watermark>🎨 設計作品
vue
<!-- 設計師作品集 -->
<van-watermark
image="/logo.png"
:opacity="0.2"
:width="100"
:height="50"
:gap-x="200"
:gap-y="150"
>
<div class="portfolio">
<!-- 設計作品 -->
</div>
</van-watermark>📊 データ報表
vue
<!-- 財務報表 -->
<van-watermark>
<template #content>
<div style="text-align: center; color: #95a5a6;">
<div>財務部門</div>
<div style="font-size: 12px;">{{ new Date().toLocaleDateString() }}</div>
</div>
</template>
<div class="report">
<!-- 報表内容 -->
</div>
</van-watermark>📱 移動端應用
vue
<!-- 移動端截圖保護 -->
<van-watermark
content="App 內容截圖"
:full-page="true"
:opacity="0.08"
text-color="#3498db"
:rotate="-30"
>
<div class="mobile-content">
<!-- 移動端內容 -->
</div>
</van-watermark>💡 最佳實踐
🎯 透明度設置
js
// ✅ 推薦的透明度範圍
const opacity = {
subtle: 0.05, // 極其微妙,幾乎不可見
light: 0.1, // 輕微可見,不影響閱讀
normal: 0.15, // 正常可見,平衡保護和體驗
strong: 0.3, // 強烈可見,強保護需求
maximum: 0.5 // 最大可見,特殊場景使用
};🎨 顏色選擇
js
// 根据背景选择合适的水印颜色
const colorSchemes = {
lightBackground: '#000000', // 浅色背景用深色水印
darkBackground: '#ffffff', // 深色背景用浅色水印
colorfulBackground: '#808080', // 彩色背景用中性色
brandColor: '#your-brand-color' // 使用品牌色
};📐 尺寸和間距
js
// 推薦的尺寸配置
const sizeConfigs = {
dense: { gapX: 50, gapY: 50 }, // 密集保護
normal: { gapX: 100, gapY: 80 }, // 正常間距
sparse: { gapX: 200, gapY: 150 }, // 稀疏佈局
minimal: { gapX: 300, gapY: 200 } // 最小干擾
};🔄 動態水印
vue
<script setup>
// 根據用戶信息生成動態水印
const generateWatermark = (user) => {
return `${user.name} - ${user.department} - ${new Date().toLocaleString()}`;
};
// 根據內容敏感度調整水印強度
const getWatermarkConfig = (sensitivity) => {
const configs = {
low: { opacity: 0.05, gapX: 300, gapY: 200 },
medium: { opacity: 0.1, gapX: 150, gapY: 100 },
high: { opacity: 0.2, gapX: 80, gapY: 60 }
};
return configs[sensitivity] || configs.medium;
};
</script>🛠️ 調試技巧
🔍 水印可見性調試
vue
<script setup>
// 開發環境下增強水印可見性
const debugMode = process.env.NODE_ENV === 'development';
const debugOpacity = debugMode ? 0.5 : 0.1;
const debugColor = debugMode ? '#ff0000' : '#dcdee0';
</script>📊 性能監控
js
// 監控水印渲染性能
const measureWatermarkPerformance = () => {
const start = performance.now();
// 水印渲染逻辑
const end = performance.now();
console.log(`水印渲染耗時: ${end - start}ms`);
};⚡ 性能優化
🎯 減少重繪
vue
<script setup>
// 使用 computed 避免不必要的重新計算
const watermarkConfig = computed(() => ({
content: props.content,
opacity: props.opacity,
rotate: props.rotate
}));
// 使用 watchEffect 優化響應式更新
watchEffect(() => {
if (watermarkConfig.value.content) {
updateWatermark();
}
});
</script>🖼️ 圖片優化
js
// 優化圖片水印加載
const optimizeImageWatermark = (imageUrl) => {
// 预加载图片
const img = new Image();
img.onload = () => {
// 圖片加載完成後應用水印
applyImageWatermark(img);
};
img.src = imageUrl;
};🎨 主題定制
樣式變量
組件提供了下列 CSS 變量,可用於自定義樣式,使用方法請參考 ConfigProvider 組件。
| 名稱 | 默認值 | 描述 | 使用場景 |
|---|---|---|---|
| --van-watermark-z-index | 100 | 根節點的 z-index 層級 | 調整水印層級關係 |
自定義主題示例
css
/* 企業主題 */
.enterprise-watermark {
--van-watermark-z-index: 999;
}
/* 設計師主題 */
.designer-watermark {
--van-watermark-z-index: 50;
}🌐 瀏覽器兼容性
| 瀏覽器 | 版本支持 | 特殊說明 |
|---|---|---|
| Chrome | 60+ | ✅ 完全支持 |
| Firefox | 60+ | ✅ 完全支持 |
| Safari | 12+ | ✅ 完全支持 |
| Edge | 79+ | ✅ 完全支持 |
| iOS Safari | 12+ | ✅ 移動端支持 |
| Android Chrome | 60+ | ✅ 移動端支持 |
📖 相關文檔
🎯 核心組件
- Button 按鈕 - 基礎交互組件
- Image 圖片 - 圖片展示組件
- Overlay 遮罩層 - 遮罩層組件
- ConfigProvider 全局配置 - 主題配置
🛠️ 開發工具
🎉 開始使用 Watermark 組件保護你的內容吧! 選擇合適的水印類型和配置,為你的應用添加專業的內容保護功能!