页面水印问题

为了保证数据的安全,使得信息的传播可以追溯,和微博图片右下角的水印类似,一些站点会要求加上自己的专属水印。
为了显示的需要,我把其中一个水印颜色做了处理,大致效果如下:


image.png

以下为同事提供的一个水印生成脚本

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,//隐藏水印,通过PS软件调整对比度可以看到底色// 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];
    }
};

页面引入以上的js 文件,调用方法如下:

      //WaterMarkdom 要显示水印的页面元素的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();

水印生成成功,要是这么简单就好了。同事写的脚本原理是在页面上方生成绝对定位的浮动层,即每个水印标签都是一个反转透视的浮动div。那么如果你的div区域还有事件热点区域就惨了,比如我的这个页面要支持滑动,手指上移或者下移要触发页面滚动事件,实际操作时,手指与屏幕的接触位置可能是水印,接触点不在事件的有效元素。
如图,水印所在位置形成了一个事件盲点区域。

image.png

为了解决这个问题,我首先尝试手指接触到屏幕时,隐藏水印,但没什么卵用,因为touchstart已经触发。然后我尝试将水印层下移,即z-index比当前层低一层,设置页面整体的透明度,这个效果可以实现,但真个页面的呈现效果会变得比较诡异。
上线在即,我又开始各种检索,最后一个知乎网友处找到方案,但仅支持css3标准,不管啦,问题已经部分解决。万能的简友,有好的方案请一定要给我留言。
什么,你说解决方案。差点忘了,是这样的。首先在脚本里面增加一句,给每个水印加个class属性:

 maskDiv.className = "mask_div";

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

.mask_div { pointer-events: none;}

关于该属性的说明如下:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 我今天才知道,原来我的很多软件都可以相互使用的,这说明我自己还是很幼稚的,学习是需要自己很谦虚才能学会的。既然自己...
    lygly9阅读 133评论 0 0
  • 春天真是个情窦萌发的季节。 这几天朋友圈弥漫了酸甜的味道,味道出自一首关于爱情关于心情关于你和我的歌——《我喜欢上...
    sharkmusic阅读 766评论 0 0
  • 今天天气格外好,蓝天、大风、盛开的各种花,如果风能小点,不增加一份小小的凌乱,那简直是太完美了! 太阳好的,如果不...
    芮灵翾阅读 222评论 4 2