코딩&AI프로젝트

네이버 검색창과 유사한 검색 인터페이스를 구현한 TML/CSS/JavaScript 코드

mywarmstory 2024. 12. 6. 20:56

 

위의 코드는 네이버 검색창과 유사한 검색 인터페이스를 구현한 HTML/CSS/JavaScript 코드입니다. 주요 특징과 구조를 단계별로 설명하겠습니다.


1. HTML 구조

(1) 전체 컨테이너

  • <div class="max-w-screen-md mx-auto bg-white shadow-md rounded-lg p-4">
    • 화면 중앙에 배치된 검색 바 영역입니다.
    • 배경색, 그림자 효과, 여백 등이 Tailwind CSS 클래스를 활용하여 지정되었습니다.

(2) 검색창 (Search Bar)

  • 검색창은 flex를 이용해 아이콘, 입력 필드, 음성 아이콘이 한 줄로 정렬되었습니다.
    • Search Icon
      • SVG로 표현된 검색 아이콘이 왼쪽에 위치.
      • text-green-500로 색상이 녹색으로 지정.
    • 검색 입력 필드
      • <input> 태그로 구현.
      • oninput="showSuggestions()" 이벤트를 통해 사용자가 입력 시 추천 검색어를 표시.
    • Mic Icon
      • 음성 입력 아이콘으로, 오른쪽에 위치.
      • text-gray-400 색상을 지정하여 비활성 상태처럼 보이도록 설정.

(3) 추천 검색어 드롭다운

  • <div id="suggestions">로 구성된 추천 검색어 표시 영역.
    • 사용자가 검색어를 입력하면 해당 키워드를 포함하는 추천 검색어를 표시.
    • 기본적으로 hidden 클래스를 사용해 숨겨져 있으며, 입력 이벤트가 발생하면 표시됩니다.

(4) 네비게이션 아이콘

  • 아래쪽에는 네비게이션 아이콘들이 배치되어 있습니다.
    • 메일, 카페, 블로그를 나타내는 버튼으로, 아이콘과 텍스트 설명이 함께 제공됩니다.
    • 그룹(group)에 대해 호버하면 툴팁이 나타납니다.
      • 예: "Mail", "Cafe", "Blog"와 같은 툴팁이 활성화.

2. CSS (Tailwind CSS 활용)

  • Tailwind CSS가 사용되어 클래스를 기반으로 디자인과 스타일을 적용:
    • bg-gray-100, text-gray-700 등으로 색상을 지정.
    • rounded-full로 둥근 모서리를 적용하여 부드러운 UI 제공.
    • hover:scale-110 같은 애니메이션 효과를 통해 사용자 상호작용 시 UI 반응을 추가.

