純CSS實(shí)現(xiàn):漸變+滾動(dòng)的邊框

一、前言
本文轉(zhuǎn)載于:

https://www.zhangxinxu.com/wordpress/?p=7975

  先上效果圖:


















二、漸變虛線邊框的實(shí)現(xiàn)
1、HTML和CSS

<div class="box">
  <div class="content"></div>
</div>
.box {
    width: 150px;
    border: 2px dashed #fff;
    background: linear-gradient(to bottom, #34538b, #cd0000);
    background-origin: border-box;
}
.content {
    height: 100px;
    background-color: #fff;
}
實(shí)時(shí)效果如下:








Chrome 68截圖效果如下:








問(wèn)題

雖然這種實(shí)現(xiàn)兼容性不錯(cuò),IE10+都支持,但是,虛實(shí)比例由于反過(guò)來(lái)了,因此,虛線太稀疏,而且邊角無(wú)法形成直角。在實(shí)際項(xiàng)目中,是過(guò)不了設(shè)計(jì)師這一關(guān)的。

那有沒(méi)有效果更精致的虛線邊框漸變實(shí)現(xiàn)方法呢,有!我們可以借助CSS3 mask遮罩來(lái)實(shí)現(xiàn)。

借助CSS遮罩實(shí)現(xiàn)精致的漸變虛框

這個(gè)方法HTML只需要一層標(biāo)簽即可,而且沒(méi)有冗余的純色覆蓋,適用于各種背景場(chǎng)合,HTML代碼如下:

<div class="box"></div>

CSS代碼如下,漸進(jìn)增強(qiáng),不支持遮罩的瀏覽器還是純色虛框:

.box {
    width: 200px;
    height: 150px;
    border: 2px dashed #cd0000;
    box-sizing: border-box;
}
@supports (-webkit-mask: none) or (mask: none) {
  .box {
    border: none;
    background: linear-gradient(to bottom, #34538b, #cd0000) no-repeat;
    mask: linear-gradient(to right, #000 6px, transparent 6px) repeat-x,
          linear-gradient(to bottom, #000 6px, transparent 6px) repeat-y,
          linear-gradient(to right, #000 6px, transparent 6px) repeat-x 0 100%,
          linear-gradient(to bottom, #000 6px, transparent 6px) repeat-y 100% 0;
    mask-size: 8px 2px, 2px 8px, 8px 2px, 2px 8px;
  }    
}

實(shí)際使用的時(shí)候,mask屬性還需要加下-webkit-私有前綴,這里示意目的,因此簡(jiǎn)化了代碼。

實(shí)現(xiàn)的漸變虛框效果如下截圖:









由于這個(gè)虛框本質(zhì)上是CSS繪制的,因此,我們可以隨意控制虛線的虛實(shí)比例,非常靈活。

關(guān)于CSS遮罩
默認(rèn)情況下,CSS遮罩可以讓元素只顯示遮罩圖片有顏色部分的區(qū)域,于是,這里,我們只要使用mask屬性繪制一個(gè)黑色虛框,就能實(shí)現(xiàn)真正意義上的漸變虛框效果了。

三、虛線邊框滾動(dòng)動(dòng)畫
百度ueditor編輯器網(wǎng)站首頁(yè)(http://ueditor.baidu.com/website/)底部有一個(gè)滾動(dòng)虛框的效果,如下GIF示意:





當(dāng)時(shí)我看到這個(gè)效果的時(shí)候,很興奮,沒(méi)想到做這個(gè)官網(wǎng)頁(yè)面的還是個(gè)CSS牛人!等我打開控制臺(tái)一看——恩,原來(lái)是JS計(jì)算實(shí)現(xiàn)的,我就默默地關(guān)掉了頁(yè)面,假裝剛才什么都沒(méi)發(fā)生過(guò)。

實(shí)際上,這種效果三兩行CSS代碼就可以實(shí)現(xiàn),且IE10+瀏覽器都支持。

如下HTML和CSS:

<div class="box">
    <div class="content">內(nèi)容占位</div>
</div>





.box {
    width: 200px;
    background: repeating-linear-gradient(135deg, transparent, transparent 3px, #000 3px, #000 8px);
    animation: shine 1s infinite linear;
    overflow: hidden;
}
.content {
    height: 128px;
    margin: 1px; padding: 10px;
    background-color: #fff;    
}
@keyframes shine {
    0% { background-position: -1px -1px;}
    100% { background-position: -12px -12px;}
}
實(shí)現(xiàn)的邊框運(yùn)動(dòng)效果如下GIF:









邊框區(qū)域鏤空,然后背景圖片設(shè)為下面這個(gè)GIF平鋪背景即可:






例如下面這個(gè)水果的選區(qū)背景效果:








這里的邊框滾動(dòng)效果也是類似的,只是我們的斜紋是使用CSS3重復(fù)線性漸變屬性repeating-linear-gradient實(shí)現(xiàn)的,而規(guī)律運(yùn)動(dòng)是CSS3動(dòng)畫實(shí)現(xiàn)的,于是,最終實(shí)現(xiàn)了視覺(jué)上的虛線邊框滾動(dòng)效果。這種視覺(jué)感受跟小時(shí)候看發(fā)廊里面那個(gè)旋轉(zhuǎn)的斜紋柱子其實(shí)有異曲同工之處。

四、一個(gè)實(shí)線邊框loading動(dòng)畫
先看效果吧,不過(guò)GIF截圖尺寸會(huì)比較大,我就直接放一個(gè)靜態(tài)圖吧:












實(shí)線的效果是一條邊框?qū)嵕€,像個(gè)貪吃蛇一樣,一直圍著這個(gè)圖片元素跑啊跑,跑啊跑,一直不停歇。

實(shí)現(xiàn)原理其實(shí)也頗為簡(jiǎn)單,就是使用CSS clip屬性對(duì)邊框進(jìn)行剪裁而已,使用clip屬性是因?yàn)榧嫒菪院?,如果你的?xiàng)目不需要管IE,則可以使用clip-path屬性來(lái)剪裁

具體HTML和CSS代碼如下:

<div class="box">
    <img src="mm1.jpg" width="128" height="96">
</div>
.box {
    display: inline-block;
    padding: 10px;
    position: relative;
}
.box::before {
    content: '';
    position: absolute;
    left: 0; top: 0; right: 0; bottom: 0;
    border: 2px solid #cd0000;
    animation: borderAround 1.5s infinite linear;    
}
@keyframes borderAround {
    0%, 100% { clip: rect(0 148px 2px 0); }
    25% { clip: rect(0 148px 116px 146px); }
    50% { clip: rect(114px 148px 116px 0); }
    75% { clip: rect(0 2px 116px 0); }
}
實(shí)際上,要想loading效果好,應(yīng)該兩個(gè)線框相互驅(qū)逐,本demo為了避免干擾,某人就一個(gè)線框悠悠地轉(zhuǎn),如果想要顯示2個(gè)線框相互追逐,demo頁(yè)面是留了彩蛋的,點(diǎn)擊圖片即可,會(huì)變成下面這樣:











此效果應(yīng)用場(chǎng)景個(gè)人覺(jué)得還是相當(dāng)廣泛的。

一是強(qiáng)調(diào)和警示,例如某些非常重要的申明,就可以用這個(gè)邊框動(dòng)畫,保證人人都會(huì)注意到。

二是作為loading效果。并且可大可小,平常一個(gè)大容器里面加載東西,我們都是容器中間放個(gè)菊花,實(shí)際上,讓容器邊緣這個(gè)兩條折線追逐效果也挺好的;或者把容器中的菊花換成同尺寸的邊框動(dòng)畫也是可以的,很有心意,保證創(chuàng)新。

五、總結(jié)
   邊框動(dòng)畫還有很多很酷的效果,例如和border-radius配合,可以實(shí)現(xiàn)轉(zhuǎn)彎邊框動(dòng)畫效果,這個(gè)以后有機(jī)會(huì)再演示。

作者:張?chǎng)涡?/p>

歡迎關(guān)注:前端早茶