2025-03-04 15:53:46 +07:00
|
|
|
|
1. โครงสร้างไฟล์หลักและการจัดเก็บรูปภาพ
|
|
|
|
|
|
1.1โฟลเดอร์ app/:
|
|
|
|
|
|
เป็นโครงสร้างพื้นฐานของ Next.js 15
|
|
|
|
|
|
มีไฟล์หลักเช่น layout.tsx, page.tsx, และโฟลเดอร์ย่อยต่าง ๆ
|
|
|
|
|
|
1.2โฟลเดอร์ app/assets/:
|
|
|
|
|
|
เก็บไฟล์รูปภาพทั้งหมด เช่น image.png, image2.png, image3.png, ฯลฯ
|
|
|
|
|
|
แนะนำให้ย้ายไปไว้ใน /public/assets/ เพื่อให้ Next.js สามารถเรียกใช้งานได้สะดวก (ถ้าเป็นการแสดงรูป Static)
|
|
|
|
|
|
1.3โฟลเดอร์ components/:
|
|
|
|
|
|
เก็บคอมโพเนนต์ย่อย ๆ ของโปรเจกต์ เช่น Navbar.tsx, HeroSection.tsx, หรืออื่น ๆ
|
|
|
|
|
|
ในตัวอย่าง เรารวมโค้ดทั้งหมดไว้ในคอมโพเนนต์เดียว (เช่น page.tsx) แต่ในงานจริงอาจแยกแต่ละ Section ออกเป็นไฟล์คอมโพเนนต์ต่างหากเพื่อให้ง่ายต่อการดูแล
|
|
|
|
|
|
|
|
|
|
|
|
2. ขั้นตอนการติดตั้งและรันโปรเจกต์
|
|
|
|
|
|
2.1ติดตั้ง Dependencies
|
|
|
|
|
|
ใช้คำสั่ง npm install หรือ yarn เพื่อให้ได้ package ของ Next.js, React, และ Tailwind CSS
|
|
|
|
|
|
2.2ตั้งค่า Tailwind CSS
|
|
|
|
|
|
เปิดไฟล์ tailwind.config.js (หรือ .ts) แล้วกำหนด content ให้ครอบคลุมทุกไฟล์ที่มีการใช้งาน Tailwind เช่น
|
|
|
|
|
|
content: [
|
|
|
|
|
|
"./app/**/*.{js,ts,jsx,tsx}",
|
|
|
|
|
|
"./components/**/*.{js,ts,jsx,tsx}",
|
|
|
|
|
|
...
|
|
|
|
|
|
]
|
|
|
|
|
|
2.3รันโปรเจกต์
|
|
|
|
|
|
ใช้คำสั่ง npm run dev หรือ yarn dev
|
|
|
|
|
|
เปิดเบราว์เซอร์ที่ http://localhost:3000 เพื่อดูหน้าเว็บ
|
|
|
|
|
|
|
|
|
|
|
|
3. สรุปการทำงานของแต่ละส่วน
|
|
|
|
|
|
โค้ดหลักแบ่งออกเป็นหลาย Section ตามโครงสร้างเว็บ ดังนี้:
|
|
|
|
|
|
|
|
|
|
|
|
3.1Top Announcement Bar
|
|
|
|
|
|
แถบสีเขียวเข้มด้านบน (เช่น #0e3a24)
|
|
|
|
|
|
มีข้อความประกาศ เช่น "SupportNinja is hiring! …" พร้อมลิงก์สมัครงาน
|
|
|
|
|
|
|
|
|
|
|
|
3.2Navbar (Sticky) + Dropdown & Hamburger
|
|
|
|
|
|
ติดด้านบน (sticky top-0)
|
|
|
|
|
|
มีโลโก้ซ้ายมือ, เมนูขวามือ (Desktop), ปุ่ม Get Started
|
|
|
|
|
|
Dropdown Menu: เมื่อ Hover เมนูอย่าง Solutions, Industries, About จะมีเมนูย่อยแสดงขึ้นมา (ใช้ useState แยกแต่ละเมนู)
|
|
|
|
|
|
Hamburger Menu (Mobile): เมื่อจอเล็ก (< md) จะแทนที่เมนูด้วยปุ่ม Hamburger (เปิด/ปิดเมนูด้วย isMobileMenuOpen)
|
|
|
|
|
|
ภายในเมนู Mobile มีปุ่ม Get Started อีกอันด้านล่าง
|
|
|
|
|
|
|
|
|
|
|
|
3.3Hero Section
|
|
|
|
|
|
พื้นหลังสีครีม (เช่น #f7e1d2)
|
|
|
|
|
|
ข้อความสั้น ๆ และหัวข้อใหญ่ เช่น "Outsourcing worth talking about"
|
|
|
|
|
|
มีเส้น <hr> คั่น
|
|
|
|
|
|
|
|
|
|
|
|
3.4Outsourcing Options Section (Checkbox Grid)
|
|
|
|
|
|
ยังใช้พื้นหลังสีครีม (#f7e1d2)
|
|
|
|
|
|
หัวข้อ "Which outsourcing solutions are you looking for?"
|
|
|
|
|
|
มี Grid 6 ช่อง แต่ละช่องมีรูป (เช่น image2.png), ชื่อบริการ, และ Checkbox ที่มุมขวาบน
|
|
|
|
|
|
เมื่อคลิกช่องใด จะสลับสถานะ Checkbox และเปลี่ยนพื้นหลังของช่อง (ใช้ useState ชื่อ selected)
|
|
|
|
|
|
ด้านล่างมีปุ่ม Get Started สีแดง
|
|
|
|
|
|
|
|
|
|
|
|
3.5Section เพิ่มเติม (1 → 6)
|
|
|
|
|
|
แต่ละ Section มีดีไซน์แตกต่างกัน เช่น พื้นหลังสีต่าง ๆ, รูปซ้าย-ข้อความขวา หรือข้อความซ้าย-รูปขวา
|
|
|
|
|
|
Section 1: ใส่ Container สีเทา (#bfc1b9) ข้างใน พร้อมรูป midjourney.png
|
|
|
|
|
|
Section 2, 3, 4, 5: จัดเป็น 2 คอลัมน์ หรือ Grid 3 คอลัมน์ (เช่นบริการต่าง ๆ)
|
|
|
|
|
|
Section 6: "We’re better together. Start building your dream team." พร้อมรูป image8.png ทางขวา, ปุ่ม Get Started สีแดง
|
|
|
|
|
|
|
|
|
|
|
|
3.6Footer
|
|
|
|
|
|
พื้นหลังสีเทาอ่อน (#bfc1b9)
|
|
|
|
|
|
มีโลโก้, คอลัมน์เมนูต่าง ๆ (Solutions, Industries, Resources, Follow, Company)
|
|
|
|
|
|
ปุ่ม Get started สีแดงอยู่ด้านขวา
|
|
|
|
|
|
ด้านล่างมีข้อความลิขสิทธิ์และลิงก์ (Privacy Policy, Security Policy, Terms of Use)
|
|
|
|
|
|
ออกแบบให้ Responsive เมื่อจอเล็กจะเรียงกันเป็นคอลัมน์
|
|
|
|
|
|
|
|
|
|
|
|
4. การใช้ State และฟังก์ชันต่าง ๆ
|
|
|
|
|
|
4.1State สำหรับ Dropdown
|
|
|
|
|
|
isSolutionsOpen, isIndustriesOpen, isAboutOpen: ควบคุมการเปิด/ปิดเมนูย่อยใน Desktop
|
|
|
|
|
|
ทำงานด้วยการ onMouseEnter → setState(true), onMouseLeave → setState(false)
|
|
|
|
|
|
State สำหรับ Mobile Menu
|
|
|
|
|
|
|
|
|
|
|
|
4.2isMobileMenuOpen: เมื่อคลิกปุ่ม Hamburger จะสลับ true/false
|
|
|
|
|
|
ถ้า true จะแสดงเมนูในรูปแบบลิสต์ลงมา
|
|
|
|
|
|
|
|
|
|
|
|
4.3State สำหรับ Checkbox Grid
|
|
|
|
|
|
selected: string[]: เก็บ ID ของ Option ที่ถูกเลือก
|
|
|
|
|
|
ฟังก์ชัน toggleSelection(id: string): เช็คว่า ID นั้นอยู่ใน selected ไหม → ถ้ามีก็ถอดออก, ถ้าไม่มีให้เพิ่มเข้า
|
|
|
|
|
|
|
|
|
|
|
|
4.4โครงสร้างเมนู
|
|
|
|
|
|
ใน Desktop, เมนูหลักจะซ่อนบนจอเล็ก (ใช้ md:flex / hidden)
|
|
|
|
|
|
ใน Mobile, เมนูหลักจะแสดงเมื่อ isMobileMenuOpen === true
|
|
|
|
|
|
|
|
|
|
|
|
5. เคล็ดลับการปรับแต่ง
|
|
|
|
|
|
5.1เปลี่ยนสี / ข้อความ:
|
|
|
|
|
|
ใน Class Tailwind เช่น bg-[#0e3a24], text-[#f7e1d2], สามารถเปลี่ยนเป็นโทนสีอื่น ๆ ได้
|
|
|
|
|
|
ข้อความต่าง ๆ เช่น H1, H2, หรือ Paragraph แก้ได้ตามต้องการ
|
|
|
|
|
|
|
|
|
|
|
|
5.2เปลี่ยนรูปภาพ:
|
|
|
|
|
|
ตรวจสอบว่ารูปอยู่ใน /public/assets/ แล้วเรียกใช้ด้วยเส้นทาง /assets/xxxx.png
|
|
|
|
|
|
ขนาดรูป (width, height) สามารถปรับตามดีไซน์
|
|
|
|
|
|
|
|
|
|
|
|
5.3Responsive เพิ่มเติม:
|
|
|
|
|
|
Tailwind มี breakpoint sm:, md:, lg:, xl: ถ้าต้องการจัด layout หรือขนาดตัวอักษรเฉพาะจอใหญ่/เล็ก
|
|
|
|
|
|
|
|
|
|
|
|
5.4แยกเป็นคอมโพเนนต์:
|
|
|
|
|
|
ถ้าไฟล์ Navbar.tsx ใหญ่มาก สามารถแยกแต่ละ Section ไปเป็นไฟล์คอมโพเนนต์ย่อย แล้ว import มาใช้เพื่อความเป็นระเบียบ
|
|
|
|
|
|
|
|
|
|
|
|
5.5Production Build:
|
|
|
|
|
|
เมื่อพร้อม Deploy, ให้ใช้คำสั่ง npm run build หรือ yarn build
|
|
|
|
|
|
จากนั้น npm run start หรือ yarn start เพื่อรัน Production Mode
|
|
|
|
|
|
|
|
|
|
|
|
6. วิธีนำไปใช้งานจริง
|
|
|
|
|
|
6.1คัดลอกโค้ด นี้ไปใส่ในไฟล์คอมโพเนนต์ เช่น page.tsx (หรือชื่อไฟล์ที่ต้องการ)
|
|
|
|
|
|
6.2รัน npm run dev
|
|
|
|
|
|
6.3เปิด http://localhost:3000
|
|
|
|
|
|
ดูว่า Navbar, Hero, Sections และ Footer แสดงผลครบถ้วนหรือไม่
|
|
|
|
|
|
|
|
|
|
|
|
7. สรุป
|
|
|
|
|
|
1.โค้ดนี้เป็นตัวอย่างหน้าเว็บ Next.js 15 + Tailwind CSS ที่มีฟีเจอร์หลัก:
|
|
|
|
|
|
-Navbar Sticky พร้อม Dropdown (Desktop) และ Hamburger (Mobile)
|
|
|
|
|
|
-Hero Section สีครีม
|
|
|
|
|
|
-Grid Checkbox เลือกบริการต่าง ๆ
|
|
|
|
|
|
-Sections หลายส่วน (ใส่รูป + ข้อความ)
|
|
|
|
|
|
-Footer ที่แบ่งคอลัมน์ลิงก์ และมีปุ่ม Get Started สีแดง
|
|
|
|
|
|
|
|
|
|
|
|
###ขอบคุณครับ :)
|