做者:深山螞蟻css
引導蒙層一般在新業務上線、或者業務有變動時的給新用戶的一個操做指引。下圖頁面便是一個蒙層,會在某個局部位置高亮咱們須要重點突出的內容:html
當前發現不少頁面作蒙層引導,仍是使用圖片形式來作。html5
以上六種引導蒙層實現思路,在必定狀況下都能知足業務需求,從不一樣角度來實現了引導蒙層。z-index最簡單,canvas最靈活,就我的而言,更加喜歡骨架屏式的動態opacity蒙層實現,更有趣更酷!!!canvas
這個好理解,頁面元素都是有層級的,咱們只須要把引導內容區域設置爲最頂層的層級,在引導內容區域之下設置一個遮罩層,其餘內容元素的z-index都地域這個遮罩層便可。 咱們來看一個簡單例子。微信
.z1{
position:absolute;
left:50px;
top:50px;
width:50px;
height:50px;
background:blue;
z-index:1;
}
.z2{
position:absolute;
left:60px;
top:60px;
width:50px;
height:50px;
background:red;
z-index:2;
}
.z3{
position:absolute;
left:70px;
top:70px;
width:50px;
height:50px;
background:yellow;
z-index:3;
}
複製代碼
咱們修改一下z2的樣式。佈局
.z2{
position:absolute;
left:50px;
top:50px;
width:50px;
height:50px;
background:black;
opacity:0.5;
z-index:2;
animation:z_index 2s linear infinite alternate;
}
@keyframes z_index {
from {
left:50px;
top:50px;
width:50px;
height:50px;
}
to {
left:0px;
top:0px;
width:200px;
height:200px;
}
}
複製代碼
只要在佈局頁面元素的時候,把須要作蒙層的元素肯定好,配合js,動態的設置元素的z-index + opacity,就能夠很好的作到頁面的引導蒙層效果。測試
咱們再也不新增蒙層,而是徹底操做頁面節點,將須要遮罩的節點都設置爲半透明,引導蒙層顯現內容則徹底顯示出來。頁面的效果和蒙層不太同樣,對於空白地方,咱們仍然是徹底顯示,只是將有內容的元素給半透明,相似骨架屏的效果。
爲了演示效果,咱們看以下例子:
頁面設置6個元素。flex
<div class="wrap">
<div class="z z1"></div>
<div class="z z2"></div>
<div class="z z3"></div>
<div class="z z4"></div>
<div class="z z5"></div>
<div class="z z6"></div>
</div>
複製代碼
將元素內容用flex並排佈局。ui
.wrap{
display:flex;
flex-wrap:wrap;
width:150px;
}
.z{
width:50px;
height:50px;
transition:all 1s;
}
.z1{
background:blue;
}
.z2{
background:black;
}
.z3{
background:yellow;
}
.z4{
background:red;
}
.z5{
background:green;
}
.z6{
background:orange;
}
複製代碼
使用js操做,依次半透明其餘元素,顯示當前元素來模擬蒙層。spa
let arry = Array.from(document.querySelectorAll(".z"));
let index = -1;
let direct = 1;
setInterval(()=>{
if(index>=5) direct = -1;
else if(index<=0) direct = 1;
index = index+direct;
arry.forEach((d,i)=>{
d.style.opacity = 1;
});
setTimeout(()=>{
arry.forEach((d,i)=>{
if(i==index) return;
d.style.opacity = 0.1;
});
},1000);
},2000)
複製代碼
看了這個例子,咱們清晰的看到這個引導蒙層的實現過程。這種引導蒙層其實更好玩有趣,有點相似當前流行的骨架屏,其餘已有元素須要遮罩的內容就是骨架屏的灰色部分,須要顯現的就是重點的蒙層內容。
有趣!!!
沒錯,就是廣泛不能在廣泛的border了,且看以下:
div {
border:1px solid #red;
}
複製代碼
那用border怎麼實現引導蒙層呢?
先看一個簡單的例子:
<div class="border_1"></div>
複製代碼
.border_1{
width: 100px;
height: 100px;
border-top:50px solid red;
border-right: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 50px solid transparent;
box-sizing:border-box;
}
複製代碼
實現了一個倒三角,這個應用場景是否是就比較多了,不少tips的指引,標註等都會用到。我就看到過這種倒三角使用一張圖片代替的作法。
仔細看這段代碼,主要有實現了三點:
爲了理解上面的實現,咱們來看下以下代碼:
.border_2{
width: 100px;
height: 100px;
background-color:green;
border-style:solid;
border-color:red yellow blue black;
border-width:50px;
animation:border_ani 2s linear infinite alternate;
box-sizing:border-box;
}
@keyframes border_ani {
from {
border-width:50px;
}
to {
border-width:0;
}
}
複製代碼
從圖中咱們能夠清晰的看到,隨着border-width的變化,整個div的綠色背景在跟隨變化。
這樣咱們就清晰的能獲得:
當border-right,border-left,border-bottom都transparent透明,border-top是紅色的時候,所看到的就是一個倒三角。
同理咱們還能夠設置邊框的大小不一致,能夠實現斜三角:
.border_3{
width: 0;
height: 0;
border-top:30px solid red;
border-right: 10px solid transparent;
border-bottom: 20px solid transparent;
border-left: 100px solid transparent;
box-sizing:border-box;
}
複製代碼
還能夠實現工做中常常碰到的梯形:
.border_4{
width: 150px;
height: 150px;
border-top:50px solid red;
border-right: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 50px solid transparent;
box-sizing:border-box;
}
複製代碼
好了,這裏不累贅了,感興趣的能夠各類嘗試。遇到這種簡單邊線圖,就不要動不動使用圖片了。
瞭解了上面的三角形的實現以後,估計你也能想出怎麼作引導蒙層了。一個div有四個邊框,若是咱們把邊框都設置成半透明,而後中間的區域(上面border_2的green)設置成全透明會不就能夠實現區域引導蒙層了嗎?而後再把邊框設置成超過屏幕的大小呢,就是全景引導蒙層了!
.border_5{
width: 150px;
height: 150px;
border-top:50px solid rgba(0,0,0,.5);
border-right: 50px solid rgba(0,0,0,.5);
border-bottom: 50px solid rgba(0,0,0,.5);
border-left: 50px solid rgba(0,0,0,.5);
box-sizing:border-box;
}
複製代碼
這是一個150px的區域蒙層,咱們看下以下示例就能很明白了:
.border_6{
width: 20px;
height: 20px;
border-style:solid;
border-color:rgba(0,0,0,.5);
border-width:20px;
animation:border_ani 2s linear infinite alternate;
box-sizing:content-box;
}
@keyframes border_ani {
from {
border-width:20px;
}
to {
border-width:100px;
}
}
複製代碼
固然,咱們還能夠設置border-radius來實現圓形的蒙層區域,以下:
固然,這裏的邊框大小值都是寫死的,具體實現須要根據頁面內容修改或者動態修改便可。
若是是橢圓呢?
總結:
border能夠實現各類邊線的形狀,能夠實現引導蒙層,頁面指定區域透明,以外的都半透明來實現便可。
box-shadow,大夥都不陌生,就是盒子的陰影,咱們先來了解下它的基本用法:
.boxshadow_1{
width:50px;
height:50px;
background:blue;
box-shadow: 10px 10px 5px 4px #000;
}
複製代碼
在寬高爲50px的div,它的陰影水平和垂直都是10px,陰影模糊距離是5px,陰影的尺寸是4px,陰影是#000的顏色(這裏給body增長了一個yellow的背景色以便於區分)。
首先咱們把陰影透明:
.boxshadow_2{
width:50px;
height:50px;
background:blue;
box-shadow: 10px 10px 5px 4px rgba(0,0,0,.5);
}
複製代碼
那怎麼讓陰影遮蓋整個頁面呢?
看以下的例子,咱們調整陰影的尺寸:
.boxshadow_3 {
width:50px;
height:50px;
background:blue;
box-shadow: 0px 0px 5px 0px rgba(0,0,0,.5);
animation:box_ani 2s linear infinite alternate;
}
@keyframes box_ani {
from {
box-shadow: 10px 10px 5px 0px rgba(0,0,0,.5);
}
to {
box-shadow: 10px 10px 5px 100px rgba(0,0,0,.5);
}
}
複製代碼
如上,咱們只須要把陰影尺寸加大就能夠實現引導蒙層了。
若是須要引導蒙層狀態下還能響應事件呢?只須要加一個pointer-events屬性便可。
box-shadow的陰影距離切勿盲目設置過大,通過測試這個值若是過大,好比4000px,在部分手機上陰影沒法顯示出來。通過實踐,設置爲2000px爲佳。
頁面內容已經作好了,咱們須要引導蒙層來顯示某個元素,那麼將元素複製到最外層,頂層增長一層蒙層來實現,須要突出的引導內容在蒙層之上便可實現。
<div class="content one">我是第一個div,我是第一個div</div>
<div class="content two">我是第二個div,我是第二個div</div>
<div class="content three">我是第三個div,我是第三個div</div>
<div class="content four">我是第四個div,我是第四個div</div>
<div class="mask"></div>
<div id="maskContent"></div>
複製代碼
這裏設置了一個固定蒙層,和一個固定的蒙層內容元素,咱們只須要填充便可。
.content{
padding:10px;
z-index:0;
}
.mask{
position:fixed;
left:0;
top:0;
width:100%;
height:100%;
background:rgba(0,0,0,.8);
z-index:900
}
#maskContent{
position:fixed;
z-index:999;
display:inline-block;
background-color: #fff;
}
複製代碼
這裏內容區域都是0,而後mask是900,咱們的蒙層元素是999,就是最上層了。
function renderContent(cls){
let targetNode = document.querySelector(`.${cls}`);
let maskContent = document.getElementById("maskContent");
maskContent.innerHTML = targetNode.outerHTML;
let pos = targetNode.getBoundingClientRect();
maskContent.style.top=pos.top+"px";
maskContent.style.left=pos.left+"px";
maskContent.style.width=pos.width+"px";
maskContent.style.height=pos.height+"px";
}
let i = 0;
setInterval(()=>{
renderContent(['one','two','three','four'][i]);
if(++i>=4) i = 0;
},1000)
複製代碼
這裏爲了演示效果,增長了一個定時器改變不一樣的遮罩層。易於理解,看下效果:
第二次繪製的內容區域和第一次重疊,使用xor,因此會透明,該引導內容區域就會徹底顯示出來,這就是咱們想要的效果了。
使用canvas的globalCompositeOperation屬性來實現,內容參考http://www.tutorialspoint.com/html5/canvas_composition.htm
重點看xor:Shapes are made transparent where both overlap and drawn normal everywhere else.
翻譯: canvas繪製的形狀在重疊處都會變成透明的,非重疊處的其餘任何地方都正常繪製內容。
因此咱們就能夠在canvas裏面繪製一個canvas蒙層,而後在蒙層中須要顯示的內容用xor來繪製重疊,而後重疊內容就會被透明,那麼這個透明區域的內容就是咱們想要的引導蒙層突出內容區域。具體看實例:
<div class="content one">我是第一個div,我是第一個div</div>
<div class="content two">我是第二個div,我是第二個div</div>
<div class="content three">我是第三個div,我是第三個div</div>
<div class="conteent four">我是第四個div,我是第四個div</div>
<canvas id="mask"></canvas>
複製代碼
頁面增長一個canvas節點。將canvas總體設置成半透明,而後再用xor來實現內容的繪製。
function mask(cls){
let targetNode = document.querySelector(`.${cls}`);
let pos = targetNode.getBoundingClientRect();
let canvas = document.getElementById("mask");
let width = window.innerWidth;
let height = window.innerHeight;;
canvas.setAttribute("width", width);
canvas.setAttribute("height",height);
var ctx = canvas.getContext("2d");
ctx.globalCompositeOperation = 'source-over';
ctx.fillStyle ='rgba(255, 255, 255, 0.9)';
ctx.fillRect(0, 0, width, height);
ctx.fill();
ctx.fillStyle ='white';
ctx.globalCompositeOperation="xor";
ctx.fillRect(pos.left,pos.top,pos.width,pos.height);
ctx.fill();
}
let array = ['one','two','three','four'];
let i = 0;
setInterval(()=>{
mask(array[i]);
i++;
if(i>=4) i = 0;
},1000)
複製代碼
看完以上實現,你最喜歡哪一種實現方式呢?
若是你以爲這篇內容對你有價值,請點贊,並關注咱們的官網和咱們的微信公衆號(WecTeam),每週都有優質文章推送: