स्प्लिट बटन वाला कॉम्पोनेंट बनाना

स्प्लिट बटन वाला कॉम्पोनेंट बनाने के तरीके के बारे में खास जानकारी.

इस पोस्ट में, मैं आपको स्प्लिट बटन बनाने के तरीके के बारे में बताना चाहती हूं . डेमो देखें.

डेमो

अगर आपको वीडियो देखना है, तो इस पोस्ट का YouTube वर्शन यहां देखें:

खास जानकारी

स्प्लिट बटन ऐसे बटन होते हैं जो मुख्य बटन और अतिरिक्त बटन की सूची को छिपा देती है. वे काम के हैं सेकंडरी को नेस्ट करते समय, किसी सामान्य कार्रवाई को दिखाने के लिए, कम इस्तेमाल होता है कार्रवाई नहीं की जा सकती. काम को बेहतर बनाने में मदद करने के लिए, स्प्लिट बटन का इस्तेमाल करना फ़ायदेमंद हो सकता है कम से कम महसूस होता है. एक ऐडवांस स्प्लिट बटन, उपयोगकर्ता की पिछली कार्रवाई को भी याद रख सकता है और उसे मुख्य पद पर प्रमोट कर सकता है.

आपको अपने ईमेल ऐप्लिकेशन में एक सामान्य स्प्लिट बटन मिल सकता है. मुख्य कार्रवाई भेज दिया जाता है, लेकिन आप बाद में इसे भेज सकते हैं या इसके बजाय ड्राफ़्ट को सेव कर सकते हैं:

उदाहरण के तौर पर, स्प्लिट बटन, जो ईमेल ऐप्लिकेशन में दिखता है.

इस शेयर की गई कार्रवाई वाली जगह अच्छी है, क्योंकि इसमें उपयोगकर्ता को आस-पास देखने की ज़रूरत नहीं होती. वे यह जान लें कि स्प्लिट बटन में ईमेल से जुड़ी ज़रूरी कार्रवाइयां मौजूद हैं.

पार्ट

चलिए, स्प्लिट बटन के बारे में चर्चा करने से पहले, इसके ज़रूरी हिस्सों के बारे में जानते हैं ऑर्कस्ट्रैशन और फ़ाइनल उपयोगकर्ता अनुभव के बारे में बताया जा सकता है. VisBug की सुलभता यहां कॉम्पोनेंट का मैक्रो व्यू दिखाने के लिए, जांच टूल का इस्तेमाल किया गया है एचटीएमएल, स्टाइल, और सुलभता के बारे में ज़रूरी जानकारी दी गई है.

'स्प्लिट करें' बटन बनाने वाले एचटीएमएल एलिमेंट.

टॉप लेवल स्प्लिट बटन का कंटेनर

सबसे ऊंचे लेवल का कॉम्पोनेंट एक इनलाइन फ़्लेक्सबॉक्स है, जिसमें gui-split-button में प्राइमरी ऐक्शन शामिल है और .gui-popup-button.

guide-split-button क्लास, जिसकी जांच की गई और इस क्लास में इस्तेमाल की गई सीएसएस प्रॉपर्टी को दिखाया गया.

मुख्य ऐक्शन बटन

शुरुआत में दिखने वाला और फ़ोकस करने लायक <button>, कंटेनर में फ़िट हो जाता है इसके लिए दो मेल खाने वाले कोने वाले आकार फ़ोकस, होवर करें और इसके साथ सक्रिय इंटरैक्शन .gui-split-button में शामिल दिखाई देते हैं.

जांच करने वाला टूल, जो बटन एलिमेंट के लिए सीएसएस नियम दिखा रहा है.

पॉप-अप टॉगल बटन

"पॉप-अप बटन" सपोर्ट एलिमेंट, यूआरएल की सूची को चालू करने और उसकी जानकारी देने के लिए है दूसरे बटन. ध्यान दें कि यह <button> नहीं है और इसमें फ़ोकस नहीं किया जा सकता. हालांकि, यह .gui-popup के लिए पोज़िशनिंग ऐंकर है और :focus-within के लिए होस्ट का इस्तेमाल किया गया है का इस्तेमाल करें.

इंस्पेक्टर, क्लास gi-popup-button के लिए सीएसएस नियमों को दिखा रहा है.

पॉप-अप कार्ड

यह फ़्लोटिंग कार्ड चाइल्ड खाते से अपने ऐंकर में जुड़ता है .gui-popup-button, निर्धारित निरपेक्ष और यानी, बटन की सूची को शब्दों में रैप करें.

