I HATE FLYING BUGS logoFE Chapter
Design SystemAction

Floating Button (FAB)

콘텐츠 위에 떠 있는 버튼입니다. 화면 맥락에서 가장 자주 수행되는 1개의 핵심 생성/진입 액션을 즉시 실행할 수 있습니다.

개요

사용 목적

  • 빠른 접근: 사용자가 현재 화면에서 가장 자주, 가장 중요하게 수행하는 액션에 즉시 접근할 수 있도록 하기 위함
  • 빠른 수행: 생성(Create), 시작(Start), 추가(Add)와 같은 전진 지향적 행동을 빠르게 수행
  • 반복적 사용: 메뉴 탐색 없이 한 번의 조작으로 액션을 실행

해상도별 사용성 안내

해상도강점 (Strengths)단점 (Weaknesses)
모바일 (≤ 768px)한 손 조작 시 엄지 손가락으로 쉽게 닿음
화면의 최빈동작을 직관적으로 노출 가능
스크롤 숨김/표시로 콘텐츠 몰입 유지
화면이 작아 다른 UI와 충돌 위험(탭바, 키보드, 스낵바)
아이콘만 쓰면 의미 전달 부족 → 오작동 가능성이 있음
태블릿 (769px ~ 1024px)터치 범위와 정보량이 적절히 확보
좌우 여백을 활용해 FAB가 시각적으로 방해 덜 됨
세로·가로 모드 전환 시 위치 재계산이 필요함
터치/마우스 혼합 환경에서 포커스·크기 기준이 애매해질 수 있음
데스크톱 (≥ 1025px)화면이 넓어 FAB가 콘텐츠를 가리지 않음
Hover, Tooltip 등 보조 설명 가능
기본 마우스 조작 환경이라 FAB 시선 유도력이 낮을 수 있음
지나치게 작게 만들면 포커스·클릭 타깃 영역이 부족할 수 있음

이렇게 활용하세요

✅ 권장 사용 방식

  • 전진 액션 설계

    • 생성(Create): 글쓰기, 과제 추가, 프로젝트 생성, 메모 작성, 일정 등록
    • 시작(Start): 새 채팅, 새 문서, 새 녹음
    • 추가(Add): 파일 업로드, 연락처 추가, 지도 핀 등록
  • 배열 규칙: 화면당 하나의 FAB만 배치해 명확성 유지

  • 인지적 사용성

    • 아이콘 또는 아이콘+라벨만으로 기능이 즉시 인식 가능하도록 설계
    • 모바일에서는 Extended FAB(이름+아이콘)를 기본으로 사용해 가시성과 터치 정확도 향상
  • 화면 가시성

    • 스크롤이 많은 모바일 화면에서는 아래로 스크롤 시 숨김, 위로 스크롤 시 표시로 콘텐츠 영역 확보

❌ 비권장 사례

  • 파괴적 액션: 삭제, 초기화, 취소에서는 사용하지 않습니다.

  • 보조/유틸리티 액션: 정렬, 필터, 더보기, 설정에서는 사용하지 않습니다.

  • 제출/확정 액션: 폼 제출, 결제 완료 등에서는 사용하지 않습니다. 이경우에는 하단 고정 Primary 버튼을 사용합니다.

  • 인지적 사용성: 한 화면에 2개 이상의 FAB를 배치하지 않습니다. 페이지 간 이동/네비게이션 용도로 사용하지 않습니다.

Variants

Impact
Top Tier

사용자의 즉각적 주의를 끌어 가장 중요한 단일 행동을 유도하는 최상위 위계의 플로팅 버튼입니다. 브랜드 아이덴티티를 강하게 드러내며, 캠페인/핵심 전환 액션 등에서 사용합니다. 화면당 최대 1개만 사용합니다. 하단 내비게이션/바텀 시트와 시각적 경쟁이 나지 않게 배치합니다. 일반 흐름(보조·설정 등)에는 남용 금지.

Inactive

Hover

Pressed

Disabled

Loading

<FloatingButton color="impact" size="normal" icon={<Add />} />
<FloatingButton color="impact" size="normal" disabled icon={<Add />} />
<FloatingButton color="impact" size="normal" loading icon={<Add />} />

Primary
1순위 위계

서비스 전반에서 주요 기본 액션을 담당하는 기본형 FAB입니다. 일관된 주행동(예: 새로 만들기, 업로드 시작)으로 인지되어야 합니다. 기본은 아이콘 중심 사용. 텍스트가 필요하면 Extended FAB를 별도 사용합니다. 동일 화면 내 보조 FAB와 위계 대비를 유지합니다. 파괴적/경고 의미에는 사용하지 않습니다.

Inactive

Hover

Pressed

Disabled

Loading

<FloatingButton color="primary" size="normal" icon={<Add />} />
<FloatingButton color="primary" size="normal" disabled icon={<Add />} />
<FloatingButton color="primary" size="normal" loading icon={<Add />} />

White
2순위 위계

