เทคนิคทำ Tooltip ด้วย Tailwindcss

23 กุมภาพันธ์ 2564
เทคนิคทำ Tooltip ด้วย Tailwindcss

เวลาเราทำ UI บนเว็บไซต์ เรามักใช้ Icon เพื่อแสดง Action หรือ Status ของรายการที่เราแสดงอยู่ แต่บางครั้งใช้แค่ icon อย่างเดียวอาจไม่สื่อความหมายที่ชัดเจนให้แก่ผู้ใช้งาน บางทีเราก็อยากให้มี tooltip โชว์ขึ้นมาตอนที่ผู้ใช้เอาเมาส์มาวางบน icon ไว้ แต่ tooltip ที่แสดง default จาก browser ก็ไม่ค่อยสวยเท่าไหร่แล้วจัดสไตล์ก็ไม่ได้ด้วย ในบทความนี้เราจะมาแสดงเทคนิค implement tooltip ง่าย ๆ ที่เราปรับไสตล์ให้เข้ากับ theme เว็บไซต์เราได้ ด้วย tailwindcss ให้ดูกัน

โดยปกติแล้วเราสามารถเพิ่ม Tooltip ให้กับ html tag โดยเพิ่ม attributes title แบบนี้

<div title="ดาวน์โหลด">
    <!-- Icon -->
</div>
ตัวอย่าง Tooltip ที่แสดงบน Chrome

ทีนี้ถ้าเราอยากจัดสไตล์ tooltip เป็นของเราเอง เราอาจเริ่มจาก step ดังนี้

<div><!-- Icon --></div>
<div>ดาวน์โหลด</div>  

แน่นอนว่าถ้าเราเพิ่ม div ขึ้นมาอีกอัน ก็จะแสดงข้อความต่อท้าย Icon ของเราอยู่แล้ว

เราสามารถจัดตำแหน่งข้อความ tooltip ของเราได้ โดยสร้าง div ที่มีคลาส relative ขึ้นมาเป็น wrapper คลุม icon และ tooltip ของเรา แล้วใน div ที่เป็น tooltip เพิ่มคลาส absolute เพื่อจัด position และตำแหน่งอ้างอิงกับ div ที่เป็น wrapper

<div class="relative">
    <div><!-- Icon --></div>
    <div class="absolute z-10 top-2/3 left-4">ดาวน์โหลด</div>  
</div>
tooltip แสดงตำแหน่งทับ icon ของเรา

ใช้ tailwindcss คลาส Top / Right / Bottom / Left เพื่อจัดตำแหน่ง tooltip ที่เหมาะกับการใช้งานของเราได้

แน่นอนว่าเราสามารถใช้ css class เพื่อ style tooltip ให้สวยงามแบบที่เราต้องการได้แล้ว เช่น

<div class="relative">
    <div><!-- Icon --></div>
    <div class="... bg-gray-dark text-white rounded px-2 py-1 text-sm whitespace-nowrap">ดาวน์โหลด</div>  
</div>

ถัดมาเราสามารถกำหนดให้ tooltip ซ่อนไว้ก่อน แล้วแสดงเฉพาะเวลาที่เราเอาเมาส์มา hover ที่ wrapper ของเรา โดยเพิ่มคลาส group ที่ wrapper และ group-hover ที่ div tooltip

<div class="group ...">
    <div><!-- Icon --></div>
    <div class="hidden group-hover:block ...">ดาวน์โหลด</div>  
</div>

แต่โดย default แล้ว display utilities ใน tailwind จะมาพร้อมกับ responsive variants เท่านั้น ถ้าเราต้องการใช้ group-hover:block เราต้องเพิ่ม config ใน tailwind.config.js ดังนี้

// tailwind.config.js

module.exports = {
    variants: {
        extend: {
            display: ['group-hover'],
        }
    },
    // config อื่น ๆ
}

HTML และ CSS class ที่เขียนทั้งหมดเป็นตามนี้

<div class="group relative">
    <div><!-- Icon --></div>
    <div 
        class="hidden group-hover:block absolute z-10 top-2/3 left-4 bg-gray-dark text-white rounded px-2 py-1 text-sm whitespace-nowrap">
        ดาวน์โหลด
    </div>
</div>

ด้วย html เพียงเท่านี้เราสามารถได้ tooltip ที่จัดสไตล์และตำแหน่งแบบที่เราต้องการได้

*Bonus - Extract เป็น Component

แต่เพื่อให้เอา code ไปใช้ได้ง่ายขึ้น ใน framework ที่เราใช้เราสามารถ Refactor ไปเป็น component ได้ เช่น ถ้าเราใช้ Laravel อาจแตกไปเป็น blade component ได้แบบนี้

<!-- views/components/tooltip.blade.php -->
@props(['title'])

<div class="group relative">

    {{ $slot }}

    <div
        class="hidden group-hover:block absolute z-10 top-2/3 left-4 bg-gray-dark text-white rounded px-2 py-1 text-sm ">
        {{ $title }}
    </div>
</div>

จากตัวอย่างเราสร้าง blade-X component ขึ้นมาโดยรับ prop ที่ชื่อว่า title เพื่อแสดงเป็น tooltip ของเรา โดย icon หรือปุ่มหรือข้อความที่เราต้องการให้มี tooltip จะเอามาแสดงใน slot

เราสามารถเรียกใช้ component ได้แบบนี้

<x-tooltip title="ดาวน์โหลด">
    <!-- Icon / button / ข้อความ -->
</x-tooltip>

เรียบง่าย Clean Code โค๊ด !!

Phattarachai Chaimongkol
เกี่ยวกับ phattarachai.dev

สวัสดีครับ เป็น Full Stack Web Developer สามารถดูแลงานทั้งระบบได้ ทำงานสายนี้มากว่า 10 ปี ผ่านงานทางภาครัฐ เป็นที่ปรึกษาบริษัทเอกชน มีงาน Web App ทั้งเล็กและใหญ่ ระบบ Inventory, งาน ERP พร้อมใช้ประสบการณ์ที่มีแก้ไขปัญหาธุรกิจให้ลูกค้าครับ

เรื่องล่าสุด

งานพัฒนา Platform Video E-learning
23 กุมภาพันธ์ 2564
งานพัฒนา Platform Video E-learning
รับงาน Web Scrapping อ่านข้อมูลเว็บไซต์ส่งแจ้งเตือน Line Notification
23 กุมภาพันธ์ 2564
รับงาน Web Scrapping อ่านข้อมูลเว็บไซต์ส่งแจ้งเตือน Line Notification
รับงาน ดึงข้อมูลโพสต์ Facebook Group / รูปภาพ / เนื้อหา ลงไฟล์ ส่งเข้า Google Drive
23 กุมภาพันธ์ 2564
รับงาน ดึงข้อมูลโพสต์ Facebook Group / รูปภาพ / เนื้อหา ลงไฟล์ ส่งเข้า Google Drive