इंस्पेक्टर, क्लास के लिए सीएसएस के नियम दिखा रहा है

दूसरी कार्रवाई(कार्रवाइयां)

फ़ोकस करने लायक <button>, जिसका फ़ॉन्ट साइज़ प्राइमरी ऐक्शन बटन का इस्तेमाल करके, एक आइकॉन और बिना शुल्क के स्टाइल को मुख्य बटन पर सेट करना.

जांच करने वाला टूल, जो बटन एलिमेंट के लिए सीएसएस नियम दिखा रहा है.

कस्टम प्रॉपर्टी

निम्नलिखित वैरिएबल रंगों का मिला-जुला रूप बनाने में मदद करते हैं और पूरे कॉम्पोनेंट में इस्तेमाल की गई वैल्यू में बदलाव कर सकता है.

@custom-media --motionOK (prefers-reduced-motion: no-preference);
@custom-media --dark (prefers-color-scheme: dark);
@custom-media --light (prefers-color-scheme: light);

.gui-split-button {
  --theme:             hsl(220 75% 50%);
  --theme-hover:  hsl(220 75% 45%);
  --theme-active:  hsl(220 75% 40%);
  --theme-text:      hsl(220 75% 25%);
  --theme-border: hsl(220 50% 75%);
  --ontheme:         hsl(220 90% 98%);
  --popupbg:         hsl(220 0% 100%);

  --border: 1px solid var(--theme-border);
  --radius: 6px;
  --in-speed: 50ms;
  --out-speed: 300ms;

  @media (--dark) {
    --theme:             hsl(220 50% 60%);
    --theme-hover:  hsl(220 50% 65%);
    --theme-active:  hsl(220 75% 70%);
    --theme-text:      hsl(220 10% 85%);
    --theme-border: hsl(220 20% 70%);
    --ontheme:         hsl(220 90% 5%);
    --popupbg:         hsl(220 10% 30%);
  }
}

लेआउट और रंग

मार्कअप

एलिमेंट, कस्टम क्लास के नाम से <div> के तौर पर शुरू होता है.

<div class="gui-split-button"></div>

मुख्य बटन और .gui-popup-button एलिमेंट जोड़ें.

<div class="gui-split-button">
  <button>Send</button>
  <span class="gui-popup-button" aria-haspopup="true" aria-expanded="false" title="Open for more actions"></span>
</div>

आरिया एट्रिब्यूट aria-haspopup और aria-expanded पर ध्यान दें. ये संकेत हैं: यह स्क्रीन रीडर के लिए ज़रूरी है, ताकि वे स्प्लिट की क्षमता और स्थिति के बारे में जान सकें अनुभव पर क्लिक करें. title एट्रिब्यूट सभी के लिए मददगार होता है.

<svg> आइकॉन और .gui-popup कंटेनर एलिमेंट जोड़ें.

<div class="gui-split-button">
  <button>Send</button>
  <span class="gui-popup-button" aria-haspopup="true" aria-expanded="false" title="Open for more actions">
    <svg aria-hidden="true" viewBox="0 0 20 20">
      <path d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" />
    </svg>
    <ul class="gui-popup"></ul>
  </span>
</div>

सीधे पॉप-अप प्लेसमेंट के लिए, .gui-popup उस बटन का ही एक चाइल्ड बटन है बड़ा करता है. इस रणनीति में सिर्फ़ .gui-split-button पकड़ी जा सकती है कंटेनर overflow: hidden का इस्तेमाल नहीं कर सकता, क्योंकि यह पॉप-अप की क्लिप को विज़ुअल तौर पर.

<li><button> सामग्री से भरा हुआ <ul> खुद को "बटन" के तौर पर बताएगा सूची" जिसे स्क्रीन रीडर इस्तेमाल करते हैं. यह सिर्फ़ पेश किया जा रहा इंटरफ़ेस है.

<div class="gui-split-button">
  <button>Send</button>
  <span class="gui-popup-button" aria-haspopup="true" aria-expanded="false" title="Open for more actions">
    <svg aria-hidden="true" viewBox="0 0 20 20">
      <path d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" />
    </svg>
    <ul class="gui-popup">
      <li>
        <button>Schedule for later</button>
      </li>
      <li>
        <button>Delete</button>
      </li>
      <li>
        <button>Save draft</button>
      </li>
    </ul>
  </span>
</div>

