224 lines
8.7 KiB
JavaScript
224 lines
8.7 KiB
JavaScript
|
/* global Watermark */
|
||
|
layui.define(['jquery', 'element'], function(exports) {
|
||
|
var $=layui.$;
|
||
|
var _parentEle;
|
||
|
var _wmContainer;
|
||
|
var _wmObserver;
|
||
|
var _wmParentObserver;
|
||
|
var _resizeHandler;
|
||
|
var _windowsWidth = window.outerWidth;
|
||
|
var _windowsHeight = window.outerHeight;
|
||
|
|
||
|
var _left = 0;
|
||
|
var _top = 0;
|
||
|
|
||
|
/**
|
||
|
* Create DOM of watermark's container
|
||
|
* @param {Watermark} watermark
|
||
|
*/
|
||
|
var _createContainer = function (watermark) {
|
||
|
watermark._container = document.createElement('div');
|
||
|
watermark._container.classList.add('cell-watermark-container');
|
||
|
watermark._container.style.cssText = 'display: block; pointer-events: none;';
|
||
|
watermark._container.setAttribute('aria-hidden', true);
|
||
|
_parentEle = document.querySelector(watermark.options.appendTo) || document.body;
|
||
|
//获取页面最大宽度
|
||
|
_windowsWidth = Math.min(_parentEle.scrollWidth, _parentEle.clientWidth);
|
||
|
//获取页面最大高度
|
||
|
_windowsHeight = Math.min(_parentEle.scrollHeight, _parentEle.clientHeight);
|
||
|
_parentEle.appendChild(watermark._container);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Create watermark's DOM
|
||
|
* @param {Watermark} watermark
|
||
|
* @param {Object} options
|
||
|
*/
|
||
|
var _createWatermark = function (watermark, options) {
|
||
|
options.rowSpacing = options.rowSpacing || 60;
|
||
|
options.colSpacing = options.colSpacing || 30;
|
||
|
options.width = options.width || 150;
|
||
|
options.height = options.height || 20;
|
||
|
|
||
|
let rows = parseInt(_windowsHeight / (options.height + options.rowSpacing));
|
||
|
let cols = parseInt(_windowsWidth / (options.width + options.colSpacing));
|
||
|
let offsetLeft =_left+ (_windowsWidth - options.width * cols - options.colSpacing * (cols - 1)) / 2;
|
||
|
let offsetTop = _top+(_windowsHeight - options.height * rows - options.rowSpacing * (rows - 1)) / 2;
|
||
|
let watermarkBase = document.createElement('div');
|
||
|
watermarkBase.classList.add('cell-watermark');
|
||
|
watermarkBase.style.cssText =
|
||
|
'transform: rotate(15deg); opacity: 0.1; font-size: 0.85rem; text-align: center;' +
|
||
|
'position: absolute; user-select: none; word-break: break-all; overflow: hidden; z-index: 999999;';
|
||
|
for (let row = 0; row < rows; row++) {
|
||
|
let top = offsetTop + (options.rowSpacing + options.height) * row;
|
||
|
let tempCols = cols;
|
||
|
row % 2 !== 0 && tempCols++;
|
||
|
for (let col = 0; col < tempCols; col++) {
|
||
|
let left = offsetLeft + (options.colSpacing + options.width) * col;
|
||
|
tempCols !== cols && (left -= (options.colSpacing + options.width) / 2);
|
||
|
let watermarkEle = watermarkBase.cloneNode();
|
||
|
watermarkEle.style.cssText += `left: ${left}px; top: ${top}px; width: ${options.width}px; height: ${options.height}px`;
|
||
|
watermarkEle.style.transform = `rotate(${options.rotate}deg)`;
|
||
|
watermarkEle.style.opacity = options.opacity;
|
||
|
watermarkEle.style.fontSize = `${options.fontSize}rem`;
|
||
|
watermarkEle.style.fontFamily = options.fontFamily;
|
||
|
watermarkEle.innerHTML = options.content;
|
||
|
watermark._container.appendChild(watermarkEle);
|
||
|
}
|
||
|
}
|
||
|
//Backup for recover the watermark's container when the its DOM is removed
|
||
|
_wmContainer = watermark._container;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Rerender watermark
|
||
|
* @param {Watermark} watermark
|
||
|
* @param {Object} options
|
||
|
*/
|
||
|
var _render = function (watermark, options) {
|
||
|
_wmObserver.disconnect();
|
||
|
watermark._container.innerHTML = '';
|
||
|
_createWatermark(watermark, options);
|
||
|
_wmObserver.observe(watermark._container, {
|
||
|
attributes: true,
|
||
|
childList: true,
|
||
|
characterData: true,
|
||
|
subtree: true
|
||
|
});
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Observe watermark and watermark's parentNode mutations
|
||
|
* @param {Watermark} watermark
|
||
|
*/
|
||
|
var _addObserve = function (watermark) {
|
||
|
//Observe watermark element and its child element
|
||
|
_wmObserver = new MutationObserver(function (mutations, observer) {
|
||
|
_render(watermark, watermark.options);
|
||
|
});
|
||
|
_wmObserver.observe(watermark._container, {
|
||
|
attributes: true,
|
||
|
childList: true,
|
||
|
characterData: true,
|
||
|
subtree: true
|
||
|
});
|
||
|
//Observe parent element, recreate if the element is deleted
|
||
|
_wmParentObserver = new MutationObserver(function (mutations) {
|
||
|
for (let m of mutations) {
|
||
|
if (
|
||
|
m.type === 'childList' &&
|
||
|
m.removedNodes.length > 0 &&
|
||
|
document.querySelectorAll('.cell-watermark-container').length === 0
|
||
|
) {
|
||
|
_parentEle.appendChild(_wmContainer);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
_wmParentObserver.observe(watermark._container.parentNode, {
|
||
|
childList: true,
|
||
|
subtree: true
|
||
|
});
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Window's resize listener
|
||
|
* @param {Watermark} watermark
|
||
|
*/
|
||
|
var _addResizeListener = function (watermark) {
|
||
|
_resizeHandler = function () {
|
||
|
|
||
|
//获取页面最大宽度
|
||
|
var _windowsWidth_n = Math.max(_parentEle.scrollWidth, _parentEle.clientWidth);
|
||
|
//获取页面最大高度
|
||
|
var _windowsHeight_n = Math.max(_parentEle.scrollHeight, _parentEle.clientHeight);
|
||
|
|
||
|
|
||
|
/*if (window.outerHeight !== _windowsHeight || window.outerWidth !== _windowsWidth) {
|
||
|
_windowsHeight = window.outerHeight;
|
||
|
_windowsWidth = window.outerWidth;
|
||
|
_render(watermark, watermark.options);
|
||
|
}*/
|
||
|
if (_windowsHeight_n !== _windowsHeight || _windowsWidth_n !== _windowsWidth) {
|
||
|
_windowsHeight = _windowsHeight_n;
|
||
|
_windowsWidth = _windowsWidth_n;
|
||
|
_render(watermark, watermark.options);
|
||
|
}
|
||
|
|
||
|
|
||
|
};
|
||
|
window.addEventListener('resize', _resizeHandler);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Watermark.
|
||
|
* Create watermark for webpage and automatic adjust when windows resize.
|
||
|
* @param {Object} options
|
||
|
* @param {String} [options.content] watermark's text
|
||
|
* @param {String} [options.appendTo='body'] parent of watermark's container
|
||
|
* @param {Number} [options.width=150] watermark's width. unit: px
|
||
|
* @param {Number} [options.height=20] watermark's height. unit: px
|
||
|
* @param {Number} [options.rowSpacing=60] row spacing of watermarks. unit: px
|
||
|
* @param {Number} [options.colSpacing=30] col spacing of watermarks. unit: px
|
||
|
* @param {Number} [options.rotate=15] watermark's tangent angle. unit: deg
|
||
|
* @param {Number} [options.opacity=0.1] watermark's transparency
|
||
|
* @param {Number} [options.fontSize=0.85] watermark's fontSize. unit: rem
|
||
|
* @param {Number} [options.fontFamily='inherit'] watermark's fontFamily.
|
||
|
* @namespace Watermark
|
||
|
* @class Watermark
|
||
|
* @version 1.0.3
|
||
|
* @author @Lruihao https://lruihao.cn
|
||
|
*/
|
||
|
function Watermark(options = {}) {
|
||
|
var _proto = Watermark.prototype;
|
||
|
this.options = options;
|
||
|
_createContainer(this);
|
||
|
_createWatermark(this, this.options);
|
||
|
_addObserve(this);
|
||
|
_addResizeListener(this);
|
||
|
|
||
|
/**
|
||
|
* Upload watermark's text content
|
||
|
* @param {String} content watermark's text
|
||
|
*/
|
||
|
_proto.upload = function (content) {
|
||
|
if (!content) {
|
||
|
return;
|
||
|
}
|
||
|
_wmParentObserver.disconnect();
|
||
|
_wmObserver.disconnect();
|
||
|
this.options.content = content;
|
||
|
for (const watermark of this._container.querySelectorAll('.cell-watermark')) {
|
||
|
watermark.innerHTML = content;
|
||
|
}
|
||
|
_wmParentObserver.observe(this._container.parentNode, {
|
||
|
childList: true,
|
||
|
subtree: true
|
||
|
});
|
||
|
_wmObserver.observe(this._container, {
|
||
|
attributes: true,
|
||
|
childList: true,
|
||
|
characterData: true,
|
||
|
subtree: true
|
||
|
});
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Rerender watermark
|
||
|
* @param {Object} options
|
||
|
*/
|
||
|
_proto.render = function (options = {}) {
|
||
|
_render(this, Object.assign(this.options, options));
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Force destroy watermark
|
||
|
*/
|
||
|
_proto.destroy = function () {
|
||
|
_wmObserver.disconnect();
|
||
|
_wmParentObserver.disconnect();
|
||
|
window.removeEventListener('resize', _resizeHandler);
|
||
|
this._container.parentNode.removeChild(this._container);
|
||
|
};
|
||
|
}
|
||
|
exports("watermark",Watermark);
|
||
|
})
|