แต่ง Stepper Component จาก Material UI ให้ตรงใจ Designer 💄

Pitchapa Pawong
THE EXISTING COMPANY
3 min readFeb 26, 2020

ถ้าให้พูดถึง UI Framework ที่เป็นที่นิยมสำหรับคนเขียน React หลาย ๆ คนคงนึกถึง Material UI ใช่มั้ยล่ะคะ?

เจ้าของบล็อกนี้ก็เช่นเดียวกัน เนื่องจากเจ้าตัว Material UI เนี่ยมันทั้งนำไปใช้งานได้ง่าย (ซึ่งเหมาะสำหรับมือใหม่มากๆ และตัวเราเองก็ยังมือใหม่อยู่นะ 😆) มี Components ที่หลากหลาย อีกทั้งยังมีตัวอย่างโค้ดสำหรับการนำไปใช้ได้หลายรูปแบบอีกด้วย

แต่พอมองไปที่หน้า Design จากเหล่า UI Designer แล้วนั้น… ในหัวคือคิดก่อนเลยว่า

“ นุต้องเริ่มสไตล์จากตรงไหนง่ะ 😬 ”

ซึ่งจริง ๆ แล้วหลาย ๆ Component ของตัว Material UI มันไม่ได้สไตล์ยากเลยค่ะ แต่ก็จะมีบางอันที่เราใช้เวลาในการปรับแต่งสไตล์ของมันนานมาก ๆ ก็เลยอยากสรุปวิธีที่ใช้ในการแก้ปัญหานี้นั่นเอง

และหนึ่งใน Component ที่ปรับแต่งค่อนข้างยากก็คื้อออออ … “ Stepper ” จย้าาา

เตรียมพร้อม!

  • ติดตั้งตัว Material UI ลงในตัวโปรเจ็กต์ของตัวเองก่อนเลย โดยใช้คำสั่งนี้
npm install @material-ui/core
  • เข้าไปส่องการใช้งาน Component นั้น ๆ ในเว็บ เพราะฉะนั้นเราจะเข้าไปที่หน้าของ Stepper
  • จากนั้น ลอง ​Copy โค้ดตัวอย่าง มาใส่โปรเจกต์เราดู อย่างเราเลือกโค้ดนี้มาลองใส่

จะได้ผลลัพธ์ออกมาเป็นแบบนี้…

Stepper Component ก่อนนำมาแต่งสไตล์
  • เทียบกับตัวงานดีไซน์ที่ได้มาจาก UI Designer ว่าต้องแก้อะไรบ้าง
Design ตัว Stepper เมื่อ Step ที่ 2 เป็น Active Step

จากค่า default ที่ตัว Material ให้มา เราต้องเปลี่ยนสไตล์ของมันดังนี้

  1. สีและขอบของแต่ละ Step
  2. สีของตัว Connector ที่อยู่ระหว่างแต่ละ Step
  3. ฟ้อนต์ด้านในแต่ละ ​Step
  4. ขนาดต่าง ๆ
  5. เปลี่ยนจากแนวนอนให้เป็นแนวตั้ง
  6. นำคำอธิบายแต่ละ Step ออก
  7. เมื่อเปลี่ยน Step แล้ว Step ตัวที่ผ่านไปแล้วจะยังเป็นตัวเลขเหมือนเดิม ไม่เปลี่ยนเป็นเครื่องหมายถูก

(แต่จะทำตัวอย่างแค่ 3 Steps น้า)

  • ทำความเข้าใจว่าแต่ละ Component ย่อย ๆ ที่จะประกอบกันเป็น Stepper ได้สมบูรณ์นั้นมีอะไรบ้าง รวมถึงอ่าน API Documentation ของแต่ละอัน จะได้รู้ว่าจะต้องปรับแต่งตรงไหนบ้างนั่นเอง เย่ 😆
<Stepper> : Component นอกสุดที่ใช้ครอบ Component ย่อย ๆ อื่นที่รวมกันขึ้นมาเป็น  Stepper หนึ่งอันที่รวมทุก ๆ Step<Step> : Component ของแต่ละ Step โดยมี StepLabel เป็น Component ย่อย<StepLabel> : Component ย่อยสุดของแต่ละ Step และเรามักจะปรับแต่งสไตล์ที่ Component นี้<StepConnector> : Component ของตัว Connector ที่เชื่อมแต่ละ Step

