前端網頁動效

-

CSS 直角文字怎麼做?超日系風格的設計

this.web

CSS 直角文字

前陣子看到某個日本網站做出這樣的直角文字,並搭配動畫,整個超日系超愛,結果發現他們整個文字是用圖片做的( 跟 113 國慶網站一樣XD)

身為喜歡前端特效的我,一定要研究一下純 CSS 是怎麼做到的,用成文字也能讓用戶可以直接複製。

來看看怎麼做的吧~

HTML 結構

HTML 不難,基本上就是一個 container,裡面包含一張圖片跟兩段文字,文字的部分用 horizontal、corner、vertical 來為等等的排版做準備。

<div class="container">
  <img class="container__img" src="./assets/img.jpg" alt="img" />
  <p class="container__text top-right">
    <span class="horizontal">努力する人は希望を語り</span>
    <span class="corner"></span>
    <span class="vertical">怠ける人は不満を語る</span>
  </p>
  <div class="container__text bottom-left">
    <span class="vertical">人間の想像力は実現で</span>
    <span class="corner"></span>
    <span class="horizontal">るものしか想像できない</span>
  </div>
</div>

CSS 排版

接著來看 CSS~

container & img 排版

這裡我們用 css variable 來統一管理 border 和 font-size,並讓圖片撐滿整個 container

.container {
  --border: 1px solid;
  --font-size: min(2.5vw, 56px);

  position: relative;
  width: 60vw;
  font-size: var(--font-size);
}
.container__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

直角文字

接著進入重頭戲,我們先設定文字的位置,分別是右上和左下,並且讓他稍微外移超過圖片,用 calc(-1 * var(—font-size))

並且用 grid-template-areas 的方式排版,這個排版方式超好用,可以自己命名每個區域,等等直接用 grid-area 就可以快速排版。

.container__text {
  position: absolute;
  display: grid;
}
.container__text.top-right {
  top: calc(-1 * var(--font-size));
  right: calc(-1 * var(--font-size));
  grid-template-areas:
    'horizontal corner'
    'empty vertical';
}
.container__text.bottom-left {
  bottom: calc(-1 * var(--font-size));
  left: calc(-1 * var(--font-size));
  grid-template-areas:
    'vertical empty'
    'corner horizontal';
}

接下來調整文字裡的 span 的位置,注意這裡可以用 writing-mode: vertical-lr 來讓文字變直行書寫,可以參考我以前的文章

.horizontal {
  grid-area: horizontal;
}
.corner {
  grid-area: corner;
  display: grid;
  place-content: center;
}
.vertical {
  grid-area: vertical;
  writing-mode: vertical-lr;
}
日系直角文字 without border

整個感覺都有了,接著加上 borderanimation 就完成了~

直角文字 border

這裡不難,基本上就是根據文字的位置加 borderpadding

/* Top Right */
.top-right .horizontal {
  padding-left: 8px;
  border-block: var(--border);
  border-left: var(--border);
}
.top-right .corner {
  border-top: var(--border);
  border-right: var(--border);
}
.top-right .vertical {
  padding-bottom: 8px;
  border-block: var(--border);
  border-bottom: var(--border);
}
/* Bottom Left */
.bottom-left .vertical {
  padding-top: 8px;
  border-block: var(--border);
  border-top: var(--border);
}
.bottom-left .corner {
  border-bottom: var(--border);
  border-left: var(--border);
}
.bottom-left .horizontal {
  padding-right: 8px;
  border-block: var(--border);
  border-right: var(--border);
}

直角文字 animation

要讓文字順時鐘或逆時鐘消失,可以利用 clip-path 來做到,我是控制 circle 的位置和大小,來達到類似的效果,看程式碼可能很難理解,下面我加上背景來演示~

.container__text.top-right {
  animation: ani-text-top-right 4s infinite alternate;
}
.container__text.bottom-left {
  animation: ani-text-bottom-left 4s infinite alternate;
}
.container__img {
  animation: ani-img 4s infinite alternate;
}
@keyframes ani-text-top-right {
  0%, 25% {
    clip-path: circle(0 at 0 0);
  }
  75%, 100% {
    clip-path: circle(120% at 100% 0%);
  }
}
@keyframes ani-text-bottom-left {
  0%, 25% {
    clip-path: circle(0 at 0 0);
  }
  75%, 100% {
    clip-path: circle(120% at 0 100%);
  }
}
@keyframes ani-img {
  0%, 10% {
    clip-path: polygon(100% 0, 100% 0, 100% 100%, 100% 100%);
  }
  50%, 100% {
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
  }
}

基本上到這邊就完成啦!這次教學用到很多實用的 CSS 屬性,例如 grid-areas-template、clip-path 以及比較冷門的 writing-mode

那今天就這樣,下篇貼文見~

相關系列文章