瀏覽器中遮罩層鏤空效果的多種實現方法

      前端開發中我們有時候會做到頁面遮罩層鏤空的效果,那什麼是頁面遮罩層鏤空效果,我們先來看一看下圖的這個效果。下圖是我昨天在實際工作中完成的頁面效果:

      做這個效果的時候有以下注意的地方:

      1、兼容IE7及以上瀏覽器;

      2、該頁面背景是隨時變化的;

      3、目標區域大小不固定;

      4、常規瀏覽器要實現圓角效果。

      由於以前還沒有做過類似效果,所以經驗比較欠缺。接到任務,我想的第一種方法是截一張圖放在一個黑色透明的遮罩層上面來模擬鏤空效果,但是不滿足上面的第2、第3條要求。放棄這種想法,我又想到用SVG來實現,但是又不滿足上面的第一條要求。最後我利用CSS的邊框屬性結合JS實現了上面的方法,並滿足了所有要求,具體方法見下面的方法三。

      我把能實現頁面遮罩層鏤空效果的幾種方法都列出來吧,目前我掌握了其中四種。

      我就以下面這個簡單的效果爲例做展示:

      無遮罩層層的時候:↓↓↓


      

      有鏤空遮罩層的時候(鏤空區域爲頭像和名字):↓↓↓



      【 方法一:截圖模擬實現 】

      原理:先截一張相同位置的圖片,創建一個遮罩層,然後把圖片定位在相應的位置上。

      優點:原理簡單;兼容性好,可以兼容到IE6、IE7;可以同時實現鏤空多個。

      缺點:此方法只適合靜止頁面,不適合可以滾動的頁面。也不適合頁面內容會發生變換的頁面。

      代碼如下:

<div class="class1"><img src="images/000.jpg" alt=""/></div>
.class1{position: absolute;width:100%;height:100%;top: 0;left: 0;background-color: #000;opacity: 0.6;filter:alpha(opacity=60);}
.class1 img{position: absolute;top:260px;left: 208px;}


      【 方法二:CSS3陰影屬性實現 】

      原理:利用CSS3的陰影屬性。

      優點:實現方便;適合任何頁面,不會受頁面的限制。

      缺點:兼容不太好,只能兼容到IE9。

      代碼如下:

<div class="class2"></div>
.class2{position: absolute;width:170px;height:190px;top: 260px;left: 208px;box-shadow: rgba(0,0,0,.6) 0 0 0 1366px;}

      【 方法三:CSS邊框屬性實現 】

      原理:利用邊框屬性。先將一個空盒子定位在目標區域,然後在其四周用邊框填充。

      優點:實現方便,兼容性好,可以兼容到IE6、IE7;適合任何頁面,不會受頁面的限制。

      缺點:要做兼容實現過程則相對複雜。

      代碼如下:

<div class="class3"></div>
.class3{
      position: absolute;width:170px;height:190px;top: 0;left: 0;
      border-left-width:208px;border-left-style: solid;border-left-color:rgba(0,0,0,.6);
      border-right-width:970px;border-right-style: solid;border-right-color:rgba(0,0,0,.6);
      border-top-width:260px;border-top-style: solid;border-top-color:rgba(0,0,0,.6);
      border-bottom-width:253px;border-bottom-style: solid;border-bottom-color:rgba(0,0,0,.6);
}

      【 方法四:SVG或者canvas 】

      原理:利用SVG或者canvas的繪圖功能。

      優點:可以同時鏤空多個。

      缺點:兼容性不好,實現過程相對複雜。

      我以SVG爲例,代碼如下:

<svg style="position: absolute;" width="1366" height="700">
    <defs>
        <mask id="myMask">
            <rect x="0" y="0" width="100%" height="100%" style="stroke:none; fill: #ccc"></rect>
            <rect id="circle1" width="170" height="190" x='208' y="260" style="fill: #000" />
        </mask>
    </defs>
    <rect x="0" y="0" width="100%" height="100%" style="stroke: none; fill: rgba(0, 0, 0, 0.6); mask: url(#myMask)"></rect>
</svg>

      以上四種方法實現的最後效果在主流瀏覽器中效果都是一致的,如下:



      當然,這只是例子,要運用到項目中去,還有很多工作要做,比如鏤空的位置我們應該根據目標來自動獲取,大小也是根據目標來設置,用邊框的方法要兼容IE7、8則還需加一層才能實現。


      今天就更新到這裏,因時間倉促,資質有限,文中表述僅代表個人觀點,如果有更好的方法,歡迎分享。


發佈了47 篇原創文章 · 獲贊 85 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章