มาแต่งกัน!

เคล็ดไม่ลับ -> ลองเข้าไปแก้ไข Code ใน Codesandbox ที่เป็นตัวอย่าง Customized Stepper Component ก่อนก็ได้นะ (https://codesandbox.io/s/cz6q9)

  1. เปลี่ยนให้ Stepper จากแนวนอนเป็นแนวตั้ง โดยใส่ orientation=“vertical” เข้าไปที่แท็กของ Stepper
<Stepper alternativeLabel activeStep={activeStep} orientation=”vertical” > 
...
</Stepper>

2. นำคำอธิบายแต่ละ Step ออก โดยลบ alternativeLabel ออกจากแท็ก Stepper และลบค่า {label} ในแท็ก ​StepLabel ออก

<Stepper activeStep={activeStep} orientation=”vertical”>              {steps.map(label => (          
<Step key={label}>
<StepLabel></StepLabel>
</Step>))}
</Stepper>

3. สร้างสไตล์ของแต่ละ Step เพื่อเปลี่ยนสี ฟ้อนต์ ขอบ และขนาดแต่ละ Step

4. ทำให้แต่ละ Step เมื่อ Step นั้น Completed ไปแล้วยังคงเป็นเลข 1,2, … เหมือนเดิม โดยไม่เปลี่ยนเป็นเครื่องหมายถูก

ไหนขอดูผลลัพธ์หน่อยซิ….

(Step ที่ 2 เป็น Active Step)

จะเห็นว่า ตัว Step ที่มีการเพิ่มขอบขึ้นมาทำให้ไม่อยู่กึ่งกลาง แต่เราต้องไปแก้ตรงไหนนะ … ตามหลักทั่วไปก็ต้องลอง Inspect มาดูไงล่ะ

พอ Inspect มาดูก็เห็นว่าเราควรเพิ่มสไตล์ที่ .MuiStepper-vertical และ .MuiStepLabel-iconContainer ให้มีค่าเป็น

.MuiStepper-vertical {  
flex-direction: column;
align-items: center;
}
.MuiStepLabel-iconContainer {
padding: 0;
}

ซึ่งตัวช่วยที่ดีที่สุดในการเข้าไปแก้ไขค่าที่นึกได้ก็คือ Styled Components นั่นเอง

ติดตั้งด้วยนะจ๊ะ 👇🏼

npm install --save styled-components

5. ปรับให้ Step อยู่กึ่งกลางด้วย Styled Components แล้วชื่อตัวแปรที่ผ่านการสไตล์แล้วไปใส่แทนชื่อแท็กเดิม

ดูผลลัพธ์อีกครั้ง…

อยู่ตรงกลางแล้วววววว… ไปแต่ง Step Connector ต่อเลย!

6. นำ StepConnector มาแต่งโดย

active : สไตล์ของตัว connector เมื่อ Step ถัดจาก Step นั้นเป็น Active Step

completed : สไตล์ของตัว connector ของ Step ที่ผ่านมาก่อน Active Step

line : สไตล์ของตัว connector ที่ยังไม่เป็น Active Step

และเมื่อกำหนดค่า css แล้วให้นำตัวแปรนั้นมาใส่ในแท็ก Stepper ดังนี้ 👇🏼

ดูผลลัพธ์หน่อยยย

ตัว Connector ยังไม่อยู่ตรงกึ่งกลางเลย 🤔 ก็ใช้ Styled Components ช่วยเหมือนเดิมสิ!

7. แก้ไขสไตล์ตัว .MuiStepConnector ให้ padding และ margin เป็น 0 แล้วนำตัวแปรไปใส่ใน Stepper (เหมือนเดิมเลยเนอะ 😅)

ทีนี้มาดูผลลัพธ์อันน่าพึงพอใจของเรากันนนนนนน !

สรุปสักหน่อย

ทั้งหมดนี้เป็นวิธีที่เราใช้เพื่อจัดการกับตัว Stepper Component ในความเข้าใจที่มีจากการอ่านโค้ดตัวอย่างและลองปรับนู่นนี่มาพอสมควร ก็หวังว่าจะเป็นสักหนึ่งแนวทางที่เป็นประโยชน์ไม่มากก็น้อยนะคะ 😄

--

--