[ 코드잇 스프린트 ] 교육기간 2일차 TIL

2024. 11. 8. 23:26·교육/코드잇 스프린트 : 단기심화 5기


강의 목표

Tailwind CSS의 기초에 대해 학습하고 실습을 진행합니다.

 

강의 내용 정리

강의시간에 학습한 내용을 정리합니다.

 

개발환경 세팅하기

  • npx create-next-app@latest

 

추천 익스텐션

  • Tailwind CSS IntelliSense

 

실습하기 - 그라디언트 아이콘

  • 그라디언트 아이콘(drop shadow는 제외)
  • <span> 태그를 이용하고 너비, 높이를 적당히 지정할 것
  • 원 형태로 만들 것
  • background-image 속성을 이용해서 그라디언트를 처리

내 코드

export default function Home() {
  return (
    <div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]">
      <main className="flex flex-col gap-8 row-start-2 items-center sm:items-start">
        {/* 그라디언트 실습코드 */}
        <span className="w-[24px] h-[24px] mx-[4px] bg-gradient-to-r from-cyan-500 to-blue-500 rounded-full drop-shadow-[3px_3px_5px_#000000]"></span>
      </main>
    </div>
  );
}
  • TailwindCSS > background-image > Linear gradients 공식문서를 참고하였습니다.
  • 설정값은 크게 3부분으로 그라디언트 방향, 출발 색, 도착 색입니다.
  • 원으로 구현해야해서 rounded-full을 부여하였습니다.
  • drop-shadow는 시간이 남으면 수행하라고 하셔서 임의로 넣어보기만 했습니다.

정답 코드

  • 그라디언트 텍스트
<span className="text-9xl font-bold text-transparent leading-[1.1] px-1 bg-clip-text bg-gradient-to-r from-[#15c064] from-[28.5%] to-[#00d1ff] to-[91.82%]">
TEXT
</span>

 

  • 텍스트 + 그라디언트 배경
<div className="before:-translate-x-[1.25%] before:w-[102.5%] before:h-full before:top-0 before:left-0 absolute bg-gradient-to-r from-[#e9f9f4] via-[#cfebfe] via-[45.31%] to-[#f2eefe] text-[46px] font-bold">
  TEXT
</div>

 

 

실습하기 - 애니메이티드 버튼

  • group, group-hover를 사용 
    • 참고자료
  • 1. 호버시 화살표 아이콘이 나타남
    • 화살표 아이콘은 다음 코드를 사용
  • 2. 호버시 화살표 아이콘이 사라지고 나타남

내 코드

export default function Home() {
  return (
    <div className="flex flex-col justify-center items-center min-h-screen gap-5">
    
      {/* 애니메이티드 버튼 실습 코드 1 */}
      <div className="group flex flex-row w-[200px] h-[100px] bg-blue-300 justify-center items-center gap-5">
        <h1 className="text-[30px] font-bold">text</h1>
        <svg
          className="w-[30px] h-[30px] opacity-0 group-hover:opacity-100 transition duration-150 -translate-x-5 group-hover:translate-x-0 delay-150 ease-in-out"
          viewBox="0 0 20 20"
          aria-hidden="true"
          focusable="false"
        >
          <path
            d="M17.707 9.293l-5-5a.999.999 0 10-1.414 1.414L14.586 9H3a1 1 0 100 2h11.586l-3.293 3.293a.999.999 0 101.414 1.414l5-5a.999.999 0 000-1.414z"
            fill="currentColor"
          ></path>
        </svg>
      </div>
      
      {/* 애니메이티드 버튼 실습 코드 2 */}
      <div className="group flex flex-row w-[200px] h-[100px] bg-red-300 justify-center items-center gap-5">
        <svg
          className="w-[30px] h-[30px] opacity-0 group-hover:opacity-100 transition duration-150 -translate-x-5 group-hover:translate-x-0 delay-150 ease-in-out"
          viewBox="0 0 20 20"
          aria-hidden="true"
          focusable="false"
        >
          <path
            d="M17.707 9.293l-5-5a.999.999 0 10-1.414 1.414L14.586 9H3a1 1 0 100 2h11.586l-3.293 3.293a.999.999 0 101.414 1.414l5-5a.999.999 0 000-1.414z"
            fill="currentColor"
          ></path>
        </svg>
        <h1 className="text-[30px] font-bold -translate-x-7 group-hover:translate-x-7 duration-150 delay-150">
          text
        </h1>
        <svg
          className="w-[30px] h-[30px] opacity-100 group-hover:opacity-0 transition duration-150 translate-x-0 group-hover:translate-x-5 delay-150 ease-in-out"
          viewBox="0 0 20 20"
	          aria-hidden="true"
          focusable="false"
        >
          <path
            d="M17.707 9.293l-5-5a.999.999 0 10-1.414 1.414L14.586 9H3a1 1 0 100 2h11.586l-3.293 3.293a.999.999 0 101.414 1.414l5-5a.999.999 0 000-1.414z"
            fill="currentColor"
          ></path>
        </svg>
      </div>
      
    </div>
  );
}
  • TailwindCSS > Transitions & Animation > Transition Property 를 참고하였습니다
  • 실습 코드 1
    • 처음에는 아이콘이 안보여야 하기때문에 기본적으로 hidden을 부여하고 호버를 하면 보이도록 하기위해 group-hover:block으로 처리하려고하였습니다.
    • 하지만 group-hover와 hidden을 함께 사용하면 요소가 완전히 숨겨져서 제대로 동작하지 않는 문제가 있어서 투명도를 조절하는 방법으로 해결하였습니다.
    • opacity-0 , group-hover:opacity-100 , duration-150으로 자연스럽게 나오도록 처리해주었습니다.
    • 이외 나머지 핵심 코드는 다음과 같습니다.
      • tarnsition
        • 기본적인 전환효과를 사용하기 위해 필요
      • -translate-x-5 , group-hover:tranlate-x-0
        • 약간 왼쪽에서 중앙으로 이동하는 애니메이션을 위해 필요
      • delay
        • 호버하고 약간 지연시간을 부여하기위해 필요
  • 실습 코드 2
    • 기본적으로 화살표 아이콘 두개 중 하나는 보이고 하나는 안보임
    • 호버시 안보이는 화살표 아이콘은 보이고 보이는 화살표 아이콘은 안보이게 되어야함
    • 실습 1에서 했듯이 opacity를 사용하여 보이기/숨기기 처리
    • 동작도 똑같이 왼쪽에서 오른쪽으로 이동하며 나타나거나 사라지는 것이기 때문에 사실상 동일한 방식으로 코드를 작성하여 처리
    • 다만, 텍스트도 같이 움직여야 하기때문에 이번에는 텍스트 왼쪽에서 나타나는 화살표 아이콘이 이동하는만큼 텍스트도 이동해서 마치 화살표와 텍스트가 같이 이동하는 것처럼 스타일 처리하였음