रंग भरने और मज़ेदार बनाने के लिए, मैंने सेकंडरी बटन में आइकॉन जोड़े हैं https://heroicons.com से भेजा गया हो. दोनों के लिए आइकॉन ज़रूरी नहीं हैं प्राइमरी और सेकंडरी बटन होते हैं.

<div class="gui-split-button">
  <button>Send</button>
  <span class="gui-popup-button" aria-haspopup="true" aria-expanded="false" title="Open for more actions">
    <svg aria-hidden="true" viewBox="0 0 20 20">
      <path d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" />
    </svg>
    <ul class="gui-popup">
      <li><button>
        <svg aria-hidden="true" viewBox="0 0 24 24">
          <path d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
        </svg>
        Schedule for later
      </button></li>
      <li><button>
        <svg aria-hidden="true" viewBox="0 0 24 24">
          <path d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
        </svg>
        Delete
      </button></li>
      <li><button>
        <svg aria-hidden="true" viewBox="0 0 24 24">
          <path d="M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z" />
        </svg>
        Save draft
      </button></li>
    </ul>
  </span>
</div>

स्टाइल

एचटीएमएल और कॉन्टेंट के मौजूद होने पर स्टाइल, रंग और लेआउट के लिए तैयार हो जाती हैं.

स्प्लिट बटन कंटेनर के लुक को बेहतर बनाना

इस रैपिंग कॉम्पोनेंट के लिए, inline-flex का डिसप्ले टाइप अच्छा काम करता है अन्य स्प्लिट बटन, कार्रवाइयों या एलिमेंट के साथ इनलाइन फ़िट होना चाहिए.

.gui-split-button {
  display: inline-flex;
  border-radius: var(--radius);
  background: var(--theme);
  color: var(--ontheme);
  fill: var(--ontheme);

  touch-action: manipulation;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}

&#39;स्प्लिट करें&#39; बटन.

<button> स्टाइलिंग

बटन से पता चल जाता है कि कितना कोड चाहिए. आपको ये काम करने पड़ सकते हैं ब्राउज़र की डिफ़ॉल्ट स्टाइल को पहले जैसा करें या बदलें, लेकिन आपको कुछ पाबंदियां भी लागू करनी होंगी इनहेरिटेंस, इंटरैक्शन की स्थितियां जोड़ने के साथ-साथ उपयोगकर्ता की अलग-अलग प्राथमिकताओं और इनपुट प्रकार. बटन की स्टाइल तुरंत जुड़ जाती हैं.

ये बटन सामान्य बटन से अलग हैं, क्योंकि ये बैकग्राउंड शेयर करते हैं पैरंट एलिमेंट के साथ. आम तौर पर, बटन के बैकग्राउंड और टेक्स्ट का रंग होता है. हालांकि, ये लोग इसे शेयर करते हैं और इंटरैक्शन के दौरान सिर्फ़ अपने बैकग्राउंड का इस्तेमाल करते हैं.

.gui-split-button button {
  cursor: pointer;
  appearance: none;
  background: none;
  border: none;

  display: inline-flex;
  align-items: center;
  gap: 1ch;
  white-space: nowrap;

  font-family: inherit;
  font-size: inherit;
  font-weight: 500;

  padding-block: 1.25ch;
  padding-inline: 2.5ch;

  color: var(--ontheme);
  outline-color: var(--theme);
  outline-offset: -5px;
}

कुछ सीएसएस की मदद से, इंटरैक्शन की स्थितियां जोड़ना pseudo-classes और मैचिंग का इस्तेमाल कस्टम प्रॉपर्टी बनाएं:

.gui-split-button button {
  

  &:is(:hover, :focus-visible) {
    background: var(--theme-hover);
    color: var(--ontheme);

    & > svg {
      stroke: currentColor;
      fill: none;
    }
  }

  &:active {
    background: var(--theme-active);
  }
}

डिज़ाइन इफ़ेक्ट को पूरा करने के लिए मुख्य बटन को कुछ खास स्टाइल की ज़रूरत होती है:

.gui-split-button > button {
  border-end-start-radius: var(--radius);
  border-start-start-radius: var(--radius);

  & > svg {
    fill: none;
    stroke: var(--ontheme);
  }
}

आख़िर में, कुछ स्टाइल के लिए, हल्के रंग वाली थीम वाले बटन और आइकॉन को शैडो:

