頁(yè)面水印問(wèn)題

為了保證數(shù)據(jù)的安全断医,使得信息的傳播可以追溯黔衡,和微博圖片右下角的水印類(lèi)似,一些站點(diǎn)會(huì)要求加上自己的專(zhuān)屬水印耗美。
為了顯示的需要京髓,我把其中一個(gè)水印顏色做了處理航缀,大致效果如下:


image.png

以下為同事提供的一個(gè)水印生成腳本

var isIE9 = document.all && document.addEventListener && !window.atob;
var WaterMark = {
    WaterMarkModel: {
        frontX: "",
        frontY: "",
        frontRows: "",
        frontCols: "",
        maskTxt: "",
        color: '#000000',
        width: 130,
        height: 50,
        fontSize: '18px',
        frontFont: '微軟雅黑',
        frontBackgroundAlpha: 0,
        frontTxtAlpha:0.03,//隱藏水印,通過(guò)PS軟件調(diào)整對(duì)比度可以看到底色// 0.1,
        angle: 15,
        frontXSpace: 150,
        frontYSpace: 30,
        backgroundColor: '#000000'
    },
    Init: function () {
        WaterMark.CreateWaterMark();
    },
    CreateWaterMark: function () {
        var oTemp = document.createDocumentFragment();
        var frontXSpace = WaterMark.WaterMarkModel.frontXSpace;
        var frontYSpace = WaterMark.WaterMarkModel.frontYSpace;
        var frontRows = WaterMark.WaterMarkModel.frontRows;
        var frontCols = WaterMark.WaterMarkModel.frontCols;
        var frontX = WaterMark.WaterMarkModel.frontX;
        var frontY = WaterMark.WaterMarkModel.frontY;
        var maskTxt = WaterMark.WaterMarkModel.maskTxt;
        var frontTxtAlpha = WaterMark.WaterMarkModel.frontTxtAlpha;
        var fontSize = WaterMark.WaterMarkModel.fontSize;
        var frontFont = WaterMark.WaterMarkModel.frontFont;
        var width = WaterMark.WaterMarkModel.width;
        var height = WaterMark.WaterMarkModel.height;
        var angle = WaterMark.WaterMarkModel.angle;
        var color = WaterMark.WaterMarkModel.color;  
        var maxWidth = Math.max(document.body.scrollWidth, document.documentElement.scrollWidth) - 20;
        var maxHeight = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) - 20;
        if (frontCols == 0 || (parseInt(frontX + width * frontCols + frontXSpace * (frontCols - 1)) > maxWidth)) {
            frontCols = parseInt((frontXSpace + maxWidth - frontX) / (width + frontXSpace));
            frontXSpace = parseInt(((maxWidth - frontX) - width * frontCols) / (frontCols - 1));
            if (!frontXSpace) {
                frontXSpace = 0;
            }
        }
        if (frontRows == 0 || (parseInt(frontY + height * frontRows + frontYSpace * (frontRows - 1)) > maxHeight)) {
            frontRows = parseInt((frontYSpace + maxHeight - frontY) / (height + frontYSpace));
            frontYSpace = parseInt(((maxHeight - frontY) - height * frontRows) / (frontRows - 1));
            if (!frontYSpace) {
                frontYSpace = 0;
            }
        }
        var x;
        var y;
        for (var i = 0; i < frontRows; i++) {
            y = frontY + (frontYSpace + height) * i;
            for (var j = 0; j < frontCols; j++) {
                x = frontX + (width + frontXSpace) * j;

                var maskDiv = document.createElement('div');
                var m = WaterMark.GetRotation(-angle);
                maskDiv.id = 'mask_div' + i + j;  
                maskDiv.appendChild(document.createTextNode(maskTxt));
                maskDiv.style.webkitTransform = "rotate(-" + angle + "deg)";
                maskDiv.style.MozTransform = "rotate(-" + angle + "deg)";
                maskDiv.style.msTransform = "rotate(-" + angle + "deg)";
                maskDiv.style.OTransform = "rotate(-" + angle + "deg)";
                maskDiv.style.transform = "rotate(-" + angle + "deg)";
                maskDiv.style.visibility = "";
                maskDiv.style.position = "absolute";
                maskDiv.style.left = x + 'px';
                maskDiv.style.top = y + 'px';
                maskDiv.style.overflow = "hidden";
                //mask_div.style.border="solid #eee 1px";
                maskDiv.style.opacity = frontTxtAlpha;
                if (isIE9) {
                    maskDiv.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + frontTxtAlpha * 100 + ")";
                } else {
                    maskDiv.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + frontTxtAlpha * 100 + ") progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=" + m[0] + ", M12=" + m[1] + ", M21=" + m[2] + ", M22=" + m[3] + ")";
                }
                maskDiv.style.fontSize = fontSize;
                maskDiv.style.fontFamily = frontFont;
                maskDiv.style.color = color;
                maskDiv.style.textAlign = "center";
                maskDiv.style.width = width + 'px';
                maskDiv.style.height = height + 'px';
                maskDiv.style.display = "block";
                maskDiv.style.zIndex = "2";
                oTemp.appendChild(maskDiv);
            };
        };
        document.body.appendChild(oTemp);
    },
    GetRotation: function (deg) {
        var deg2Rad = Math.PI * 2 / 360;
        var rad = deg * deg2Rad;
        var costheta = Math.cos(rad);
        var sintheta = Math.sin(rad);
        var m11 = costheta;
        var m12 = -sintheta;
        var m21 = sintheta;
        var m22 = costheta;
        return [m11, m12, m21, m22];
    }
};

