วิธีสร้างแอปพลิเคชัน Front-End ที่สามารถเข้าถึงได้ด้วย Chakra UI และ Nuxt.js
เผยแพร่แล้ว: 2022-03-10สำหรับคนจำนวนมาก เว็บเป็นส่วนสำคัญในชีวิตประจำวันของพวกเขา พวกเขาใช้มันในที่ทำงาน ที่บ้าน และแม้กระทั่งบนท้องถนน การเข้าถึงเว็บหมายความว่าผู้ทุพพลภาพสามารถใช้เว็บได้อย่างเท่าเทียมกัน ดังนั้นจึงเป็นเรื่องสำคัญสำหรับนักพัฒนาและองค์กรที่สร้างเว็บเพื่อสร้างความครอบคลุมและการเข้าถึงในแอปพลิเคชันของตน
เพื่อให้เข้าถึงเว็บได้มากขึ้น มีแนวทางปฏิบัติและมาตรฐานที่ดีที่สุดสองสามข้อที่คุณจะต้องนำไปใช้ในแอปพลิเคชันของคุณ เช่น การปฏิบัติตามข้อกำหนดต่อไปนี้:
- มาตรา 508;
- พระราชบัญญัติเทคโนโลยีอำนวยความสะดวก
- พระราชบัญญัติชาวอเมริกันที่มีความพิการ (ADA);
- WCAG 2.0 (แนวทาง A & AA);
- แนวทางการเข้าถึงของ BBC Mobile;
- WAI-ARIA ( W eb A ความสามารถ ใน การ เข้าถึง I nitiative– แนวทางปฏิบัติ R ich I อินเทอร์เน็ต A ที่เข้าถึงได้)
การเรียนรู้ที่จะใช้มาตรฐานเหล่านี้อาจดูเหมือนเป็นงานที่น่ากลัวเมื่อคุณคำนึงถึงกำหนดเวลาของโครงการและข้อจำกัดอื่นๆ ที่คุณต้องทำงานด้วยในฐานะนักพัฒนา ด้วยเหตุนี้ ให้ฉันแนะนำคุณเกี่ยวกับระบบการออกแบบ UI ที่สร้างขึ้นเพื่อช่วยให้คุณเข้าถึงแอปพลิเคชันเว็บของคุณได้
Chakra UI
Chakra UI เป็นระบบการออกแบบและเฟรมเวิร์ก UI ที่สร้างโดย Segun Adebayo สร้างขึ้นโดยคำนึงถึงความเรียบง่าย ความเป็นโมดูล ความสามารถในการทำงานร่วมกันได้ และความสามารถในการเข้าถึง Chakra UI ให้หน่วยการสร้างทั้งหมดที่จำเป็นในการสร้างแอปพลิเคชันส่วนหน้าสามารถเข้าถึงได้
หมายเหตุ : ในขณะที่ Chakra UI ขึ้นอยู่กับ CSS-in-JS ภายใต้ประทุน คุณไม่จำเป็นต้องรู้เพื่อที่จะใช้ไลบรารี
แม้ว่ากรอบงานเดิมจะถูกสร้างขึ้นสำหรับ React แต่ Jonathan Bakebwa ก็เป็นหัวหอกในการพอร์ตไปยัง Vue ดังนั้นนักพัฒนา Vuejs/NuxtJS จึงสามารถใช้ Chakra UI เพื่อสร้างเว็บแอปพลิเคชันที่สามารถเข้าถึงได้
คุณสมบัติของจักร UI
Chakra UI ถูกสร้างขึ้นโดยคำนึงถึงหลักการดังต่อไปนี้:
- อุปกรณ์ประกอบฉากสไตล์
Chakra UI ทำให้สามารถจัดรูปแบบองค์ประกอบหรือแทนที่สไตล์โดยใช้อุปกรณ์ประกอบฉาก ซึ่งช่วยลดความจำเป็นในการใช้สไตล์ชีตหรือสไตล์อินไลน์ Chakra UI บรรลุความยืดหยุ่นในระดับนี้โดยใช้ Styled Systems ภายใต้ประทุน - องค์ประกอบ
ส่วนประกอบใน Chakra UI ถูกแบ่งออกเป็นส่วนเล็กๆ โดยมีอุปกรณ์ประกอบฉากน้อยที่สุดเพื่อลดความซับซ้อนและประกอบเข้าด้วยกัน เพื่อให้แน่ใจว่ารูปแบบและการใช้งานจะยืดหยุ่นและขยายได้ ตัวอย่างเช่น คุณสามารถใช้ส่วนประกอบCBox
และCPseudoBox
เพื่อสร้างส่วนประกอบใหม่ - สามารถเข้าถึงได้
ส่วนประกอบ Chakra UI เป็นไปตามข้อกำหนดหลักเกณฑ์ของ WAI-ARIA และมีแอตทริบิวต์ aria-* ที่ถูกต้อง คุณยังสามารถค้นหารายงานการช่วยสำหรับการเข้าถึงของส่วนประกอบที่สร้างแต่ละรายการในไฟล์ชื่อaccessibility.md
ดูรายงานการช่วยสำหรับการเข้าถึงสำหรับคอมโพเนนต์CAccordion
- ธีมได้
Chakra UI ช่วยให้คุณสามารถอ้างอิงค่าจากธีมของคุณได้อย่างง่ายดายตลอดทั้งแอปพลิเคชันของคุณบนส่วนประกอบใด ๆ - รองรับโหมดมืด
ส่วนประกอบส่วนใหญ่ใน Chakra UI เป็นโหมดมืดที่เข้ากันได้ตั้งแต่แกะกล่อง
Chakra UI รองรับการช่วยสำหรับการเข้าถึงอย่างไร
หลักการสำคัญประการหนึ่งเบื้องหลังการสร้าง Chakra UI คือการ เข้าถึงได้ ด้วยเหตุนี้ ส่วนประกอบทั้งหมดใน Chakra UI จึงมาพร้อมการสนับสนุนสำหรับการเข้าถึงโดยให้:
- การนำทางด้วยแป้นพิมพ์ — มีประโยชน์สำหรับผู้ใช้ที่มีความบกพร่องทางการเคลื่อนไหว
- การจัดการโฟกัส
- คุณลักษณะ aria-* ที่จำเป็นสำหรับโปรแกรมอ่านหน้าจอ
- การดักจับโฟกัสและการกู้คืนสำหรับกล่องโต้ตอบโมดอล
เริ่มต้นใช้งาน Chakra UI และ Nuxt
หมายเหตุ : หากต้องการใช้ Chakra UI กับ Vue.js โปรดดูคู่มือการเริ่มต้นใช้งาน
สำหรับโครงการสาธิตของเรา เราจะสร้าง Chakra-ui explorer ซึ่งเป็นเว็บแอปพลิเคชันหน้าเดียวที่เข้าถึงได้เพื่อค้นหาส่วนประกอบ Chakra UI
- ดูโปรเจ็กต์สดบน Netlify →
เริ่มต้นใช้งาน Chakra-ui Explorer
สมมติว่าคุณติดตั้ง NPM แล้ว ให้สร้างแอปพลิเคชัน Nuxt ใหม่โดยเรียกใช้:
$ npx create-nuxt-app chakra-ui-explorer
หรือถ้าคุณชอบเส้นด้ายก็เรียกใช้:
$ yarn create nuxt-app chakra-ui-explorer
ทำตามข้อความแจ้งการติดตั้งเพื่อสร้างแอปพลิเคชัน Nuxt ให้เสร็จสิ้น
การตั้งค่า Chakra UI
Chakra UI ใช้อารมณ์ในการจัดการรูปแบบองค์ประกอบ ดังนั้นเพื่อเริ่มต้นใช้งาน Chakra UI คุณจะต้องติดตั้ง Chakra UI ควบคู่ไปกับ Emotion เพื่อเป็นการพึ่งพาเพื่อน สำหรับโครงการนี้ เราจะใช้โมดูล Nuxt อย่างเป็นทางการสำหรับทั้ง Chakra UI และ Emotion ซึ่งจะช่วยลดแรงเสียดทานในการเริ่มต้นใช้งาน Chakra UI มาเพิ่มลงในโครงการของเราโดยรันคำสั่งต่อไปนี้:
npm i @chakra-ui/nuxt @nuxtjs/emotion
หมายเหตุ : @nuxtjs/emotion
อนุญาตให้สร้างและฉีดสไตล์คอมโพเนนต์ของคุณในบิลด์เซิร์ฟเวอร์
หลังจากติดตั้งทั้งสองโมดูล คุณจะต้องลงทะเบียนในไฟล์ nuxt.config.js
ภายใต้ตัวเลือกอาร์เรย์ของโมดูล:
// nuxt.config.js modules: ['@chakra-ui/nuxt', '@nuxtjs/emotion'],
เพื่อให้ขั้นตอนการตั้งค่า Chakra UI เสร็จสมบูรณ์ เราจำเป็นต้องแตะองค์ประกอบเค้าโครงเริ่มต้นของเราในเลย์เอาต์ layouts/
และเพิ่ม CThemeProvider
, CColorModeProvider
และ CReset
จาก Chakra UI
ขอแนะนำให้คุณใช้ส่วนประกอบ CReset
เพื่อให้แน่ใจว่าส่วนประกอบทั้งหมดที่ให้โดย Chakra UI ทำงานอย่างถูกต้อง
คอมโพเนนต์ CThemeProvider
จะทำให้ธีมของคุณพร้อมใช้งานในทุกส่วนของแอปพลิเคชัน ในขณะที่คอมโพเนนต์ CColorModeProvider
มีหน้าที่จัดการโหมดสีของแอปพลิเคชันของเรา ซึ่งอาจอยู่ในสถานะใดสถานะหนึ่งจากสองสถานะ: สว่างหรือมืด สุดท้าย คอมโพเนนต์ CReset
จะลบสไตล์เริ่มต้นของเบราว์เซอร์ทั้งหมด
มาเพิ่มส่วนประกอบดังกล่าวใน layouts/default.vue
ในส่วนเทมเพลตของเรา ให้เพิ่มสิ่งนี้:
<!-- layouts/default.vue --> <template> <div class="container"> <c-theme-provider> <c-color-mode-provider> <c-box as="section"> <c-reset /> <nuxt /> </c-box> </c-color-mode-provider> </c-theme-provider> </div> </template>
จากนั้นในส่วนสคริปต์ของเรา เราจะนำเข้าและลงทะเบียนส่วนประกอบดังนี้:
<script> import { CThemeProvider, CColorModeProvider, CReset, CBox } from '@chakra-ui/vue' export default { name: 'DefaultLayout', components: { CThemeProvider, CColorModeProvider, CReset, CBox } } </script>
องค์ประกอบโครงร่าง default.vue
ของคุณควรมีลักษณะดังนี้:
<template> <div class="container"> <c-theme-provider> <c-color-mode-provider> <c-box as="section"> <c-reset /> <nuxt /> </c-box> </c-color-mode-provider> </c-theme-provider> </div> </template> <script> import { CThemeProvider, CColorModeProvider, CReset, CBox } from '@chakra-ui/vue' export default { name: 'DefaultLayout', components: { CThemeProvider, CColorModeProvider, CReset, CBox } } </script>
หมายเหตุ : สังเกตว่าฉันกำลังรวมส่วนประกอบ <c-reset />
และ <nuxt />
ไว้ในส่วนประกอบ c-box
การตั้งค่าธีมแอปพลิเคชันของคุณ
Chakra UI ช่วยให้คุณสามารถกำหนดธีมสำหรับแอปพลิเคชันของคุณได้ ตาม "ธีม" ฉันหมายถึงการตั้งค่าจานสีของแอปพลิเคชันของคุณ มาตราส่วนประเภท กองแบบอักษร เบรกพอยต์ ค่ารัศมีขอบ และอื่นๆ เนื่องจากสีและคอนทราสต์เป็นองค์ประกอบสำคัญของการช่วยสำหรับการเข้าถึง จึงเป็นสิ่งสำคัญที่จะใช้สีที่มองเห็นได้ง่าย
Chakra UI ที่พร้อมใช้งานทันทีมาพร้อมกับออบเจ็กต์ธีมเริ่มต้นที่ตอบสนองความต้องการส่วนใหญ่ของแอปพลิเคชันของคุณในแง่ของสี แบบอักษร และอื่นๆ ธีมเริ่มต้นถูกตั้งค่าโดยคำนึงถึงคอนทราสต์ ซึ่งช่วยให้สลับโหมดสีได้อย่างง่ายดาย (เพิ่มเติมในภายหลัง)
Chakra UI ช่วยให้คุณสามารถขยายหรือแทนที่ธีมเริ่มต้นได้อย่างสมบูรณ์ สิ่งนี้เป็นไปได้โดยการยอมรับอ็อบเจ็กต์ของธีมตามข้อกำหนดของธีมของระบบที่มีสไตล์
ค่าในอ็อบเจ็กต์ธีมจะพร้อมใช้งานในแอปพลิเคชันของคุณโดยอัตโนมัติ ตัวอย่างเช่น สีที่ระบุใน theme.colors
สามารถอ้างอิงได้จาก color
, borderColor
, backgroundColor
, การ fill
, stroke
, และอุปกรณ์ style
ในส่วนประกอบของคุณ
ในการปรับแต่งแอปพลิเคชันของคุณให้เป็นส่วนตัว คุณสามารถแทนที่ธีมเริ่มต้นที่ Chakra UI ให้มา หรือตั้งค่าใหม่ในนั้น ในการทำเช่นนั้น โมดูล Chakra UI Nuxt จะแสดงออบเจกต์ chakra
ซึ่งจะรับคุณสมบัติ extendTheme
ซึ่งรับออบเจกต์ ออบเจ็กต์ที่กำหนดให้ extendTheme
จะถูกรวมซ้ำกับอ็อบเจกต์ธีมเริ่มต้นของ Chakra UI มาเพิ่มจานสีของแบรนด์ของเราให้กับ Chakra เพื่อให้เราสามารถนำไปใช้ในแอปพลิเคชันของเรา
หมายเหตุ : Chakra UI แนะนำให้เพิ่มจานสีลงในวัตถุสีของธีมของคุณโดยใช้คีย์ตั้งแต่ 50 ถึง 900 คุณสามารถใช้เครื่องมือเว็บเช่น coolors และ palx เพื่อสร้างจานสีเหล่านี้
สำหรับโฮมเพจสาธิตของเรา ฉันจะใช้สีไลม์ยี่ห้อ เพื่อให้ Chakra UI รับรู้สีนี้ ฉันจะสร้างออบเจ็กต์ customeTheme
ในโฟลเดอร์ชื่อ chakra
(คุณสามารถเรียกมันว่าอะไรก็ได้ที่คุณต้องการ) ในรูทของไดเรกทอรีของโปรเจ็กต์ของฉัน ในวัตถุนี้ ฉันจะกำหนดจานสีของแบรนด์ของเรา
สร้างไฟล์ชื่อ theme.js
ในโฟลเดอร์ที่คุณสร้าง แล้วเพิ่มข้อมูลโค้ดต่อไปนี้:
// ./chakra/theme.js const customTheme = { colors: { brand: { 50: '#f6fcee', 100: '#e2f4c8', 200: '#cbec9e', 300: '#b2e26e', 400: '#94d736', 500: '#75c800', 600: '#68b300', 700: '#599900', 800: '#477900', 900: '#294700' } } } module.exports = customTheme
ตอนนี้ขอรวมธีมที่กำหนดเองของเราเข้ากับ Chakra UI เราทำเช่นนั้นใน nuxt.config.js
อันดับแรก เราต้องการออบเจ็กต์ธีมที่กำหนดเองของเรา:
import customTheme from './chakra/theme'
ต่อไป เราต้องระบุคีย์ chakra
ที่จัดเตรียมโดยโมดูล Chakra UI Nuxt และส่งผ่านใน customTheme
ไปยังคุณสมบัติ extendTheme
:
chakra: { extendTheme: customTheme },
ไฟล์ nuxt.config.js
ของคุณควรมีลักษณะดังนี้:
// nuxt.config.js import customTheme from './chakra/theme' export default { mode: 'spa', /* * Headers of the page */ head: { title: process.env.npm_package_name || '', meta: [ { charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, { hid: 'description', name: 'description', content: process.env.npm_package_description || '' } ], link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }] }, /* * Customize the progress-bar color */ loading: { color: '#fff' }, /* * Global CSS */ css: [], /* * Plugins to load before mounting the App */ plugins: [], /* * Nuxt.js dev-modules */ buildModules: [ // Doc: https://github.com/nuxt-community/eslint-module '@nuxtjs/eslint-module' ], /* * Nuxt.js modules */ modules: [ '@chakra-ui/nuxt', '@nuxtjs/emotion' ], chakra: { extendTheme: customTheme }, /* * Build configuration */ build: { /* * You can extend webpack config here */ extend (config, ctx) {} } }
เมื่อคุณเรียกใช้แอปพลิเคชันด้วย npm run dev
หน้าแรกของคุณควรมีลักษณะดังนี้:
ตอนนี้เราได้ติดตั้ง Chakra UI และเพิ่มธีมที่กำหนดเองของแอปพลิเคชันเรียบร้อยแล้ว มาเริ่มสร้าง Chakra-ui explorer กันเลย
การสร้างการนำทางหลักของเรา
เราต้องการให้การนำทางของเรามีชื่อแบรนด์ของเรา ในกรณีนี้ จะเป็น Chakra-ui explorer , ลิงก์การนำทาง 2 ลิงก์: Documentation and Repo และปุ่มที่รับผิดชอบในการสลับโหมดสีของเรา มาสร้างส่วนประกอบใหม่ภายใต้ไดเร็กทอรี components
ที่เรียกว่า NavBar
ซึ่งเราจะสร้างการนำทางหลักของแอปพลิเคชันของเราโดยใช้ Chakra UI
ลงมือทำกันเถอะ. เพิ่มตัวอย่างต่อไปนี้ใน NavBar.vue
:
<template> <c-box as="nav" h="60px" px="4" d="flex" align-items="center" shadow="sm" > <c-link as="nuxt-link" to="/" color="brand.700" font-weight="bold" :_hover="{ color: 'brand.900' }" > Chakra-ui Explorer </c-link> <c-box as="ul" color="gray.500" d="flex" align-items="center" list-style-type="none" ml="auto" > <c-box as="li" mr="8"> <c-link color="gray.500" :_hover="{ color: 'brand.400' }" is-external href="https://vue.chakra-ui.com" > Documentation </c-link> </c-box> <c-box as="li" mr="8"> <c-link color="gray.500" :_hover="{ color: 'brand.400' }" is-external href="https://github.com/chakra-ui/chakra-ui-vue" > Repo </c-link> </c-box> <c-box as="li"> <c-icon-button variant="ghost" variant-color="gray[900]" aria-label="Switch to dark mode" icon="moon" /> </c-box> </c-box> </c-box> </template> <script> import { CBox, CLink, CIconButton } from '@chakra-ui/vue' export default { name: 'NavBar', components: { CBox, CLink, CIconButton } } </script>
ต่อไป เราต้องนำเข้าส่วนประกอบนี้ในองค์ประกอบเค้าโครงเริ่มต้นของเรา — default.vue
และเพิ่มลงในแม่แบบของเรา ดังนั้นเค้าโครงเริ่มต้นโดยรวมของเราควรมีลักษณะดังนี้:
<template> <div class="container"> <c-theme-provider> <c-color-mode-provider> <c-box as="section"> <c-reset /> <nav-bar /> <nuxt /> </c-box> </c-color-mode-provider> </c-theme-provider> </div> </template> <script> import { CThemeProvider, CColorModeProvider, CReset, CBox } from '@chakra-ui/vue' import NavBar from '@/components/NavBar' export default { name: 'DefaultLayout', components: { CThemeProvider, CColorModeProvider, CReset, CBox, NavBar } } </script>
เมื่อคุณเรียกใช้แอปพลิเคชันของคุณตอนนี้ คุณจะเห็นสิ่งนี้:
คุณจะเห็นว่าระบบนำทางสามารถเข้าถึงได้โดยไม่ต้องระบุ สิ่งนี้สามารถเห็นได้เมื่อคุณกดปุ่ม Tab บนแป้นพิมพ์เท่านั้น Chakra UI จัดการโฟกัสในขณะที่คุณสามารถมุ่งเน้นไปที่แต่ละลิงก์ในเมนูการนำทาง
as
Prop
จากข้อมูลโค้ดของ NavBar.vue
ด้านบน คุณจะสังเกตเห็น as
อุปกรณ์ประกอบฉาก นี่เป็นคุณสมบัติที่มีให้สำหรับส่วนประกอบ Chakra UI ที่ให้คุณส่งแท็ก HTML หรือส่วนประกอบอื่นที่จะแสดงเป็นแท็กพื้นฐานของส่วนประกอบพร้อมกับสไตล์และอุปกรณ์ประกอบทั้งหมด เมื่อเราทำ:
<c-box as="li"> <c-icon-button variant="ghost" variant-color="gray[900]" aria-label="Switch to dark mode" icon="moon" /> </c-box>
เรากำลังขอให้ Chakra UI แสดงองค์ประกอบ <li>
และวางองค์ประกอบปุ่มไว้ข้างใน คุณยังสามารถเห็นเราใช้รูปแบบนั้นที่นี่:
<c-link as="nuxt-link" to="/" color="brand.700" font-weight="bold" :_hover="{ color : 'brand.900' }"> ChakraMart </c-link>
ในกรณีข้างต้น เราขอให้ Chakra UI แสดงคอมโพเนนต์ <nuxt-link /> ของ Nuxt
as
prop ให้อำนาจแก่คุณในการใช้องค์ประกอบที่ถูก (หรือผิด) สำหรับบริบทของมาร์กอัปของคุณ สิ่งนี้หมายความว่า คุณสามารถใช้ประโยชน์จากมันเพื่อสร้างเทมเพลตแอปพลิเคชันของคุณโดยใช้มาร์กอัปเชิงความหมาย ซึ่งจะทำให้แอปพลิเคชันของคุณมีความหมายต่อโปรแกรมอ่านหน้าจอมากขึ้น ดังนั้น แทนที่จะใช้องค์ประกอบ div
ทั่วไปสำหรับเนื้อหาหลักของแอปพลิเคชันของคุณ ด้วย as
prop คุณสามารถแสดงองค์ประกอบ main
เพื่อบอกโปรแกรมอ่านหน้าจอว่านี่คือเนื้อหาหลักของแอปพลิเคชันของคุณ
หมายเหตุ : ตรวจสอบเอกสารประกอบสำหรับอุปกรณ์ประกอบฉากทั้งหมดที่เปิดเผยโดยส่วนประกอบ Chakra UI นอกจากนี้ ให้พิจารณาอย่างละเอียดยิ่งขึ้นถึงวิธีการระบุสีของแบรนด์ใน chakra/theme.js
คุณสามารถดูได้จากตัวอย่างด้านบนว่าเรากำลังใช้เป็นสีใดๆ ที่ Chakra UI มีให้ อีกสิ่งหนึ่งที่ต้องระวังคือไอคอนรูป moon
ที่เราใช้สำหรับ CIconButton
บน NavBar ของเรา ไอคอน moon
เป็นหนึ่งในไอคอนเริ่มต้นที่ Chakra UI จัดเตรียมไว้ให้
โหมดสี
คุณลักษณะหนึ่งของ Chakra UI คือการรองรับโหมดสี และคุณสามารถบอกได้จากการใช้ไอคอน moon
ในการนำทางของนักสำรวจ Chakra-ui เราวางแผนที่จะผสานรวมโหมดมืด ดังนั้น แทนที่จะปล่อยให้มันเป็นครั้งสุดท้าย เรามาทำให้มันจบๆ ไปกันเถอะ เมื่อต้องการทำเช่นนี้ CColorModeProvider
โดยใช้ฟังก์ชันให้/ฉีดของ Vue ให้ฟังก์ชัน $chakraColorMode
และ $toggleColorMode
$chakraColorMode
คืนค่าโหมดสีปัจจุบันของแอปพลิเคชันของคุณในขณะที่ $toggleColorMode
สลับโหมดสีจาก light
เป็น dark
และในทางกลับกัน ในการใช้สองฟังก์ชันนี้ เราจำเป็นต้องใส่ฟังก์ชันลงในคอมโพเนนต์ NavBar.vue
ลองทำด้านล่างในส่วน <script />
:
<script> <script> import { CBox, CLink, CIconButton } from '@chakra-ui/vue' export default { name: 'NavBar', inject: ['$chakraColorMode', '$toggleColorMode'], components: { CBox, CLink, CIconButton }, } </script>
มาสร้างคุณสมบัติที่คำนวณเพื่อคืนค่าโหมดสี:
... computed: { colorMode () { return this.$chakraColorMode() } }
ตอนนี้เราได้เพิ่มฟังก์ชันทั้งสองใน NavBar.vue
เรามาปรับเปลี่ยนปุ่มโหมดสลับสีกัน เราจะเริ่มต้นด้วยไอคอนเพื่อให้แสดงไอคอนที่แตกต่างกันขึ้นอยู่กับโหมดสี ส่วนประกอบ CIconButton
ของเราตอนนี้มีลักษณะดังนี้:
<c-icon-button variant="ghost" variant-color="gray[900]" aria-label="Switch to dark mode" :icon="colorMode == 'light' ? 'moon' : 'sun'" />
ขณะนี้ เรากำลังใช้แอตทริบิวต์ aria-label
เพื่อบอกให้โปรแกรมอ่านหน้าจอเปลี่ยนเป็นโหมดมืด มาปรับเปลี่ยนสิ่งนี้เพื่อรองรับทั้งโหมดสว่างและมืด:
<c-icon-button variant="ghost" variant-color="gray[900]" :aria-label="`Switch to ${colorMode == 'light' ? 'dark : 'light'} mode`" :icon="colorMode == 'light' ? 'moon' : 'sun'" />
สุดท้าย เราจะเพิ่มตัวจัดการเหตุการณ์การคลิกบนปุ่มเพื่อสลับโหมดสีของแอปพลิเคชันของเราโดยใช้ฟังก์ชัน $toggleColorMode
ชอบดังนั้น:
<c-icon-button variant="ghost" variant-color="gray[900]" :aria-label="`Switch to ${colorMode == 'light' ? 'dark' : 'light'} mode`" :icon="colorMode == 'light' ? 'moon' : 'sun'" @click="$toggleColorMode" />
เพื่อทดสอบว่าการตั้งค่าโหมดสีของเราใช้งานได้หรือไม่ ฉันจะเพิ่มการประมาณค่าของโหมดสีและข้อความถัดจาก CIconButton
เพื่อสลับโหมดสีของเรา ชอบดังนั้น:
<c-box as="li"> <c-icon-button variant="ghost" variant-color="gray[900]" :aria-label="`Switch to ${colorMode == 'light' ? 'dark' : 'light'} mode`" :icon="colorMode == 'light' ? 'moon' : 'sun'" @click="$toggleColorMode" /> Current mode: {{ colorMode }} </c-box>
นี่คือลักษณะที่แอพของเราในปัจจุบัน:
ดังนั้นเราจึงดำเนินการอย่างหนักในการตั้งค่าโหมดสีใน Chakra UI ตอนนี้เราสามารถจัดรูปแบบแอปพลิเคชันของเราตามโหมดสีได้ ไปที่ default.vue
และใช้โหมดสี prop slot prop ที่ CColorModeProvider
จัดเตรียมไว้ให้เพื่อจัดรูปแบบแอปพลิเคชันของเรา มาแก้ไขเทมเพลตของเราก่อนใน default.vue
<template> <div class="container"> <c-theme-provider> <c-color-mode-provider #default="{ colorMode }"> <c-box v-bind="mainStyles[colorMode]" w="100vw" h="100vh" as="section" > <c-reset /> <nav-bar /> <nuxt /> </c-box> </c-color-mode-provider> </c-theme-provider> </div> </template>
เรากำลังทำลาย colorMode
จากคุณสมบัติ slot props ที่จัดทำโดย CColorModeProvider
จากนั้นส่งต่อเป็นไดนามิกคีย์ไปยังอ็อบเจกต์ mainStyle
ซึ่งเราจะสร้างในอีกสักครู่ แนวคิดคือการใช้ชุดสไตล์ที่แตกต่างกันตามค่า colorMode
ฉันยังใช้ความกว้างและความสูงกับอุปกรณ์ประกอบฉากชวเลข — w
และ h
ตามลำดับเพื่อกำหนดความกว้างและความสูงขององค์ประกอบ CBox
ของเรา มากำหนดวัตถุ mainStyles
นี้ในส่วนสคริปต์ของเรา:
<script> import { CThemeProvider, CColorModeProvider, CReset, CBox } from '@chakra-ui/vue' import NavBar from '@/components/NavBar' export default { name: 'DefaultLayout', components: { CThemeProvider, CColorModeProvider, CReset, CBox, NavBar }, data () { return { mainStyles: { dark: { bg: 'gray.900', color: 'whiteAlpha.900' }, light: { bg: 'whiteAlpha.900', color: 'gray.900' } } } } } </script>
Chakra-ui explorer ตอนนี้รองรับโหมดมืดแล้ว!
ตอนนี้ เรามีแถบการนำทางและตั้งค่าการรองรับโหมดมืดสำหรับแอปพลิเคชันของเราเรียบร้อยแล้ว มาเน้นที่ index.vue
ใน pages/
ไดเร็กทอรีของเราซึ่งพบเนื้อของแอปพลิเคชันของเรา เราจะเริ่มต้นด้วยการเพิ่มองค์ประกอบ CBox
ดังนี้:
<c-box as="main" d="flex" direction="column" align-items="center" p="10" > </c-box>
จากนั้นเราจะเพิ่มองค์ประกอบ CInput
เข้าไปข้างใน องค์ประกอบของหน้า index.vue
ของเราจะมีลักษณะดังนี้:
<template> <c-box as="main" d="flex" align-items="center" direction="column" w="auto" p="16" > <c-input placeholder="Search components..." size="lg" mb="5" is-full-width /> </c-box> </template> <script> import { CBox, CInput } from '@chakra-ui/vue' export default { components: { CBox, CInput } } </script>
นี่คือลักษณะที่แอปพลิเคชันของเราดูเหมือนตอนนี้:
คุณสามารถดูได้จาก screencast ด้านบนว่าองค์ประกอบ CInput
รู้โดยอัตโนมัติเมื่ออยู่ในโหมดมืดและปรับตามนั้นได้อย่างไร แม้ว่าเราจะไม่ได้ตั้งค่าไว้อย่างชัดเจน นอกจากนี้ ผู้ใช้สามารถกดปุ่มแท็บเพื่อเน้นที่องค์ประกอบ CInput
นั้น
การเพิ่มรายการส่วนประกอบ
ดังนั้นแนวคิดของ Chakra-ui explorer (ตามที่ระบุไว้ก่อนหน้านี้) คือการแสดงส่วนประกอบทั้งหมดที่มีให้ผู้ใช้ใน Chakra UI เพื่อให้เราสามารถมีรายการส่วนประกอบเหล่านั้นรวมถึงลิงก์ที่จะนำผู้ใช้ไปยังเอกสารประกอบ ของส่วนประกอบ ในการทำเช่นนี้ ฉันจะสร้างโฟลเดอร์ชื่อ data
ที่รูทของไดเร็กทอรีของโปรเจ็กต์ จากนั้นสร้างไฟล์ชื่อ index.js
ใน index.js
ฉันจะส่งออกอาร์เรย์ของวัตถุซึ่งจะมีชื่อของส่วนประกอบ ไฟล์ควรมีลักษณะดังนี้:
// ./data/index.js export const components = [ { name: 'Accordion' }, { name: 'Alert' }, { name: 'AlertDialog' }, { name: 'AspectRatioBox' }, { name: 'AspectRatioBox' }, { name: 'Avatar' }, { name: 'Badge' }, { name: 'Box' }, { name: 'Breadcrumb' }, { name: 'Button' }, { name: 'Checkbox' }, { name: 'CircularProgress' }, { name: 'CloseButton' }, { name: 'Code' }, { name: 'Collapse' }, { name: 'ControlBox' }, { name: 'Divider' }, { name: 'Drawer' }, { name: 'Editable' }, { name: 'Flex' }, { name: 'Grid' }, { name: 'Heading' }, { name: 'Icon' }, { name: 'IconButton' }, { name: 'IconButton' }, { name: 'Input' }, { name: 'Link' }, { name: 'List' }, { name: 'Menu' }, { name: 'Modal' }, { name: 'NumberInput' }, { name: 'Popover' }, { name: 'Progress' }, { name: 'PseudoBox' }, { name: 'Radio' }, { name: 'SimpleGrid' }, { name: 'Select' }, { name: 'Slider' }, { name: 'Spinner' }, { name: 'Stat' }, { name: 'Stack' }, { name: 'Switch' }, { name: 'Tabs' }, { name: 'Tag' }, { name: 'Text' }, { name: 'Textarea' }, { name: 'Toast' }, { name: 'Tooltip' } ]
เพื่อให้การติดตั้งใช้งานของเราเสร็จสมบูรณ์ ฉันจะนำเข้าอาร์เรย์ด้านบนไปที่ pages/index.vue
และทำซ้ำเพื่อแสดงส่วนประกอบทั้งหมด นอกจากนี้ เราจะให้ผู้ใช้สามารถกรองส่วนประกอบโดยใช้ช่องค้นหา นี่คือการใช้งานที่สมบูรณ์:
// pages/index.vue <template> <c-box as="main" d="flex" align-items="space-between" flex-direction="column" w="auto" p="16" > <c-input v-model="search" placeholder="Search components..." size="lg" mb="10" is-full-width /> <c-grid template-columns="repeat(4, 1fr)" gap="3" p="5"> <c-box v-for="(chakraComponent, index) of filteredComponents" :key="index" h="10"> {{ chakraComponent.name }} <c-badge> <c-link is-external :href="lowercase(`https://vue.chakra-ui.com/${chakraComponent.name}`)" > <c-icon name="info" size="18px" /> </c-link> </c-badge> </c-box> </c-grid> </c-box> </template> <script> import { CBox, CInput, CGrid, CLink, CBadge, CIcon } from '@chakra-ui/vue' import { components as chakraComponents } from '../data' export default { components: { CBox, CInput, CGrid, CBadge, CIcon, CLink }, data () { return { search: '' } }, computed: { filteredComponents () { return chakraComponents.filter((component) => { return this.lowercase(component.name).includes(this.lowercase(this.search)) }) } }, methods: { lowercase (value) { return value.toLowerCase() } } } </script>
และตอนนี้แอปพลิเคชันของเรามีลักษณะดังนี้:
ตอนนี้คุณสามารถดูว่าโหมดมืดทำงานอัตโนมัติสำหรับรายการส่วนประกอบอย่างไร เช่นเดียวกับการเพิ่มการจัดการโฟกัสสำหรับลิงก์ (โดยค่าเริ่มต้น) เพื่อช่วยในการเข้าถึง
นำ Chakra UI มาทดสอบ
สุดท้าย มาดูกันว่าแอปของเราให้คะแนนอย่างไรโดยเรียกใช้การทดสอบการช่วยสำหรับการเข้าถึงของ Lighthouse โปรดทราบว่าการทดสอบนี้อิงตามการประเมินผลกระทบต่อผู้ใช้ของ Axe ด้านล่างนี้เป็น screencast ของการทดสอบ คุณยังสามารถทำการทดสอบด้วยตัวเองโดยทำตามขั้นตอนเหล่านี้
จาก screencast ด้านบน คุณจะเห็นว่าแอป Chakra UI ของเรามีคะแนน 85 ในการทดสอบการเข้าถึงของประภาคาร
บทสรุป
ในบทความนี้ เราได้สัมผัสถึงความจำเป็นในการสร้างอินเทอร์เฟซที่เข้าถึงได้ และเรายังได้เห็นวิธีใช้ Chakra UI เพื่อสร้างแอปพลิเคชันที่เข้าถึงได้ตั้งแต่ต้นด้วยการสร้างนักสำรวจ (Chakra-ui explorer) สำหรับส่วนประกอบ Chakra UI
- ดูแอปพลิเคชั่นสดบน Netlify →
- ลิงค์ไปยัง repo →