정답 코드

<a
  href="https://themes.shopify.com?locale=en"
  className="group flex justify-start items-center"
  data-component-name=""
>
  <span className="underline font-semibold inline-block mr-2">
    Theme Store
  </span>
  <svg
    viewBox="0 0 20 20"
    aria-hidden="true"
    focusable="false"
    className="group-hover:opacity-100 opacity-0 w-4 h-4 inline-block transition-all duration-500 group-hover:translate-x-2 will-change-transform align-bottom"
  >
    <path
      d="M17.707 9.293l-5-5a.999.999 0 10-1.414 1.414L14.586 9H3a1 1 0 100 2h11.586l-3.293 3.293a.999.999 0 101.414 1.414l5-5a.999.999 0 000-1.414z"
      fill="currentColor"
    ></path>
  </svg>
</a>
<div className="w-96">
  <a
    href="/sell"
    className="text-lg overflow-hidden border-b pb-4 font-medium group flex flex-row default:border-black w-4/5"
  >
    <svg
      viewBox="0 0 20 20"
      aria-hidden="true"
      focusable="false"
      className="motion-reduce:group-hover:-translate-x-full h-6 w-6 origin-left -translate-x-full self-center opacity-0 transition-all duration-500 will-change-transform group-hover:translate-x-0 group-hover:opacity-100"
    >
      <path
        d="M17.707 9.293l-5-5a.999.999 0 10-1.414 1.414L14.586 9H3a1 1 0 100 2h11.586l-3.293 3.293a.999.999 0 101.414 1.414l5-5a.999.999 0 000-1.414z"
        fill="currentColor"
      ></path>
    </svg>
    <span className="motion-reduce:group-hover:translate-x-0 -translate-x-5 transition-transform duration-500 will-change-transform group-hover:translate-x-2">
      Start selling
    </span>
    <svg
      viewBox="0 0 20 20"
      aria-hidden="true"
      focusable="false"
      className="motion-reduce:group-hover:translate-x-0 ml-auto h-6 w-6 origin-left translate-x-0 self-center justify-self-end opacity-100 transition-all duration-500 will-change-transform group-hover:translate-x-full group-hover:opacity-0"
    >
      <path
        d="M17.707 9.293l-5-5a.999.999 0 10-1.414 1.414L14.586 9H3a1 1 0 100 2h11.586l-3.293 3.293a.999.999 0 101.414 1.414l5-5a.999.999 0 000-1.414z"
        fill="currentColor"
      ></path>
    </svg>
  </a>
</div>

 

