兩種水印效果如圖:


原理解析:
- 圖一斜紋類(lèi):創(chuàng)建一個(gè)和頁(yè)面一樣大的畫(huà)布,根據(jù)頁(yè)面大小以及傾斜角度大致鋪滿(mǎn)水印文字,最后轉(zhuǎn)化為一張圖片設(shè)為背景
- 圖二傾斜類(lèi):將文字傾斜后轉(zhuǎn)化為圖片,然后設(shè)置背景圖片repeat填充整個(gè)頁(yè)面
代碼分析:
這里我只簡(jiǎn)略分析圖一斜紋類(lèi),事實(shí)上這兩種方式都較為簡(jiǎn)單,不需要特別強(qiáng)的canvas基礎(chǔ),只需大概了解就行,直接上完整代碼吧
圖一
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.water {
width: 100vw;
height: 2000px;
position: absolute;
top: 0;
left: 0;
background-repeat: no-repeat;
}
.content {
width: 800px;
height: 2000px;
margin-left: auto;
margin-right: auto;
background: cadetblue;
overflow: hidden;
}
</style>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</head>
<body>
<div class="content">
<div class="water"></div>
</div>
<script>
function addWaterMarker(str) {
// 這里限制了不超過(guò)15個(gè)字,實(shí)際按需求來(lái)
var cpyName = str;
if (str.length > 16) {
cpyName = str.substring(0, 16);
}
// 創(chuàng)建 canvas 元素
var can = document.createElement('canvas');
// 獲取 content 元素
var report = $('.content')[0]
// 將 canvas 元素添加到 content 中
report.appendChild(can);
// 設(shè)置 canvas頁(yè)面寬度,這里的 800 是因?yàn)槲宜舅∥募笮」潭ǎ砂葱枨蟾?
can.width = 800;
// 獲取整個(gè)body高度
can.height = document.body.offsetHeight;
// 隱藏 canvas 元素
can.style.display = 'none';
can.style.zIndex = '999'
// 獲取 canvas 元素工具箱
var cans = can.getContext('2d');
// 設(shè)置文字傾斜角度為 -25 度以及樣式
cans.rotate(-25 * Math.PI / 180);
cans.font = "800 30px Microsoft JhengHei";
cans.fillStyle = "#000";
cans.textAlign = 'center';
cans.textBaseline = 'Middle';
// 動(dòng)態(tài)改變字體大小
if(cans.measureText(cpyName).width > 180) {
var size = 180 / cpyName.length
cans.font = '800 ' + size +'px '+ ' Microsoft JhengHei'
}
/*
雙重遍歷,
當(dāng) 寬度小于頁(yè)面寬度時(shí),
當(dāng) 高度小于頁(yè)面高度時(shí),
這里的寬高可以適當(dāng)寫(xiě)大,目的是為了讓水印文字鋪滿(mǎn)
*/
for(let i = (document.body.offsetHeight*0.5)*-1; i<800; i+=160) {
for(let j = 0; j<document.body.offsetHeight*1.5; j+=60) {
// 填充文字,x 間距, y 間距
cans.fillText(cpyName, i, j)
}
}
// 將 canvas 轉(zhuǎn)化為圖片并且設(shè)置為背景
report.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";
}
addWaterMarker('測(cè)試水印');
</script>
</body>
</html>
圖二
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.water {
width: 100vw;
height: 2000px;
position: absolute;
top: 0;
left: 0;
background-repeat: no-repeat;
}
.content {
width: 800px;
height: 2000px;
margin-left: auto;
margin-right: auto;
background: cadetblue;
overflow: hidden;
}
</style>
</head>
<body>
<div class="content">
<div class="water"></div>
</div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
// 添加水印方法
function addWaterMarker(str) {
var cpyName = str;
if (str.length > 16) {
cpyName = str.substring(0, 16);
}
var can = document.createElement('canvas');
var report = $('.content')[0];
report.appendChild(can);
can.width = 180;
can.height = 110;
can.style.display = 'none';
can.style.zIndex = '999'
var cans = can.getContext('2d');
cans.rotate(-25 * Math.PI / 180);
cans.font = "800 30px Microsoft JhengHei";
cans.fillStyle = "#000";
cans.textAlign = 'center';
cans.textBaseline = 'Middle';
if(cans.measureText(cpyName).width > 180) {
var size = 180 / cpyName.length
cans.font = '800 ' + size +'px '+ ' Microsoft JhengHei'
}
cans.fillText(cpyName, 60, 100);
report.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";
}
addWaterMarker('測(cè)試水印');
</script>
</body>
</html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。