배경이 어둡거나 시각 정보가 조밀한 화면에서 침습성을 낮춘 보조 행동에 사용합니다. 주변 콘텐츠를 가리지 않으면서 액션 진입점을 제공합니다. 주 CTA가 따로 있는 화면에서는 보조 용도로만 사용합니다.

Inactive

Hover

Pressed

Disabled

Loading

<FloatingButton color="white" size="normal" icon={<Add />} />
<FloatingButton color="white" size="normal" disabled icon={<Add />} />
<FloatingButton color="white" size="normal" loading icon={<Add />} />

Success
Positive Status

긍정/완료/확정 계열의 의미를 갖는 플로팅 버튼입니다. 성공 상태로 이어지는 흐름(확정 제출, 승인, 완료 처리 등)에 사용합니다. 의미 체계가 긍정(Positive)일 때만 사용합니다. 삭제/경고/위험 행위에는 사용하지 않습니다(위계·의미 충돌)

Inactive

Hover

Pressed

Disabled

Loading

<FloatingButton color="success" size="normal" icon={<Add />} />
<FloatingButton color="success" size="normal" disabled icon={<Add />} />
<FloatingButton color="success" size="normal" loading icon={<Add />} />

Sizes

플로팅 버튼은 사용 맥락에 따라 두 가지 사이즈로 제공합니다. 화면 가독성, 터치 영역, UI 밀도 등을 고려해 선택하며, 각 사이즈는 디바이스 환경과 위계에 맞춰 유연하게 적용됩니다.

<FloatingButton size="normal" icon={<Add />} />
<FloatingButton size="mini" icon={<Add />} />
Size NameUse Case
normal앱 전반의 기본 주행동에 사용. 스크롤이 많은 화면에서 항상 노출되는 진입점 제공(예: 새로 만들기/작성 시작/업로드).
mini공간 밀도가 높은 화면의 보조·문맥 액션에 사용(카드/리스트/지도 등). 다중 FAB 패턴에서 보조 버튼으로 배치. 주요 전환 CTA에는 사용하지 않음.

Content Types

플로팅 버튼은 아이콘 사용성을 중심으로 사용됩니다. 맥락에 따라 라벨을 추가한 Extended FAB를 사용하며, 기능 목적과 화면 밀도에 따라 아이콘 배치·라벨 유무를 선택합니다.

<FloatingButton icon={<Add />} />
<FloatingButton icon={<Add />} label="작성하기" />
<FloatingButton label="textOnly" />
LabelDescription
iconOnly아이콘만 포함된 기본형 FAB. 단일 핵심 액션의 빠른 진입점(예: 새로 만들기/추가/작성 시작).
iconLeft라벨을 포함한 Extended FAB. 아이콘이 라벨 왼쪽에 위치. 아이콘만으로 의미가 모호하거나 초보자 안내가 필요한 경우 사용(예: 작성하기, 업로드 시작).
textOnly라벨만 포함된 변형안. 시각적 간섭을 최소화해야 하거나 아이콘 의미 혼동 위험이 있을 때 제한적 사용. 일반 흐름에서는 권장하지 않음

Examples

Default

아이콘 전용 기본형 FAB. 화면당 1개만 사용. 하단 우측 고정, 제품 Safe Area 규칙을 준수하고 바텀 UI와 간섭 금지. 필요 시 스크롤 규칙(내릴 때 숨김 / 올릴 때 노출)을 적용.

<FloatingButton color="primary" size="normal" icon={<Add />} />

FAB + Chip

FAB에 상태/카운트를 함께 보여주는 변형(신규/미처리 건수 등). 칩은 우상단에 겹쳐 배치, 숫자는 1–3자리 표기(예: 99+). 색상은 의미 체계(Neutral/Alert/Success)를 따르며, 값이 0이면 표시하지 않음.

99+
<div className="relative">
  <FloatingButton color="primary" size="normal" icon={<Add />} />
  <div className="absolute -top-1 -right-1 bg-red-500 text-white text-xs rounded-full w-6 h-6 flex items-center justify-center">
    99+
  </div>
</div>

Loading State

<FloatingButton loading icon={<Add />} />
<FloatingButton color="primary" loading icon={<Add />} />
<FloatingButton color="success" loading icon={<Add />} />

With Ref

ref를 사용하여 플로팅 버튼에 직접 접근할 수 있습니다.

import { useRef } from 'react';

function FloatingButtonWithRef() {
  const ref = useRef<HTMLButtonElement>(null);
  
  const handleClick = () => {
    console.log(ref.current);
  };
  
  return (
    <FloatingButton ref={ref} onClick={handleClick} icon={<Add />} />
  );
}

Props

PropTypeDefault
icon?
React.ReactNode
undefined
label?
React.ReactNode
undefined
color?
"impact" | "primary" | "white" | "success"
"primary"
size?
"normal" | "mini"
"normal"
disabled?
boolean
false
loading?
boolean
false
asChild?
boolean
false
Edit on GitHub

Last updated on