成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

React組件封裝 - 實(shí)現(xiàn)水印功能

社區(qū)管理員 / 908人閱讀

背景:在開發(fā)移動(dòng)端內(nèi)部應(yīng)用的時(shí)候,涉及安全問題,我們經(jīng)常在企業(yè)微信或者圖片上看到水印,防止信息被泄露,針對(duì)這次開發(fā)做個(gè)復(fù)盤,記錄下。

效果圖如下: image.png

一、實(shí)現(xiàn)原理

  • 1、首先用canvas繪制水印

  • 2、創(chuàng)建蒙層div,可以覆蓋在頁面上,并設(shè)置pointer-events:none屬性

  • 3、將canvas繪制的水印作為背景圖重復(fù)渲染在第二步創(chuàng)建的div上

  • 4、將第三步水印div插入容器中

二、組件封裝

1、新建移動(dòng)端項(xiàng)目,具體見構(gòu)建方法

2、定義組件接收的參數(shù),包括水印覆蓋的樣式和文本內(nèi)容

import PropTypes from 'prop-types' WaterMark.propTypes = {   className: PropTypes.string,   txt: PropTypes.string,   restProps: PropTypes.object } WaterMark.defaultProps = {   txt: "watermark" } 復(fù)制代碼

3、創(chuàng)建容器,將需要打水印的頁面包含其中

<div       className={`watermark_wrapper ${className ? `${className}` : ""}`}       style={{ position: "relative" }}       {...restProps}     >       {children} </div> 復(fù)制代碼

4、canvas繪制水印

這里設(shè)置水印大小,文字樣式,旋轉(zhuǎn)角度等,最終返回一個(gè)canvas。

const generateWaterLog = (content) => {     const canvas = document.createElement("canvas");     canvas.setAttribute("width", "100px");     canvas.setAttribute("height", "100px");     const ctx = canvas.getContext("2d");     ctx.textAlign = "center";     ctx.textBaseline = "middle";     ctx.fontSize = 24;     ctx.fillStyle = "rgba(184, 184, 184, 0.8)";     ctx.rotate(-(Math.PI / 180) * 30);     ctx.fillText(content, 100 / 2, 100 / 2);     return canvas } 復(fù)制代碼

5、創(chuàng)建蒙層將上一步繪制的水印放在上面

設(shè)置蒙層div通過絕對(duì)定位放在文本表面,將canvas轉(zhuǎn)化成base64,作為背景圖重復(fù)渲染在蒙層上。 這樣設(shè)置會(huì)導(dǎo)致,頁面服務(wù)點(diǎn)擊操作,這時(shí)候要設(shè)置 pointer-events: none; 讓蒙層鼠標(biāo)事件失效。這樣不影響實(shí)際內(nèi)容的操作。

const generateWaterMark = (canvas) => {     const bg_url = canvas.toDataURL()     const waterMarkDiv = document.createElement("div");     const style = `       position: absolute;       top: 0;       left: 0;       width: 100%;       height: 100%;       z-index: 1000;       pointer-events: none;       background-repeat: repeat;       background-image: url('${bg_url}')     `;     waterMarkDiv.setAttribute("style", style);     waterMarkDiv.setAttribute("class", "watermark-bg");     return waterMarkDiv } 復(fù)制代碼

6、渲染水印

生成了蒙層,并且渲染了水印,調(diào)用生成水印函數(shù),獲取要渲染水印的容器,并給其中插入水印div, 這里要排除下節(jié)點(diǎn)className為水印蒙層的div

generateTextWatermark(txt, document.body.querySelectAll(".watermark_wrapper")) const generateTextWatermark = (content, container) => {     const canvas = generateWaterLog(content)     const waterMarkDiv = generateWaterMark(canvas)     Array.from(container).forEach((node) => {       if (!node.getElementsByClassName("watermark-bg").length) {         node.appendChild(waterMarkDiv.cloneNode(true));       }     });   }; 復(fù)制代碼

7、調(diào)用

import { WaterMark } from "../../components" <WaterMark>     <div>需要添加水印的文本</div> </WaterMark> 復(fù)制代碼

三、demo示例

yarn安裝

yarn add ucloud-ui 復(fù)制代碼

npm安裝

npm install -S ucloud-ui 復(fù)制代碼

使用