.gui-split-button {
  @media (--light) {
    & > button,
    & button:is(:focus-visible, :hover) {
      text-shadow: 0 1px 0 var(--theme-active);
    }
    & > .gui-popup-button > svg,
    & button:is(:focus-visible, :hover) > svg {
      filter: drop-shadow(0 1px 0 var(--theme-active));
    }
  }
}

शानदार बटन ने माइक्रोइंटरैक्शन और बारीक विवरण पर ध्यान दिया है.

:focus-visible के बारे में एक नोट

ध्यान दें कि बटन की स्टाइल, :focus के बजाय :focus-visible का इस्तेमाल कैसे करती हैं. :focus अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है को ऐक्सेस करने लायक यूज़र इंटरफ़ेस बनाने के लिए एक अहम टच है, लेकिन इसमें एक डाउनफ़ॉल: डेवलपर के लिए यह तय करना मुश्किल होता है कि उपयोगकर्ता को उसे देखने की ज़रूरत है या नहीं या नहीं, यह किसी भी फ़ोकस पर लागू होगा.

नीचे दिया गया वीडियो इस माइक्रोइंटरैक्शन को अलग-अलग करने की कोशिश करता है. इससे यह पता चलता है कि :focus-visible एक बेहतर विकल्प है.

पॉप-अप बटन का लुक तय करना

आइकॉन को बीच में करने और पॉप-अप बटन की सूची को ऐंकर करने के लिए, 4ch फ़्लेक्सबॉक्स. किसी ने भी पसंद नहीं किया बटन पर क्लिक करें. यह तब तक पारदर्शी रहता है, जब तक इस बटन पर कर्सर घुमाया या इंटरैक्ट नहीं किया जाता के साथ पूरी तरह से फ़िट हो जाए.

स्प्लिट बटन के ऐरो वाले हिस्से का इस्तेमाल, पॉप-अप को ट्रिगर करने के लिए किया जाता है.

.gui-popup-button {
  inline-size: 4ch;
  cursor: pointer;
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-inline-start: var(--border);
  border-start-end-radius: var(--radius);
  border-end-end-radius: var(--radius);
}

सीएसएस की मदद से, कर्सर घुमाकर, फ़ोकस करने, और एक्टिव स्थितियों में लेयर बनाने की सुविधा पाएं नेस्ट करना और :is() फ़ंक्शनल सिलेक्टर:

.gui-popup-button {
  

  &:is(:hover,:focus-within) {
    background: var(--theme-hover);
  }

  /* fixes iOS trying to be helpful */
  &:focus {
    outline: none;
  }

  &:active {
    background: var(--theme-active);
  }
}

ये स्टाइल, पॉप-अप दिखाने और छिपाने का मुख्य मकसद हैं. जब .gui-popup-button के किसी भी चाइल्ड पर focus हैं, opacity सेट करें, पोज़िशन और pointer-events.

.gui-popup-button {
  

  &:focus-within {
    & > svg {
      transition-duration: var(--in-speed);
      transform: rotateZ(.5turn);
    }
    & > .gui-popup {
      transition-duration: var(--in-speed);
      opacity: 1;
      transform: translateY(0);
      pointer-events: auto;
    }
  }
}

इन और आउट स्टाइल के पूरा होने पर, सबसे आखिर में ज़रूरी उपयोगकर्ता की मोशन से जुड़ी प्राथमिकता के आधार पर ट्रांज़िशन में बदलाव आता है:

.gui-popup-button {
  

  @media (--motionOK) {
    & > svg {
      transition: transform var(--out-speed) ease;
    }
    & > .gui-popup {
      transform: translateY(5px);

      transition:
        opacity var(--out-speed) ease,
        transform var(--out-speed) ease;
    }
  }
}

कोड को अच्छी तरह से देखने पर, उपयोगकर्ताओं के लिए अपारदर्शिता अब भी बदल सकती है जो कम मोशन पसंद करते हैं.

पॉप-अप का लुक तय करना

.gui-popup एलिमेंट, कस्टम प्रॉपर्टी का इस्तेमाल करके फ़्लोटिंग कार्ड बटन की सूची है और सापेक्ष इकाइयां सूक्ष्म रूप से छोटी हों, और अपने ब्रैंड के बारे में लोगों को बताने के लिए रंगों का इस्तेमाल करें. ध्यान दें कि आइकॉन में कम कंट्रास्ट, और परछाइयां ढीली हो जाती हैं और इस पर परछाई नीले रंग की तरह दिखती है. बटन से पसंद करने की सुविधा, इन छोटी-छोटी जानकारी को एक जगह पर रखने की वजह से, एक बेहतर यूज़र इंटरफ़ेस (यूआई) और उपयोगकर्ता अनुभव मिलता है.

