前端網頁動效

-

怎麼幫網站加上具有科技感的背景?用 CSS 做一個光線墜落特效

this.web

前幾天看到一個這樣的效果,覺得很酷很有科技感,嘗試了一下發現蠻簡單的,今天就來看看怎麼做吧!

JS 生成 DOM

這次先從 JS 開始,因為每個光線都是一個 DOM,所以直接用 JS 生成比較快速,你也可以手動使用 HTML 打多個 <div>。JS 的部分不會很難:

const lineCount = 20; // 線條的數量

for (let i = 1; i <= lineCount; i++) {
  const line = document.createElement('div'); // 製造 div 元素
  line.classList.add('line'); // 添加 class name
  
  line.style.setProperty('left',  
    `${i * (100 / lineCount) + Math.random() * 5 - 5}%`); // 隨機線條位置

  // 隨機動畫時間
  line.style.setProperty('--ani-duration', 8 + Math.random() * 10 + 's'); 
  line.style.setProperty('--ani-delay', -Math.random() * 10 + 's');
  
  document.body.appendChild(line); // 添加到 body 上
}

上面有兩個可以注意的地方line.style.setProperty('left',${i(100 lineCount) + Math.random() 5 - 5}%) :

我們先用 left 決定線條位置,並且會隨著 index 慢慢往右移動,最後的 Math.random() * 5 - 5% 是讓他稍微添加隨機感,每個線條的位置都會正負 5% 隨機

line.style.setProperty('--ani-duration', 8 + Math.random() * 10 + 's'); line.style.setProperty('--ani-delay', -Math.random() * 10 + 's'); :

這裡則是利用 css variable 來隨機動畫時間,我們可以用負的 animation-dealy 來製造隨機感,有不會真的需要延遲一段時間後才執行動畫,是不錯的技巧。

CSS 基本樣式

接著直接來寫 CSS,整體蠻簡單的,將 line 的高度設為 100vh,並用偽元素製作藍色線條。寫完之後會像下面這個樣子:

.line {
  --line-height: 80px;

  position: absolute;
  left: var(--left);
  width: 1px;
  height: 100vh;
  background: 
     linear-gradient(to bottom, transparent, var(--line-blue));
  z-index: 1;
}

.line::after {
  content: '';
  position: absolute;
  left: 0;
  width: 100%;
  height: var(--line-height);
}
CSS 光線墜落基本樣式

CSS 光線墜落動畫

接著利用在 JS 製作的隨機動畫時間和延遲,加上 animation,一個簡單但很酷的效果就出來了!

.line::after {
  /* ... */
  animation: fall var(--ani-duration) var(--ani-delay) linear infinite;
}
@keyframes fall {
  0% {
    top: calc(-1 * var(--line-height));
  }
  100% {
    top: 100%;
  }
}

加上標題

最後,加上標題點綴一下,這裡我用 after 加上 linear-gradient,讓它由上到下是從透明到黑色,製作一種遮罩的感覺。

<h1>Background Beams</h1>
h1 {
  position: relative;
  font: 4vw sans-serif;
  color: white;
  z-index: 2;
}

h1:after {
  content: '';
  position: absolute;
  inset: 0;
  background: 
     linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%,
       rgba(0, 0, 0, 0.95) 100%);
}

到這邊就完成了,這邊附上 Codepen~

相關系列文章