最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react實(shí)現(xiàn)頁(yè)面水印效果的全過(guò)程

 更新時(shí)間:2021年09月06日 14:52:37   作者:五邊形的男人  
大家常常關(guān)注的是網(wǎng)站圖片增加水印,而很少關(guān)注頁(yè)面水印,其實(shí)這個(gè)需求也是比較常見(jiàn)的,比如公文系統(tǒng)、合同系統(tǒng)等,這篇文章主要給大家介紹了關(guān)于react實(shí)現(xiàn)頁(yè)面水印效果的相關(guān)資料,需要的朋友可以參考下

前言

1.為什么選用svg 而不是cavans?

因?yàn)閏avans 在高分辨率屏幕下,需要根據(jù) devicePixelRatio做寬高的適配,不然就會(huì)很模糊,而svg是矢量圖,原生支持各種分辨率,不會(huì)產(chǎn)生模糊的情況。

1.使用示例

import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import WaterMarkContent from './components/WaterMarkContent'
import App from './App'

ReactDOM.render(
  <React.StrictMode>
    <WaterMarkContent>
      <App />
    </WaterMarkContent>
  </React.StrictMode>,
  document.getElementById('root')
)

2.實(shí)現(xiàn)過(guò)程

  • 構(gòu)造一個(gè)水印圖
  • 將水印圖鋪滿(mǎn)整個(gè)容器
  • 水印組件:支持子組件內(nèi)容插槽

構(gòu)造一個(gè)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>`

由上面的代碼,我們可以得到一個(gè)svg xml 的字符串,接下來(lái)我們將它變成url 資源

 const blob = new Blob([res], {
    type: 'image/svg+xml',
  })

 const url = URL.createObjectURL(blob)

由此,我們就得到了一個(gè)svg 的資源地址,現(xiàn)在我們將它用于div 的背景圖當(dāng)中

    <div
      style={{
        position: 'absolute',
        width: '100%',
        height: '100%',
        backgroundImage: `url(${url})`,
        top: 0,
        left: 0,
        zIndex: 999,
        pointerEvents: 'none', //點(diǎn)擊穿透
      }}
    ></div>

至此,我們很輕松的得到了一個(gè)鋪滿(mǎn)水印的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', 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>`

  const blob = new Blob([res], {
    type: 'image/svg+xml',
  })

  const url = URL.createObjectURL(blob)

  return (
    <div
      style={{
        position: 'absolute',
        width: '100%',
        height: '100%',
        backgroundImage: `url(${url})`,
        top: 0,
        left: 0,
        zIndex: 999,
        pointerEvents: 'none', //點(diǎn)擊穿透
      }}
    ></div>
  )
}

type propsType = {
  children?: ReactNode
} & Partial<svgPropsType>

const WaterMarkContent = (props: propsType) => {
  const { text, fontSize, fillOpacity, fillColor } = props

  const memoInfo = useMemo(
    () => ({
      text,
      fontSize,
      fillOpacity,
      fillColor,
    }),
    [text, fontSize, fillOpacity, fillColor]
  )
  return (
    <div style={{ position: 'relative', width: '100%', height: ' 100%' }}>
      {props.children}
      <SvgTextBg {...memoInfo} />
    </div>
  )
}

export default WaterMarkContent

總結(jié)

到此這篇關(guān)于react實(shí)現(xiàn)頁(yè)面水印效果的文章就介紹到這了,更多相關(guān)react實(shí)現(xiàn)頁(yè)面水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react+tsx中使用better-scroll詳解

    react+tsx中使用better-scroll詳解

    這篇文章主要介紹了react+tsx中使用better-scroll,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • React.memo 和 useMemo 的使用問(wèn)題小結(jié)

    React.memo 和 useMemo 的使用問(wèn)題小結(jié)

    隨著代碼的增加,每次的狀態(tài)改變,頁(yè)面進(jìn)行一次 reRender ,這將產(chǎn)生很多不必要的 reRender 不僅浪費(fèi)性能,從而導(dǎo)致頁(yè)面卡頓,這篇文章主要介紹了React.memo 和 useMemo 的使用問(wèn)題小結(jié),需要的朋友可以參考下
    2022-11-11
  • React實(shí)現(xiàn)數(shù)字滾動(dòng)組件numbers-scroll的示例詳解

    React實(shí)現(xiàn)數(shù)字滾動(dòng)組件numbers-scroll的示例詳解

    數(shù)字滾動(dòng)組件,也可以叫數(shù)字輪播組件,這個(gè)名字一聽(tīng)就是非常普通常見(jiàn)的組件。本文將利用React實(shí)現(xiàn)這一組件,感興趣的小伙伴可以了解一下
    2023-03-03
  • React Native 如何獲取不同屏幕的像素密度

    React Native 如何獲取不同屏幕的像素密度

    這篇文章主要介紹了 React Native 如何 獲取不同屏幕的像素密度的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • react使用websocket實(shí)時(shí)通信方式

    react使用websocket實(shí)時(shí)通信方式

    這篇文章主要介紹了react使用websocket實(shí)時(shí)通信方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • React用法之高階組件的用法詳解

    React用法之高階組件的用法詳解

    高階組件也就是我們常說(shuō)的HOC,是React中用于復(fù)用組件邏輯的一種高級(jí)技巧。這篇文章主要通過(guò)一些示例帶大家學(xué)習(xí)一下高階組件的使用,希望對(duì)大家有所幫助
    2023-04-04
  • React中使用ResizeObserver來(lái)觀察元素size變化的方法

    React中使用ResizeObserver來(lái)觀察元素size變化的方法

    在 React 中使用 ResizeObserver 來(lái)觀察元素的大小變化,可以通過(guò)創(chuàng)建一個(gè)自定義 Hook 來(lái)封裝 ResizeObserver 的邏輯,并在組件中使用這個(gè) Hook,以下是一個(gè)完整的示例,展示了如何在 React 中使用 ResizeObserver 來(lái)觀察元素的大小變化,需要的朋友可以參考下
    2024-12-12
  • Next.js搭建Monorepo組件庫(kù)文檔實(shí)現(xiàn)詳解

    Next.js搭建Monorepo組件庫(kù)文檔實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Next.js搭建Monorepo組件庫(kù)文檔,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React模擬實(shí)現(xiàn)Vue的keepAlive功能

    React模擬實(shí)現(xiàn)Vue的keepAlive功能

    Vue中,keep-alive組件可以緩存組件狀態(tài),在路由切換時(shí)重新掛載,實(shí)現(xiàn)這一功能在React中并不簡(jiǎn)單,但我們可以借助一個(gè)第三方庫(kù)——react-activation 來(lái)模擬Vue的keep-alive功能,需要的朋友可以參考下
    2024-10-10
  • React Native 截屏組件的示例代碼

    React Native 截屏組件的示例代碼

    本篇文章主要介紹了React Native 截屏組件的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12

最新評(píng)論

慈利县| 梧州市| 绵阳市| 融水| 巨野县| 乐业县| 大城县| 赤壁市| 嘉峪关市| 永新县| 牟定县| 隆化县| 调兵山市| 吐鲁番市| 邢台市| 六安市| 宁波市| 资溪县| 突泉县| 黄石市| 临湘市| 漳州市| 阳泉市| 宁海县| 富民县| 新疆| 康定县| 临湘市| 伊春市| 卢龙县| 彰化市| 洛南县| 天峻县| 仁怀市| 沭阳县| 秦皇岛市| 特克斯县| 肇庆市| 乌拉特前旗| 延寿县| 武定县|