실습하기 - 커스텀 셀렉트

  • 커스텀 셀렉터
  • nexui의 Select 컴포넌트를 이용하여
    • 다음 이미지와 같은 셀렉트 컴포넌트를 만드는데
    • 커스텀 색상을 정의한 뒤(codeit_purple: #6500c3)
    • 컴포넌트가 포커스 됐을 때는 테두리가 codeit_purple로 바뀌고
    • 선택창이 열렸을 때는 아래 두 모서리가 직각이 되며
    • chevron 아이콘 애니메이션은 “ease in out” 함수로 애니메이션되고
    • chevron 아이콘 애니메이션 지속 기간은 250ms 가 되도록

정답 코드

import { Select, SelectItem } from "@nextui-org/react";
import React from "react";

type Selectable = {
  key: string;
  label: string;
};

type CustomSelectorProps = {
  items: Selectable[];
  onSelect: (key: string) => void;
  initialItem: Selectable;
};

function CustomSelector(props: CustomSelectorProps) {
  const { items, onSelect, initialItem } = props;
  const [isOpen, setIsOpen] = React.useState(false);

  const triggerRadius = isOpen ? "rounded-t-md rounded-b-none" : "rounded-md";
  const listItemHeight = "min-h-12";

  return (
    <Select
      isOpen={isOpen}
      onOpenChange={() => setIsOpen((prev) => !prev)}
      onSelectionChange={(keys) => {
        const selectedKey = Array.from(keys as Set<React.Key>)[0] as string;
        onSelect(selectedKey);
      }}
      variant="bordered"
      defaultSelectedKeys={[initialItem.key]}
      classNames={{
        base: ['max-w-32'],
        trigger: [
          "border",
          listItemHeight,
          triggerRadius,
          "data-[open=true]:border-codeit_purple",
          "data-[focus=true]:border-codeit_purple",
          "data-[hover=true]:border-codeit_purple",
        ],
        listbox: "p-0",
        selectorIcon: ["!ease-in-out", "!duration-[250ms]"],
      }}
      selectionMode="single"
      disallowEmptySelection
      listboxProps={{
        variant: "light",
      }}
      popoverProps={{
        offset: 0,
        classNames: {
          content: [
            "p-0",
            "border",
            "border-default-200",
            "shadow-none",
            "rounded-b-md rounded-t-none",
          ],
        },
      }}
    >
      {items.map((item) => (
        <SelectItem
          key={item.key}
          classNames={{
            base: ["m-0", "text-neutral-400", listItemHeight],
          }}
          showDivider
          hideSelectedIcon
        >
          {item.label}
        </SelectItem>
      ))}
    </Select>
  );
}

export default CustomSelector;

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'교육 > 코드잇 스프린트 : 단기심화 5기' 카테고리의 다른 글

[ 코드잇 스프린트 ] 교육기간 6일차 TIL  (3) 2024.11.15
[ 코드잇 스프린트 ] 교육기간 5일차 TIL  (1) 2024.11.14
[ 코드잇 스프린트 ] 교육기간 4일차 TIL  (3) 2024.11.13
[ 코드잇 스프린트 ] 교육기간 3일차 TIL  (0) 2024.11.12
[ 코드잇 스프린트 ] 교육기간 1일차 TIL  (1) 2024.11.07
'교육/코드잇 스프린트 : 단기심화 5기' 카테고리의 다른 글
  • [ 코드잇 스프린트 ] 교육기간 5일차 TIL
  • [ 코드잇 스프린트 ] 교육기간 4일차 TIL
  • [ 코드잇 스프린트 ] 교육기간 3일차 TIL
  • [ 코드잇 스프린트 ] 교육기간 1일차 TIL
heee1
heee1
FE 개발자를 희망하는 임희원 입니다.
  • heee1
    heee1.blog
    heee1
  • 전체
    오늘
    어제
    • 분류 전체보기 (69)
      • Front-end (1)
        • Javascript (4)
        • Typescript (1)
        • React (0)
        • Next.js (1)
        • Tool (1)
        • Git (1)
        • Prettier (0)
        • Test-Framework (1)
        • Vercel (1)
      • 교육 (28)
        • 항해99 : 웹개발 종합반 18기 (14)
        • 프로젝트 캠프 : React 2기 (5)
        • 코드잇 스프린트 : 단기심화 5기 (9)
      • Algorithm (29)
        • Javascript (24)
        • Python (5)
      • 코드 보관함 (1)
        • 배치스크립트 ( .bat ) (1)
  • 블로그 메뉴

    • 홈
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    자바스크립트
    speed insights
    css animation
    티스토리챌린지
    next.js
    모킹
    tailwindcss
    항해99
    오블완
    Python
    jest
    JavaScript
    Baekjoon
    코드잇
    til
    테스트 프레임워크
    백준
    node.js
    react-spring
    스프린트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
heee1
[ 코드잇 스프린트 ] 교육기간 2일차 TIL
상단으로

티스토리툴바