फ़्लोटिंग कार्ड एलिमेंट.

.gui-popup {
  --shadow: 220 70% 15%;
  --shadow-strength: 1%;

  opacity: 0;
  pointer-events: none;

  position: absolute;
  bottom: 80%;
  left: -1.5ch;

  list-style-type: none;
  background: var(--popupbg);
  color: var(--theme-text);
  padding-inline: 0;
  padding-block: .5ch;
  border-radius: var(--radius);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  font-size: .9em;
  transition: opacity var(--out-speed) ease;

  box-shadow:
    0 -2px 5px 0 hsl(var(--shadow) / calc(var(--shadow-strength) + 5%)),
    0 1px 1px -2px hsl(var(--shadow) / calc(var(--shadow-strength) + 10%)),
    0 2px 2px -2px hsl(var(--shadow) / calc(var(--shadow-strength) + 12%)),
    0 5px 5px -2px hsl(var(--shadow) / calc(var(--shadow-strength) + 13%)),
    0 9px 9px -2px hsl(var(--shadow) / calc(var(--shadow-strength) + 14%)),
    0 16px 16px -2px hsl(var(--shadow) / calc(var(--shadow-strength) + 20%))
  ;
}

आइकॉन और बटन को ब्रैंड के हिसाब से रंग दिया गया है, ताकि वे हर गहरे रंग में अच्छी तरह से दिखें और हल्के रंग वाली थीम वाला कार्ड:

चेकआउट, क्विक पेमेंट, और &#39;बाद के लिए सेव करें&#39; के लिए लिंक और आइकॉन.

.gui-popup {
  

  & svg {
    fill: var(--popupbg);
    stroke: var(--theme);

    @media (prefers-color-scheme: dark) {
      stroke: var(--theme-border);
    }
  }

  & button {
    color: var(--theme-text);
    width: 100%;
  }
}

गहरे रंग वाली थीम वाले पॉप-अप में, टेक्स्ट और आइकॉन के गहरे हिस्सों को हल्का किया गया है. साथ ही, इसमें कुछ अन्य बदलाव भी किए गए हैं इंटेंस बॉक्स शैडो:

गहरे रंग वाली थीम में पॉप-अप.

.gui-popup {
  

  @media (--dark) {
    --shadow-strength: 5%;
    --shadow: 220 3% 2%;

    & button:not(:focus-visible, :hover) {
      text-shadow: 0 1px 0 var(--ontheme);
    }

    & button:not(:focus-visible, :hover) > svg {
      filter: drop-shadow(0 1px 0 var(--ontheme));
    }
  }
}

आइकॉन के लिए सामान्य <svg> स्टाइल

सभी आइकॉन तुलनात्मक रूप से उस बटन font-size के आकार में हैं जिसमें उनका इस्तेमाल किया गया है ch यूनिट को inline-size. हर आइकॉन को कुछ स्टाइल भी दिए जाते हैं, ताकि आइकॉन को सॉफ़्ट कलर और आउटलाइन किया जा सके शानदार.

.gui-split-button svg {
  inline-size: 2ch;
  box-sizing: content-box;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-width: 2px;
}

दाएं से बाएं लेआउट

लॉजिकल प्रॉपर्टी से सभी मुश्किल काम किए जा सकते हैं. यहां इस्तेमाल की गई लॉजिकल प्रॉपर्टी की सूची दी गई है: - display: inline-flex, इनलाइन फ़्लेक्स एलिमेंट बनाता है. - padding के बजाय, padding-block और padding-inline को जोड़ा गया शॉर्टहैंड की मदद से, लॉजिकल साइड की पैडिंग के फ़ायदे पाएं. - border-end-start-radius और दोस्त यह कर पाएंगे दस्तावेज़ की दिशा के आधार पर गोल कोने. - width के बजाय inline-size से यह पक्का होता है कि साइज़, फ़िज़िकल डाइमेंशन के हिसाब से न हो. - border-inline-start शुरुआत में एक बॉर्डर जोड़ता है, जो स्क्रिप्ट की दिशा के आधार पर दाईं या बाईं ओर हो सकता है.

JavaScript