import React from "react"; import { WaterMark } from 'ucloud-ui' function Demo() {     return (         <WaterMark>             <div className="padding10 font-size-14 demo">                 <h2 className="text-center font-size-16">水印DEMO</h2>                 <header className="text-indent-2">                     本協(xié)議將對(duì)用戶使用本產(chǎn)品的行為產(chǎn)生法律約束力,您已承諾和保證有權(quán)利和能力訂立本協(xié)議。用戶開始使用本產(chǎn)品將視為已經(jīng)接受本協(xié)議,請(qǐng)認(rèn)真閱讀并理解本協(xié)議中各種條款,包括免除和限制我們的免責(zé)條款和對(duì)用戶的權(quán)利限制(未成年人審閱時(shí)應(yīng)由法定監(jiān)護(hù)人陪同),如果您不能接受本協(xié)議中的全部條款,請(qǐng)勿開始使用本產(chǎn)品。                 </header>                 <div>                     <h4>一、使用賬戶</h4>                     <p className="text-indent-2">                         您必須承諾和保證: 1. 您使用本產(chǎn)品的行為必須合法                         本產(chǎn)品將會(huì)依據(jù)本協(xié)議“修改和終止”的規(guī)定保留或終止您的賬戶。您必須承諾對(duì)您的登錄信息保密、不被其他人獲取與使用,并且對(duì)您在本賬戶下的所有行為負(fù)責(zé)。您必須將任何有可能觸犯法律的、未授權(quán)使用或懷疑為未授權(quán)使用的行為在第一時(shí)間通知本產(chǎn)品。本產(chǎn)品不對(duì)您因未能遵守上述要求而造成的損失承擔(dān)法律責(zé)任。                     </p>                 </div>             </div>         </WaterMark>     ); } export default Demo;

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/127948.html

相關(guān)文章

  • React組件封裝 - 實(shí)現(xiàn)水印功能

    背景:在開發(fā)移動(dòng)端內(nèi)部應(yīng)用的時(shí)候,涉及安全問題,我們經(jīng)常在企業(yè)微信或者圖片上看到水印,防止信息被泄露,針對(duì)這次開發(fā)做個(gè)復(fù)盤,記錄下。效果圖如下: 一、實(shí)現(xiàn)原理1、首先用canvas繪制水印2、創(chuàng)建蒙層div,可以覆蓋在頁面上,并設(shè)置pointer-events:none屬性3、將canvas繪制的水印作為背景圖重復(fù)渲染在第二步創(chuàng)建的div上4、將第三步水印div插入容器中二、組件封裝1、新建移動(dòng)端...

    社區(qū)管理員 評(píng)論0 收藏0
  • 功能React影像組件(拖拽、水印、縮放、切換、旋轉(zhuǎn))

    摘要:移動(dòng)的過程中可以通過拿到元素的坐標(biāo),記為。向上滾動(dòng)放大,向下滾動(dòng)縮小這里要注意控制最小縮放值。還要注意的是圖片在邊界的縮放,不然圖片可能會(huì)移動(dòng)在屏幕外。代碼實(shí)現(xiàn)控制滾輪縮放計(jì)算縮放后的大小每一次滾輪限制最小不讓由于縮小消失在視野中 cxj-react-image 用法如下: yarn add cxj-react-image // npm i cxj-react-image import...

    soasme 評(píng)論0 收藏0
  • 如何用vue封裝一個(gè)防用戶刪除的平鋪頁面的水印組件

    摘要:需求為了防止截圖等安全問題,在項(xiàng)目頁面中生成一個(gè)平鋪全屏的水印要求水印內(nèi)容為用戶名,水印節(jié)點(diǎn)用戶不能通過開發(fā)者工具等刪除效果如上圖在節(jié)點(diǎn)下插入水印節(jié)點(diǎn),水印節(jié)點(diǎn)覆蓋在頁面最上層但不影響頁面正常操作在通過或者用戶通過開發(fā)者工具刪除或修改水印節(jié) 需求 showImg(https://segmentfault.com/img/remote/1460000017297879?w=1448&h=...

    yagami 評(píng)論0 收藏0
  • SpreadJS 純前端表格控件 V12.2 發(fā)布更新

    摘要:用不到行代碼,在前端實(shí)現(xiàn)的全部功能千萬前端開發(fā)者翹首企盼,終發(fā)布更新六大功能特性,帶來更多便利,用不到行代碼,在前端實(shí)現(xiàn)的全部功能是一款基于的純前端電子表格控件,以高速低耗高度類似可無限擴(kuò)展為產(chǎn)品特色,提供移動(dòng)跨平臺(tái)和瀏覽器支持,同時(shí)滿足等 用不到100行代碼,在前端實(shí)現(xiàn)Excel的全部功能 千萬前端開發(fā)者翹首企盼,SpreadJS V12.2 終發(fā)布更新:六大功能特性,帶來更多便利,...

    FrozenMap 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<