前端利用DOM元素生成水印及防范

index.html

<div id="container">
  <div id="water-mark"></div>
  <div id="content">
    <div>這是內(nèi)容</div>
  </div>
</div>

index.css

#water-mark {
    pointer-events: none; 
    // 元素永遠(yuǎn)不會成為鼠標(biāo)事件的target,解決水印覆蓋在最上方,導(dǎo)致下層元素,無法執(zhí)行鼠標(biāo)事件
}
span {
    display: inline-block;
    width: 200px;
    transform: rotate(-15deg);
    position: absolute;
}

index.js

window.onload = function () {

    let waterMark = document.getElementById('water-mark');

    // MutationObserver  只會監(jiān)聽到內(nèi)聯(lián)樣式的修改, 所以要把可能會導(dǎo)致水印看不見的相關(guān)樣式寫成內(nèi)聯(lián)樣式

    waterMark.style.cssText = `
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    background: rgba(0,0,0,.1);
    `;

    for (let i = 0; i < 8; i++) {

      for (let j = 0; j < 10; j++) {

        let span = document.createElement('span');

        span.innerText = '這是水印';

        span.style.top = 150 * i + 'px';

        span.style.left = 200 * j + 'px';

        span.style.display = 'inline-block';

        span.style.opacity = 1;

        span.style.color = 'rgba(0,0,0,.2)';

        waterMark.append(span)

      }

      // 這里與上方設(shè)置內(nèi)聯(lián)樣式不一致,是為了讓自己方便記憶兩種設(shè)置的方法

    }
    const config = {childList: true, subtree: true, attributeFilter: ['style']};

    const callback = function (mutationsList) {

      for (let mutation of mutationsList) {

        if (// 這個if是判斷這三種情況是修改了跟水印相關(guān)的DOM元素,其他的都是跟水印無關(guān)的

          mutation.target.id === 'water-mark' // 改變的DOM樣式屬性的是id為water-mark的元素

          || (mutation.removedNodes[0] && mutation.removedNodes[0].id === 'water-mark') // 裝載水印的DOM被移除

          || mutation.target.offsetParent.id === 'water-mark' // 修改的當(dāng)前元素是water-mark的子元素

        ) {

          console.log('水印被動了, 這里可以執(zhí)行一下水印被動了之后的邏輯');

          if (mutation.type === 'childList') {

            console.log('A child node has been added or removed.');

          } else if (mutation.type === 'attributes') {

            console.log('The ' + mutation.attributeName + ' attribute was modified.');
          }
        }
      }
    };
    const observer = new MutationObserver(callback);

    //MutationObserver 只會監(jiān)聽子元素的刪除,監(jiān)聽不到本身, 所以要添加的父元素上進行監(jiān)聽

    let container = document.getElementById('container');

    observer.observe(container, config);
  };

這是我當(dāng)初做這個需求是遇到的問題,后來在高人的指點下解決了,為了加深自己的印象和今后方便回憶,就專門自己實現(xiàn)了一下,如果大家發(fā)現(xiàn)有什么地方不正確或者有更好的方法實現(xiàn),歡迎大家留言區(qū)留言。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容