react實現頁面水印效果的全過程
阿新 • • 發佈:2021-09-07
目錄
- 前言
- 1.使用示例
- 2.實現過程
- 3.元件程式碼
- 總結
前言
1.為什麼選用svg 而不是cavans?
因為cavans 在高解析度螢幕下,需要根據 devicePixelRatio做寬高的適配,不然就會很模糊,而svg是向量圖,原生支援各種解析度,不會產生模糊的情況。
1.使用示例
import React from 'react'
import ReactDOM from 'react-dom'
import './index.'
import WaterMarkContent from './components/WaterMarkContent'
import App futXQLQsOSrom './App'
ReactDOM.render(
<React.StrictMode>
<WaterMarkContent>
<App />
</WaterMarkContent>
</React.StrictMode>,document.getElementById('root')
)
2.實現過程
- 構造一個水印圖
- 將水印圖鋪滿整個容器
- 水印元件:支援子元件內容插槽
構造一個svg 的水印圖
const { text = 'waterMark',fontSize = 16,fillOpacity = '0.2',fillColor = '#000' } = props const res = ` <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="180px" height="180px" viewBox="0 0 180 180"> <text x="-100" y="-30" fill='${fillColor}' transform = "rotate(-35 220 -220)" fill-opacity='${fillOpacity}' font-size='${fontSize}'> ${text}</text> </svg>`
由上面的程式碼,我們可以得到一個svg xml 的字串,接下來我們將它變成url 資源
const blob = new Blob([res],{ type: 'image/svg+xml',}) const url = URL.createObjectURL(blob)
由此,我們就得到了一個svg 的資源地址,現在我們將它用於div 的背景圖當中
<div style={{ position: 'absolute',width: '100%',height: '100%',backgroundImage: `url(${url})`,top: 0,left: 0,zIndex: 999,pointerEvents: 'none',//點選穿透 }} ></div>
至此,我們很輕鬆的得到了一個鋪滿水印的div,下面我們將程式碼整合,並封裝成元件。
3.元件程式碼
import React from 'react' import { ReactNode,useMemo } from 'react' type svgPropsType = { text?: string fontSize?: number fillOpacity?: number fillColor?: string } const SvgTextBg = (props: svgPropsType) => { const { text = 'waterMark',fillColor = '#000' } = props const res = ` <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="180px" height="180px" viewBox="0 0 180 180"> <text x="-100" y="-30" fill='${fillColor}' transform = "rotate(-35 220 -220)" fill-opacity='${fillOpacity}' font-size='${fontSize}'> ${text}</text> </svg>` const blob = new Blob([res],}) const url = URL.createObjectURL(blob) return ( <div style={{ position: 'absolute',//點選穿透 }} ></div> ) } type propsType = { children?: ReactNode } & Partial<svgPropsType> const Waterhttp://www.cppcns.comMarkContent = (props: propsType) => { const { text,fontSize,fillOpacity,fillColor } = props const memoInfo = useMemo( () => ({ text,fillColor,}),[text,fillColor] ) return ( <div style={{ position: 'relative',height: ' 100%' }}> {props.children} utXQLQsOS <SvgTextBg {...memoInfo} /> </div> ) } export default WaterMarkContent
總結
到此這篇關於react實現頁面水印效果的文章就介紹到這了,更多相關react實現頁面水印內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!