頁(yè)面引入以上的js 文件堰怨,調(diào)用方法如下:

      //WaterMarkdom 要顯示水印的頁(yè)面元素的id
       var relation = document.getElementById('WaterMarkdom');
        var relationTop = relation.offsetTop;
        var relationHeight = relation.offsetHeight;
        var relationWidth = relation.offsetWidth;
        var relationLeft = relation.offsetLeft;
        WaterMark.WaterMarkModel.maskTxt = '我是水印';//水印文字
        WaterMark.WaterMarkModel.frontX = relationLeft;
        WaterMark.WaterMarkModel.frontY = relationTop;
        WaterMark.WaterMarkModel.frontXSpace = 20;
        WaterMark.Init();

水印生成成功芥玉,要是這么簡(jiǎn)單就好了。同事寫(xiě)的腳本原理是在頁(yè)面上方生成絕對(duì)定位的浮動(dòng)層备图,即每個(gè)水印標(biāo)簽都是一個(gè)反轉(zhuǎn)透視的浮動(dòng)div灿巧。那么如果你的div區(qū)域還有事件熱點(diǎn)區(qū)域就慘了,比如我的這個(gè)頁(yè)面要支持滑動(dòng)揽涮,手指上移或者下移要觸發(fā)頁(yè)面滾動(dòng)事件抠藕,實(shí)際操作時(shí),手指與屏幕的接觸位置可能是水印蒋困,接觸點(diǎn)不在事件的有效元素幢痘。
如圖,水印所在位置形成了一個(gè)事件盲點(diǎn)區(qū)域家破。

image.png

為了解決這個(gè)問(wèn)題颜说,我首先嘗試手指接觸到屏幕時(shí),隱藏水印汰聋,但沒(méi)什么卵用门粪,因?yàn)閠ouchstart已經(jīng)觸發(fā)。然后我嘗試將水印層下移烹困,即z-index比當(dāng)前層低一層玄妈,設(shè)置頁(yè)面整體的透明度,這個(gè)效果可以實(shí)現(xiàn)髓梅,但真?zhèn)€頁(yè)面的呈現(xiàn)效果會(huì)變得比較詭異拟蜻。
上線(xiàn)在即,我又開(kāi)始各種檢索枯饿,最后一個(gè)知乎網(wǎng)友處找到方案酝锅,但僅支持css3標(biāo)準(zhǔn),不管啦奢方,問(wèn)題已經(jīng)部分解決搔扁。萬(wàn)能的簡(jiǎn)友,有好的方案請(qǐng)一定要給我留言蟋字。
什么稿蹲,你說(shuō)解決方案。差點(diǎn)忘了鹊奖,是這樣的苛聘。首先在腳本里面增加一句,給每個(gè)水印加個(gè)class屬性:

 maskDiv.className = "mask_div";

然后在樣式表里增加一句:

.mask_div { pointer-events: none;}

關(guān)于該屬性的說(shuō)明如下:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市设哗,隨后出現(xiàn)的幾起案子璧尸,更是在濱河造成了極大的恐慌,老刑警劉巖熬拒,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爷光,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡澎粟,警方通過(guò)查閱死者的電腦和手機(jī)蛀序,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)活烙,“玉大人徐裸,你說(shuō)我怎么就攤上這事⌒フ担” “怎么了重贺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)回懦。 經(jīng)常有香客問(wèn)我气笙,道長(zhǎng),這世上最難降的妖魔是什么怯晕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任潜圃,我火速辦了婚禮,結(jié)果婚禮上舟茶,老公的妹妹穿的比我還像新娘谭期。我一直安慰自己,他們只是感情好吧凉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布隧出。 她就那樣靜靜地躺著,像睡著了一般阀捅。 火紅的嫁衣襯著肌膚如雪胀瞪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天也搓,我揣著相機(jī)與錄音赏廓,去河邊找鬼涵紊。 笑死傍妒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摸柄。 我是一名探鬼主播颤练,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驱负!你這毒婦竟也來(lái)了嗦玖?” 一聲冷哼從身側(cè)響起患雇,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宇挫,沒(méi)想到半個(gè)月后苛吱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡器瘪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年翠储,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橡疼。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡援所,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欣除,到底是詐尸還是另有隱情住拭,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布历帚,位于F島的核電站滔岳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挽牢。R本人自食惡果不足惜澈蟆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卓研。 院中可真熱鬧趴俘,春花似錦、人聲如沸奏赘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)磨淌。三九已至疲憋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梁只,已是汗流浹背缚柳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搪锣,地道東北人秋忙。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像构舟,于是被迫代替她去往敵國(guó)和親灰追。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評(píng)論 1 92
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)弹澎、插件朴下、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,065評(píng)論 4 62
  • 我今天才知道,原來(lái)我的很多軟件都可以相互使用的苦蒿,這說(shuō)明我自己還是很幼稚的殴胧,學(xué)習(xí)是需要自己很謙虛才能學(xué)會(huì)的。既然自己...
    lygly9閱讀 133評(píng)論 0 0
  • 春天真是個(gè)情竇萌發(fā)的季節(jié)。 這幾天朋友圈彌漫了酸甜的味道音五,味道出自一首關(guān)于愛(ài)情關(guān)于心情關(guān)于你和我的歌——《我喜歡上...
    sharkmusic閱讀 784評(píng)論 0 0
  • 今天天氣格外好惫撰,藍(lán)天、大風(fēng)躺涝、盛開(kāi)的各種花厨钻,如果風(fēng)能小點(diǎn),不增加一份小小的凌亂坚嗜,那簡(jiǎn)直是太完美了夯膀! 太陽(yáng)好的,如果不...
    芮靈翾閱讀 223評(píng)論 4 2