디자인 포인트:

  • absolute, relative를 이용하여 툴팁과 추천 검색어 위치를 적절히 지정.
  • 호버 상태와 같은 상호작용을 쉽게 만들기 위해 group, hover 클래스를 활용.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Search Bar Prototype</title>
  <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 p-4">

  <!-- Search Bar Section -->
  <div class="max-w-screen-md mx-auto bg-white shadow-md rounded-lg p-4">
    <div class="flex items-center border-2 border-green-500 rounded-full p-2 relative">
      <!-- Search Icon -->
      <div class="px-2 text-green-500">
        <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
          <path stroke-linecap="round" stroke-linejoin="round" d="M8 16l-4-4m0 0l4-4m-4 4h16" />
        </svg>
      </div>
      <!-- Search Input -->
      <input 
        type="text" 
        id="searchInput" 
        class="w-full outline-none text-gray-700" 
        placeholder="검색어를 입력해 주세요." 
        oninput="showSuggestions()" 
      />
      <!-- Mic Icon -->
      <div class="px-2 text-gray-400">
        <svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 4v8m0 0V4m0 4H4m8 0h8" />
        </svg>
      </div>
      <!-- Suggestions Dropdown -->
      <div 
        id="suggestions" 
        class="absolute top-12 left-0 bg-white w-full border border-gray-300 rounded-lg shadow-md hidden z-10"
      >
        <ul class="text-gray-700">
          <!-- Suggestions will appear here -->
        </ul>
      </div>
    </div>

    <!-- Navigation Icons -->
    <div class="mt-4 flex justify-around">
      <!-- Icon Set -->
      <div class="text-center group relative">
        <div class="bg-green-500 w-10 h-10 rounded-full mx-auto flex items-center justify-center text-white transform transition-transform hover:scale-110">
          <span>N</span>
        </div>
        <p class="text-sm text-gray-700 mt-2">메일</p>
        <!-- Tooltip -->
        <div class="absolute bottom-12 left-1/2 transform -translate-x-1/2 bg-gray-800 text-white text-xs rounded-lg py-1 px-2 opacity-0 group-hover:opacity-100 transition-opacity">
          Mail
        </div>
      </div>
      <div class="text-center group relative">
        <div class="bg-green-300 w-10 h-10 rounded-full mx-auto flex items-center justify-center text-white transform transition-transform hover:scale-110">
          <span>카</span>
        </div>
        <p class="text-sm text-gray-700 mt-2">카페</p>
        <div class="absolute bottom-12 left-1/2 transform -translate-x-1/2 bg-gray-800 text-white text-xs rounded-lg py-1 px-2 opacity-0 group-hover:opacity-100 transition-opacity">
          Cafe
        </div>
      </div>
      <div class="text-center group relative">
        <div class="bg-green-200 w-10 h-10 rounded-full mx-auto flex items-center justify-center text-white transform transition-transform hover:scale-110">
          <span>블</span>
        </div>
        <p class="text-sm text-gray-700 mt-2">블로그</p>
        <div class="absolute bottom-12 left-1/2 transform -translate-x-1/2 bg-gray-800 text-white text-xs rounded-lg py-1 px-2 opacity-0 group-hover:opacity-100 transition-opacity">
          Blog
        </div>
      </div>
      <!-- Additional icons with similar tooltip and hover effects -->
    </div>
  </div>

  <script>
    // Autofocus search bar on load
    window.onload = () => {
      document.getElementById('searchInput').focus();
    };

    // Example suggestions
    const suggestionsList = ['검색어 예시 1', '검색어 예시 2', '검색어 예시 3'];

    // Show suggestions based on input
    function showSuggestions() {
      const input = document.getElementById('searchInput').value;
      const suggestions = document.getElementById('suggestions');
      const ul = suggestions.querySelector('ul');

      if (input.length > 0) {
        // Filter suggestions
        const filtered = suggestionsList.filter(suggestion => suggestion.includes(input));
        ul.innerHTML = filtered.map(item => `<li class="p-2 hover:bg-gray-100 cursor-pointer">${item}</li>`).join('');
        suggestions.classList.remove('hidden');
      } else {
        suggestions.classList.add('hidden');
      }
    }
  </script>

</body>
</html>

 

3. JavaScript 기능

(1) 검색창 자동 포커스

  • window.onload 이벤트로 페이지 로드 시 검색창에 포커스를 자동으로 설정.

(2) 추천 검색어 표시

  • suggestionsList 배열에 예시 검색어를 포함.
  • 사용자가 검색창에 입력할 때 oninput="showSuggestions()" 이벤트가 발생:
    • 입력 값을 기준으로 filter를 사용해 추천 검색어를 필터링.
    • 필터링된 검색어를 <ul> 내부에 <li>로 추가.
    • 추천 검색어는 기본적으로 숨겨져 있다가 입력값이 있을 때만 표시.

(3) 추천 검색어 드롭다운

  • 사용자가 입력 값을 지우면 추천 검색어 목록이 다시 숨겨짐(classList.add('hidden')).

4. 추가적인 UX 요소

  • 툴팁 애니메이션
    • 네비게이션 아이콘은 group-hover:opacity-100로 툴팁의 투명도를 제어.
  • 반응형 디자인
    • max-w-screen-md, mx-auto 등을 사용해 작은 화면에서도 중앙 정렬이 유지.

5. 개선 및 확장 가능성

  • 실제 API 연결
    • 추천 검색어를 suggestionsList 대신 API로 받아오도록 개선.
  • 음성 입력 기능
    • Mic Icon을 클릭했을 때 음성 인식을 지원하는 이벤트를 추가.
  • 다양한 네비게이션 아이콘
    • 더 많은 서비스와 연결된 아이콘 추가 및 링크 연결.

이 코드는 Tailwind CSS의 강력함과 간단한 JavaScript 기능을 결합하여 현대적이고 반응형 검색 인터페이스를 구현한 예제입니다.

반응형