歡迎來到「微交互特輯」!
今天我們將一起深入探索那些讓畫面更有溫度的小巧思。
無論是按鈕按下的瞬間、滑鼠滑過的細微變化,還是輸入框那輕輕一閃的提示,這些看似不起眼的小動效,其實是 UI 設計中的秘密武器!
準備好和我一起用 Vue.js 打造屬於你的獨一無二視覺體驗了嗎?
Let’s go! 🚀✨
微交互(Micro-interactions)的定義是指在使用者與界面進行操作時,發生的細小且短暫的互動,通常用來提供即時反饋或增強使用者體驗。這些互動往往是簡單的、不打斷流程的行為,但它們能有效地提升使用者在使用產品或界面時的愉悅感和操作流暢度。
觸發器(Trigger):
規則(Rules):
反饋(Feedback):
循環與模式(Loops and Modes):
簡單來說,微交互就是那些看似不顯眼,但又能在使用者與界面互動時,提供關鍵反饋的小細節。
它們雖然微小,但卻能極大地改善整體使用者體驗。
流暢度到反應的細節,這正是微交互的精髓所在。
微交互是界面中的細緻互動,針對單一行為或狀態轉變,專注於細節並提供即時反饋。
特點:
交互是整體的互動體驗,涵蓋系統與使用者間的所有操作過程。
特點:
區別:
接下來,我們將實作一個 Vue 3 和 TypeScript 的互動範例。
這個元件包含了趣味的眼睛動畫,結合微交互概念打造出吸引人的視覺效果。
** 主要功能:**
這個實作將展示如何使用微交互設計提升界面互動感。
微交互不僅能增強細節的反饋效果,還能讓整個操作變得更加生動有趣。
透過實作這些有趣的動效,你將學會如何在 Vue.js 中不只能發揮創意還能輕鬆實現這些讓人眼睛一亮的設計!
接著,請欣賞程式碼,並且跟者我們實做大心法吧!
<script setup>
import { ref, onMounted } from "vue";
const isBlinking = ref(false);
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const blinkSequence = async () => {
for (let i = 0; i < 2; i++) {
isBlinking.value = !isBlinking.value;
await sleep(150);
isBlinking.value = !isBlinking.value;
if (i === 0) await sleep(150);
}
};
onMounted(() => setInterval(blinkSequence, 3000));
</script>
<template>
<div class="grid place-items-center min-h-screen font-mono text-gray-4 bg-dark-9">
<div class="relative border-2 border-gray-400 rounded">
<label
class="absolute bottom-[calc(100%_+_0.5rem)] text-gray-400 tracking-[0.2ch] transition-colors duration-200"
>Password</label
>
<input
ref="passwordInput"
v-model="password"
type="password"
required
class="p-4 pr-16 text-[1.75rem] tracking-[0.2ch] rounded-[6px] text-gray-400 border-gray-400 border-solid bg-dark-9 outline-none transition-colors duration-200"
/>
<button
title="Reveal Password"
@click="toggleScramble"
class="absolute right-0 top-1/2 translate-y-[-50%] p-0 grid place-items-center h-full aspect-square rounded-lg border-none bg-dark-9 border-[6px] border-transparent transition-background duration-125 text-gray-400 outline-none"
>
<svg
class="w-[75%]"
:class="{ blinking: isBlinking }"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<defs>
<mask id="eye-open">
<path
d="M1 12C1 12 5 4 12 4C19 4 23 12 23 12V20H12H1V12Z"
fill="#D9D9D9"
stroke="black"
stroke-width="1.5"
stroke-linejoin="round"
/>
</mask>
<mask id="eye-closed">
<path
d="M1 12C1 12 5 20 12 20C19 20 23 12 23 12V20H12H1V12Z"
fill="#D9D9D9"
/>
</mask>
</defs>
<path
class="lid lid--upper"
d="M1 12C1 12 5 4 12 4C19 4 23 12 23 12"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
class="lid lid--lower"
d="M1 12C1 12 5 20 12 20C19 20 23 12 23 12"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<g :mask="isBlinking ? 'url(#eye-closed)' : 'url(#eye-open)'">
<g class="eye">
<circle cx="12" cy="12" r="4" fill="currentColor" />
<circle cx="13" cy="11" r="1" fill="black" />
</g>
</g>
</svg>
</button>
</div>
</div>
</template>
<style>
.blinking .lid--upper {
animation: blink-upper 0.3s forwards;
}
.blinking .lid--lower {
animation: blink-lower 0.3s forwards;
}
@keyframes blink-upper {
0% {
d: path("M1 12C1 12 5 4 12 4C19 4 23 12 23 12");
}
100% {
d: path("M1 12C1 12 5 20 12 20C19 20 23 12 23 12");
}
}
@keyframes blink-lower {
0% {
d: path("M1 12C1 12 5 20 12 20C19 20 23 12 23 12");
}
100% {
d: path("M1 12C1 12 5 20 12 20C19 20 23 12 23 12");
}
}
</style>
SVG 眼睛圖示 (<svg>
):
:class="{ blinking: isBlinking }"
動態綁定 blinking
樣式,當 isBlinking
狀態為真時觸發眨眼效果。遮罩 (<mask id="eye-open">
與 <mask id="eye-closed">
):
isBlinking
狀態在這兩個遮罩間切換,創造眨眼的動畫效果。上眼皮與下眼皮 (<path class="lid lid--upper">
與 <path class="lid lid--lower">
):
blinking
樣式啟用時,這些路徑會進行動畫,模擬眼睛的閉合與張開。眼睛瞳孔與虹膜 (<g class="eye">
):
這次的實作不僅是技術的呈現,更是微交互設計的體現。
透過這些細小的互動,我們能為使用者創造更貼心、更有溫度的使用體驗。
希望你也能從中獲得靈感,將微交互應用到自己的專案中喔!