Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

For most React apps, start with the native <progress> element and style it. It already communicates progress semantics to assistive technology, supports an indeterminate state, and needs less custom accessibility code than a generic element with role="progressbar". Build custom ARIA markup only when the native element cannot meet the visual or structural need.

Build a reusable native progress component

This component accepts a percentage from 0 to 100. Passing null means the amount completed is unknown, so it renders an indeterminate indicator without inventing a percentage.

function ProgressBar({ value, label = "Progress" }) {
  const indeterminate = value == null;

  return (
    <label className="progress">
      <span className="progress__label">{label}</span>
      <progress
        className="progress__track"
        value={indeterminate ? undefined : value}
        max={100}
        aria-label={label}
      />
      {!indeterminate && <span>{value}%</span>}
    </label>
  );
}

Before using this as a production component, define and enforce its input contract. This example assumes values from 0 through 100; validate or clamp caller-supplied values to that range, and decide whether the displayed percentage should be rounded. Keep the visible label and accessible name clear in the consuming design rather than needlessly repeating them.

React documents value as a number from zero to max, and value={null} for indeterminate progress. The native element’s max defaults to 1, so this example sets it to 100 to match percentage values. [React progress reference]

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Elebase USB to USB C Adapter for iPhone 18 Pro Max,USBC Car Charger Adapter
  • Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
  • Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
  • Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
  • Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
  • 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.

Choose native or custom ARIA markup

Approach Use it when What you take on
Styled native <progress> Its structure and browser behavior can meet the design requirement. Provide an accessible label and account for browser-specific styling. The native element supplies range and indeterminate behavior.
Custom element with role="progressbar" The DOM or rendering needs cannot be met adequately with the native element. Implement its accessible name, value range, determinate and indeterminate states, and synchronized visual updates yourself.
React Aria ProgressBar You want a documented library component with richer behavior. Assess whether its dependency and API fit your project; its documentation describes determinate and indeterminate progress and locale-aware value formatting.

Prefer a native semantic element when it meets the requirement. A generic element with an ARIA role does not automatically behave like a native control; responsibility for the relevant semantics and behavior remains with the component author. [MDN: <progress>] [MDN: progressbar role] [React Aria ProgressBar]

Implement a custom progressbar accessibly

If you need a custom track and fill, put role="progressbar" on the semantic wrapper. Keep essential label text outside that wrapper: descendants of a progressbar are treated as presentational. Reference the visible label with aria-labelledby, or provide an accessible name using aria-label.

Rank #2
Anker USB-C Hub, 5-in-1 USB Hub for Laptops, 4K HDMI Multiport Adapter
  • 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
  • 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
  • Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
  • 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
  • What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
function CustomProgressBar({ value, label = "Progress" }) {
  const indeterminate = value == null;
  const safeValue = indeterminate ? null : Math.min(100, Math.max(0, value));

  return (
    <div>
      <span id="progress-label">{label}</span>
      <div
        role="progressbar"
        aria-labelledby="progress-label"
        aria-valuemin={0}
        aria-valuemax={100}
        aria-valuenow={safeValue == null ? undefined : safeValue}
      >
        <div className="track">
          <div
            className="fill"
            style={{ width: indeterminate ? "35%" : `${safeValue}%` }}
          />
        </div>
      </div>
    </div>
  );
}

The clamp shown here handles values outside 0–100, but it does not reject non-numeric inputs; validate them according to your component’s API. The sample’s 35% indeterminate fill is merely an animation cue, not a claim that work is 35% complete. Choose a visual treatment that does not suggest an exact completion amount while the state is unknown.

  • Keep aria-valuenow synchronized with the determinate value and within the declared range. For indeterminate progress, omit it.
  • Set aria-valuemin and aria-valuemax when the range is not the default zero through 100.
  • Use aria-valuetext if a useful spoken value is not a percentage.
  • Do not use <progress> for a gauge such as disk space usage or the relevance of a search result; MDN distinguishes that use from progress.

[MDN progressbar role guidance]

Represent unknown progress honestly

Use an indeterminate state when the amount completed is unknown. In React, pass null for the native element’s value; in HTML, omitting value also represents progress whose amount is unknown. Do not show a made-up numeric percentage in the visual display or ARIA value. [React progress reference] [MDN <progress> reference]

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
Anker USB C Hub, 7in1 Multi-Port USB Adapter, 4K@60Hz USBC to HDMI Splitter
  • Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
  • Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
  • Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
  • Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
  • What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Associate progress with an updating region

When the indicator describes a particular page region that is being updated, connect the progress element and that region. Set aria-describedby on the region to reference the progress indicator, and set aria-busy="true" on the region while the update is in progress. Clear the busy state when the update finishes. [MDN <progress> reference]

Best Value
Anker USB C Hub, 5-in-1 USBC to HDMI Splitter with 4K Display
  • 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
  • Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
  • Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
  • HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
  • What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
Rank #4
Sale
UGREEN USB to USB C Adapter Combo 4-Pack, 10Gbps USB C Converter Space Gray
  • Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
  • Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
  • Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
  • Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
  • Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft

Check the component before shipping

  • Give the indicator a concise accessible name, such as “Uploading report.”
  • Confirm that determinate values stay inside the range the component declares.
  • Ensure a custom progressbar’s visible label is outside its role-bearing element and correctly associated.
  • Use an indeterminate state rather than a false percentage when completion is not measurable.
  • Verify that a region is marked busy only while its update is underway.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.