नीचे दिए गए करीब-करीब सभी JavaScript सुलभता को बेहतर बनाने के लिए हैं. मेरे दो हेल्पर लाइब्रेरी का इस्तेमाल टास्क को थोड़ा आसान बनाने के लिए किया जाता है. BlingBlingJS का इस्तेमाल कम शब्दों के लिए किया जाता है DOM क्वेरी और आसान इवेंट लिसनर सेटअप roving-ux की मदद से हर छात्र-छात्रा को आसानी से ऐक्सेस किया जा सकता है पॉप-अप के लिए कीबोर्ड और गेमपैड इंटरैक्शन.

import $ from 'blingblingjs'
import {rovingIndex} from 'roving-ux'

const splitButtons = $('.gui-split-button')
const popupButtons = $('.gui-popup-button')

ऊपर दी गई लाइब्रेरी के ज़रिए वैरिएबल के साथ, अनुभव को अपग्रेड करने की प्रक्रिया पूरी होने में कुछ सुविधाएं बाकी हैं.

रोविंग इंडेक्स

जब कोई कीबोर्ड या स्क्रीन रीडर .gui-popup-button पर फ़ोकस करता है, तो हम फ़ोकस को आगे के (या सबसे हाल ही में फ़ोकस किया गया) बटन पर ले जाएगा .gui-popup. element और target के साथ ऐसा करने में, लाइब्रेरी हमारी मदद करती है पैरामीटर का इस्तेमाल करें.

popupButtons.forEach(element =>
  rovingIndex({
    element,
    target: 'button',
  }))

यह एलिमेंट अब टारगेट <button> चिल्ड्रन पर फ़ोकस करता है और विकल्प ब्राउज़ करने के लिए, स्टैंडर्ड ऐरो बटन नेविगेशन का इस्तेमाल करें.

aria-expanded को टॉगल किया जा रहा है

हालांकि, यह साफ़ तौर पर पता चल रहा है कि पॉप-अप दिख रहा है और छिपाया जा रहा है. हालांकि, स्क्रीन रीडर को विज़ुअल संकेतों के मुकाबले ज़्यादा चीज़ों की ज़रूरत होती है. यहां JavaScript का इस्तेमाल, सीएसएस वाली :focus-within इंटरैक्शन को बेहतर बनाने के लिए किया जाता है. इसके लिए, स्क्रीन रीडर के सही एट्रिब्यूट को टॉगल किया जाता है.

popupButtons.on('focusin', e => {
  e.currentTarget.setAttribute('aria-expanded', true)
})

popupButtons.on('focusout', e => {
  e.currentTarget.setAttribute('aria-expanded', false)
})

Escape कुंजी चालू की जा रही है

उपयोगकर्ता का फ़ोकस जान-बूझकर एक जाल में डाला गया है, जिसका मतलब है कि हमें जाने का तरीका बताएं. सबसे सामान्य तरीका, Escape के इस्तेमाल की अनुमति देना है. ऐसा करने के लिए, पॉप-अप बटन पर दबाए गए बटन देखें, क्योंकि कीबोर्ड इवेंट चालू होने पर ऐसा होता है बच्चे इस माता-पिता से बात करेंगे.

popupButtons.on('keyup', e => {
  if (e.code === 'Escape')
    e.target.blur()
})

अगर पॉप-अप बटन को Escape बटन दबाया जाता है, तो फ़ोकस अपने-आप हट जाता है के साथ blur().

स्प्लिट बटन के क्लिक

आखिर में, अगर उपयोगकर्ता इन बटन पर क्लिक करता है, टैप करता है या कीबोर्ड से इंटरैक्ट करता है, तो ऐप्लिकेशन को उचित कार्रवाई करनी होगी. इवेंट के लिए बबल की सुविधा का इस्तेमाल किया गया है फिर से यहां आएं, लेकिन इस बार .gui-split-button कंटेनर पर 'कैच करें' बटन पर चाइल्ड पॉप-अप या मुख्य कार्रवाई पर किए गए क्लिक.

splitButtons.on('click', event => {
  if (event.target.nodeName !== 'BUTTON') return
  console.info(event.target.innerText)
})

नतीजा

अब जब आपको पता है कि मैंने इसे कैसे किया, तो आप कैसे करेंगे ‽ 🙂

आइए, हम अलग-अलग तरह के काम करते हैं और वेब पर काम करने के सभी तरीके सीखते हैं. एक डेमो बनाएं, मुझे ट्वीट करें और मैं इसे जोड़ दूंगा कम्यूनिटी रीमिक्स बनाने के लिए यहां दिए गए सेक्शन पर जाएं!

कम्यूनिटी रीमिक्स