Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save suntong/dbc3229bd42b89e32e42957ffbc7ea15 to your computer and use it in GitHub Desktop.

Select an option

Save suntong/dbc3229bd42b89e32e42957ffbc7ea15 to your computer and use it in GitHub Desktop.

Comprehensive Comparison: Element UI vs Element Plus vs Quasar


1. General Overview

Feature Element UI Element Plus Quasar
Vue Version Vue 2.x Vue 3.x Vue 2 (v1) / Vue 3 (v2)
Language JavaScript TypeScript JavaScript (TS support)
License MIT MIT MIT
Maintainer ElemeFe (Alibaba) Community-driven (Element Plus team) Razvan Stoenescu / Community
First Release 2016 2020 2016
Status Maintenance only Active development Active development
Design Language Custom (Element Design) Custom (Element Design, refined) Material Design (customizable)
CSS Preprocessor SCSS SCSS / CSS Variables Sass (SCSS)
Bundle Size (full) ~700 KB (min) ~800 KB (min) Varies (tree-shaking)
Tree Shaking Partial (babel plugin) ✅ Native ESM ✅ Native (auto-import)
TypeScript Partial (declarations) ✅ Full (written in TS) ✅ Full support
RTL Support ❌ Community workarounds ✅ Built-in ✅ Built-in
SSR Support Nuxt 2 (community) Nuxt 3 ✅ Built-in (first-class)
Dark Mode ❌ Manual ✅ Built-in ✅ Built-in (plugin)
i18n ✅ ~50+ locales ✅ ~50+ locales ✅ ~40+ locales
Accessibility (a11y) Basic Improved (WAI-ARIA) Good (WAI-ARIA)
GitHub Stars (approx.) ~54k ~24k ~26k
npm Weekly Downloads ~400k ~500k ~100k

2. Build Targets & Platform Support

Target Element UI Element Plus Quasar
SPA
SSR Via Nuxt 2 Via Nuxt 3 ✅ Built-in
PWA ❌ Manual ❌ Manual ✅ Built-in
Mobile (Cordova) ✅ Built-in
Mobile (Capacitor) ✅ Built-in
Desktop (Electron) ✅ Built-in
Browser Extension (BEX) ✅ Built-in
Static Site (SSG) Via Nuxt Via Nuxt ✅ (via SSR mode)

Key takeaway: Quasar is a full framework (not just a component library). Element UI/Plus are component libraries only.


3. CLI & Tooling

Feature Element UI Element Plus Quasar
Dedicated CLI ❌ (use Vue CLI) ❌ (use Vite/Vue CLI) @quasar/cli
Project Scaffolding quasar create
Dev Server Webpack (via Vue CLI) Vite or Webpack quasar dev (Vite or Webpack)
Build Command Vue CLI Vite or Vue CLI quasar build
Hot Module Reload Via Vue CLI Via Vite/Vue CLI ✅ Built-in
Mode Switching N/A N/A `quasar dev -m [spa
Icon Genie ✅ Auto-generates all app icons
Auto-import Via babel-plugin-component Via unplugin-auto-import / unplugin-vue-components ✅ Built-in (zero config)
Upgrade Tool quasar upgrade

4. Theming & Customization

Feature Element UI Element Plus Quasar
CSS Variables ❌ (SCSS variables) ✅ CSS custom properties ✅ CSS custom properties + Sass variables
Theme Editor ✅ Online theme roller ❌ (use CSS vars / SCSS overrides) ❌ (Sass variable overrides)
SCSS Variable Overrides ✅ (quasar.variables.scss)
Brand Colors Primary, Success, Warning, Danger, Info Primary, Success, Warning, Danger, Info Primary, Secondary, Accent, Dark, Positive, Negative, Info, Warning
Component-level Styling Scoped CSS / BEM classes Scoped CSS / BEM / CSS vars Scoped CSS / Sass / CSS vars
Dark Mode ❌ Manual override namespace + class toggle $q.dark.set(true)
Dynamic Theming ✅ Runtime CSS var changes ✅ Runtime via setCssVar()
Breakpoints xs, sm, md, lg, xl xs, sm, md, lg, xl xs, sm, md, lg, xl (customizable)

5. Layout & Grid System

Feature Element UI Element Plus Quasar
Grid System el-row / el-col (24 columns) el-row / el-col (24 columns) Flexbox CSS classes (12 columns)
Container Layout el-container, el-header, el-aside, el-main, el-footer Same as Element UI QLayout, QHeader, QFooter, QDrawer, QPage, QPageContainer
Responsive Utilities xs, sm, md, lg, xl props on el-col Same col-xs-*, col-sm-*, col-md-*, etc. CSS classes
Gutter Control :gutter prop :gutter prop q-gutter-* CSS classes
Flex Utilities Limited Limited ✅ Extensive (flex, justify-*, items-*, self-*, q-space, etc.)
Spacing Helpers <el-space> component q-pa-*, q-ma-*, q-px-*, q-mt-*, etc.
Visibility Helpers hidden-xs-only, etc. Same xs, sm-and-up, gt-md, lt-lg, etc.
App Layout (Drawer/Sidebar) Manual Manual QLayout with configurable view prop (e.g., "lHh Lpr lFf")
Sticky Elements <el-affix> QPageSticky, QPageScroller

6. Complete Component Comparison

6.1 Basic / General

Component Element UI Element Plus Quasar
Button el-button el-button QBtn
Button Group el-button-group el-button-group QBtnGroup
Button Dropdown ❌ (use Dropdown) ❌ (use Dropdown) QBtnDropdown
Button Toggle QBtnToggle
Icon el-icon (custom font) el-icon (SVG-based) QIcon (supports Material, FA, SVG, img)
Link el-link el-link ❌ (use <a> or router-link)
Floating Action Button QFab, QFabAction
Space el-space QSpace + q-gutter-* classes
Divider el-divider el-divider QSeparator
Text el-text ❌ (CSS classes)
Scrollbar el-scrollbar QScrollArea
Config Provider el-config-provider ❌ (uses quasar.config.js)

6.2 Form Components

Component Element UI Element Plus Quasar
Form el-form el-form QForm
Form Item / Field el-form-item el-form-item QField
Input el-input el-input QInput
Textarea el-input type="textarea" el-input type="textarea" QInput type="textarea"
InputNumber el-input-number el-input-number QInput type="number" (no dedicated component)
Autocomplete el-autocomplete el-autocomplete QSelect with use-input + @filter
Mention el-mention ❌ (third-party)
Select el-select el-select QSelect
Virtualized Select el-select-v2 QSelect with virtual-scroll-slice-size
Select (Multiple) multiple prop
Select (Filterable) filterable filterable use-input + @filter
Select (Remote/Async) remote remote ✅ via @filter with async
Select (Creatable) allow-create allow-create new-value-mode
Cascader el-cascader el-cascader ❌ (use QSelect or third-party)
TreeSelect el-tree-select ❌ (combine QSelect + QTree manually)
Radio el-radio, el-radio-group, el-radio-button Same QRadio, QOptionGroup
Checkbox el-checkbox, el-checkbox-group, el-checkbox-button Same QCheckbox, QOptionGroup
Toggle / Switch el-switch el-switch QToggle
Slider el-slider el-slider QSlider
Range Slider el-slider with range Same QRange (dedicated component)
Date Picker el-date-picker el-date-picker QDate
Time Picker el-time-picker el-time-picker QTime
DateTime Picker el-date-picker type="datetime" Same QDate + QTime combined
Color Picker el-color-picker el-color-picker QColor
Rate / Rating el-rate el-rate QRating
Transfer el-transfer el-transfer ❌ (manual implementation)
Upload el-upload el-upload QUploader / QFile
WYSIWYG Editor QEditor (built-in rich text)
Knob QKnob
Option Group QOptionGroup (radio/checkbox/toggle group)
Validation Built-in (async-validator) Built-in (async-validator) Built-in (rules prop + custom)
Inline Editing QPopupEdit

6.3 Data Display

Component Element UI Element Plus Quasar
Table el-table el-table QTable
Virtualized Table el-table-v2 QTable with virtual-scroll
Table Sorting
Table Filtering
Table Selection
Table Expandable Rows
Table Server-side ✅ (first-class @request event)
Table Column Resizing ✅ (visible-columns + column resize)
Table Inline Editing Manual Manual ✅ with QPopupEdit
Table Sticky Header/Col ✅ (sticky header) ✅ (sticky header + column)
Table Dense Mode dense prop
Table Grid Mode grid prop (card layout)
Table Full Screen fullscreen prop
Table Export ❌ (manual, but easy with @request)
Tree el-tree el-tree QTree
Tree (Virtual) el-tree-v2 QTree (handles large trees)
Tree (Lazy Load) lazy-load prop
Tree (Drag & Drop) ❌ (manual)
Tag / Chip el-tag el-tag QChip
Check Tag el-check-tag QChip with selected
Badge el-badge el-badge QBadge
Avatar el-avatar el-avatar QAvatar
Card el-card el-card QCard, QCardSection, QCardActions
Carousel el-carousel el-carousel QCarousel, QCarouselSlide, QCarouselControl
Collapse / Accordion el-collapse el-collapse QExpansionItem
Descriptions el-descriptions ❌ (use QList or QMarkupTable)
Empty el-empty ❌ (use slot or custom)
Image el-image el-image QImg
Image Lazy Load
Image Preview/Viewer ❌ (third-party / custom)
Infinite Scroll v-infinite-scroll directive v-infinite-scroll directive QInfiniteScroll component
List QList, QItem, QItemSection, QItemLabel
Pagination el-pagination el-pagination QPagination
Progress (Linear) el-progress el-progress QLinearProgress
Progress (Circular) el-progress type="circle" el-progress type="circle/dashboard" QCircularProgress
Skeleton el-skeleton QSkeleton
Statistic el-statistic ❌ (manual)
Countdown el-countdown ❌ (manual)
Timeline el-timeline el-timeline QTimeline, QTimelineEntry
Calendar el-calendar el-calendar ❌ (use QDate or third-party)
Virtual Scroll Table V2, Select V2, Tree V2 QVirtualScroll (generic)
Parallax QParallax
Video QVideo (iframe embed)
Markup Table QMarkupTable (styled HTML table)
Splitter QSplitter (resizable panels)
Responsive QResponsive (ratio-based sizing)
Watermark el-watermark
Segmented Control el-segmented QBtnToggle (similar)
Tour / Guide el-tour ❌ (third-party)
Anchor el-anchor ❌ (manual / scroll plugin)

6.4 Navigation

Component Element UI Element Plus Quasar
Menu / Nav el-menu (vertical/horizontal) el-menu QList + QItem / QMenu
Tabs el-tabs el-tabs QTabs, QTab, QRouteTab
Tab Panels Built into el-tabs Built into el-tabs QTabPanels, QTabPanel (decoupled)
Breadcrumb el-breadcrumb el-breadcrumb QBreadcrumbs, QBreadcrumbsEl
Dropdown el-dropdown el-dropdown QBtnDropdown / QMenu
Steps / Stepper el-steps el-steps QStepper, QStep, QStepperNavigation
Page Header el-page-header el-page-header ❌ (use QToolbar)
Toolbar QToolbar, QToolbarTitle
Back to Top el-backtop el-backtop QPageScroller
Pull to Refresh QPullToRefresh
Navigation Drawer Manual (container+aside) Same QDrawer (built-in, swipeable)

6.5 Feedback / Overlay

Component Element UI Element Plus Quasar
Dialog / Modal el-dialog el-dialog QDialog
Dialog (Programmatic) MessageBox ElMessageBox $q.dialog() plugin
Alert el-alert el-alert QBanner
Message (Toast) Message service ElMessage $q.notify()
Notification Notification service ElNotification $q.notify() (with positioning)
Message Box (Confirm) MessageBox.confirm() ElMessageBox.confirm() $q.dialog({ ... })
Loading (Full/Partial) v-loading directive / Loading service Same QInnerLoading / $q.loading plugin
Loading Bar QAjaxBar / $q.loadingBar
Tooltip el-tooltip el-tooltip QTooltip
Popover el-popover el-popover QMenu (with anchor)
Popconfirm el-popconfirm el-popconfirm QMenu + confirm layout (manual)
Drawer / Sheet el-drawer el-drawer QDialog position="bottom/left/right/top"
Bottom Sheet $q.bottomSheet()
Action Sheet $q.bottomSheet()
Overlay el-overlay ❌ (built into QDialog)
Result el-result ❌ (manual)
Spinner el-loading QSpinner (15+ variants)
Bar (Title Bar) QBar (desktop-style title bar)

6.6 Spinner Variants (Quasar Exclusive)

Quasar provides 15+ built-in spinner styles:

  • QSpinner
  • QSpinnerAudio
  • QSpinnerBall
  • QSpinnerBars
  • QSpinnerBox
  • QSpinnerComment
  • QSpinnerCube
  • QSpinnerDots
  • QSpinnerFacebook
  • QSpinnerGears
  • QSpinnerGrid
  • QSpinnerHearts
  • QSpinnerHourglass
  • QSpinnerInfinity
  • QSpinnerIos
  • QSpinnerOval
  • QSpinnerPie
  • QSpinnerPuff
  • QSpinnerRadio
  • QSpinnerRings
  • QSpinnerTail

Element UI/Plus: only the generic el-loading spinner.


7. Directives

Directive Element UI Element Plus Quasar
Loading v-loading v-loading ❌ (use QInnerLoading)
Infinite Scroll v-infinite-scroll v-infinite-scroll ❌ (use QInfiniteScroll)
Ripple v-ripple
Close Popup v-close-popup
Go Back v-go-back
Scroll v-scroll
Scroll Fire v-scroll-fire
Touch Hold v-touch-hold
Touch Pan v-touch-pan
Touch Repeat v-touch-repeat
Touch Swipe v-touch-swipe
Intersection v-intersection
Mutation v-mutation
Morph v-morph

8. Plugins & Utilities (Quasar Exclusive or Comparison)

Plugin / Utility Element UI Element Plus Quasar
Platform Detection $q.platform (OS, browser, mobile, etc.)
Screen Breakpoint $q.screen (reactive breakpoints, width, height)
Dark Mode CSS class toggle $q.dark (reactive plugin)
App Fullscreen $q.fullscreen
App Visibility $q.appVisible (reactive)
Address Bar Color AddressbarColor plugin (mobile)
Cookies $q.cookies (SSR-compatible)
Local Storage $q.localStorage (reactive)
Session Storage $q.sessionStorage (reactive)
Meta / SEO useMeta() (SSR-compatible meta tags)
Bottom Sheet $q.bottomSheet()
Dialog (Plugin) MessageBox ElMessageBox $q.dialog() (fully customizable)
Loading (Plugin) Loading.service() ElLoading.service() $q.loading.show()
Notify (Plugin) Message / Notification ElMessage / ElNotification $q.notify() (unified)

9. CSS Utility Classes

Category Element UI Element Plus Quasar
Typography Minimal Minimal text-h1text-h6, text-subtitle1, text-body1, text-caption, text-overline
Color text-primary, bg-positive, text-white, etc.
Spacing q-pa-xsq-pa-xl, q-mx-md, q-mt-lg, etc.
Flex row, column, wrap, justify-center, items-center, self-end, flex-center, etc.
Visibility hidden-* responsive classes Same gt-xs, lt-sm, xs, sm-and-up, etc.
Shadows shadow-1shadow-24, no-shadow
Borders rounded-borders, no-border-radius
Positioning absolute, relative, fixed, fullscreen, float-left, etc.
Sizing full-width, full-height, fit, etc.

10. Icon Support

Feature Element UI Element Plus Quasar
Built-in Icons Element Icons (font) @element-plus/icons-vue (SVG components) ❌ (choose your icon set)
Material Icons
Material Symbols
Font Awesome
Ionicons
MDI
Eva Icons
Themify
Line Awesome
Bootstrap Icons
SVG Icon Support ✅ (component-based) ✅ (SVG use, img, component)
Custom Icon Set
Icon Count ~280 ~280 Depends on chosen set (1,000s available)

11. Internationalization (i18n)

Feature Element UI Element Plus Quasar
Supported Locales ~55 ~55 ~40+
Runtime Switch ✅ (via ConfigProvider or global) $q.lang.set(langPack)
Day.js Integration ❌ (Moment.js optional) ✅ (Day.js) ❌ (uses own date utils or date-fns)
Plural Forms ❌ (handled by vue-i18n)
Integration with vue-i18n

12. Form Validation

Feature Element UI Element Plus Quasar
Validation Library async-validator async-validator Built-in rules system
Inline Rules ✅ via rules prop ✅ via rules prop ✅ via rules prop (array of functions)
Custom Validators
Regex Rules ✅ (via async-validator) ✅ (custom function)
Async Validation ✅ (return Promise)
Form-level Validate form.validate() formRef.validate() form.validate()
Reset Fields resetFields() resetFields() reset()
Scroll to Error scrollToField() ❌ (manual)
Error Display Below form item Below form item Below field / floating / tooltip
Lazy Validation lazy-rules prop

13. Table Feature Deep Comparison

Table Feature Element UI Element Plus Quasar
Fixed Columns fixed fixed ✅ (CSS sticky)
Fixed Header height prop sticky
Sorting sortable sortable sortable
Multi-column Sort
Filtering ✅ Column filters filter prop + method
Selection (Single/Multi)
Expandable Rows
Tree Data ❌ (use expand + tree)
Custom Columns (Slots) ✅ Scoped slots ✅ Scoped slots ✅ Scoped slots (body-cell-[name])
Row Drag & Drop ❌ (third-party)
Virtual Scrolling ✅ (Table V2) virtual-scroll
Server-side Pagination ✅ (manual) ✅ (manual) @request event (first-class)
Loading State v-loading v-loading loading prop
No Data Slot no-data slot
Dense Mode size="small/mini" size="small/large" dense prop
Grid Mode (Cards) grid prop
Fullscreen fullscreen prop
Column Visibility Toggle visible-columns
Row Click row-click row-click @row-click
Separator Style separator (horizontal, vertical, cell, none)
Wrap Cells wrap-cells
Column Templates Scoped slots Scoped slots Header/Body/Footer cell scoped slots
Summary Row show-summary show-summary ❌ (use bottom-row slot)
Span Method (Merge) span-method span-method ❌ (manual with body slot)
Column Resizing ✅ (Table V2)

14. Transition / Animation

Feature Element UI Element Plus Quasar
Built-in Transitions el-fade-in, el-zoom-in-center, el-zoom-in-top, etc. Same + more ✅ 20+ transitions (slide-right, fade, jump-up, scale, rotate, flip-left, etc.)
Transition Duration Fixed Fixed Customizable
CSS Animation Classes Limited Limited ✅ Animate.css integration
Morph v-morph / morph() util

15. Accessibility (a11y)

Feature Element UI Element Plus Quasar
ARIA Attributes Partial ✅ Improved ✅ Good
Keyboard Navigation Partial ✅ Improved
Focus Management Partial
Screen Reader Basic Improved Good
High Contrast
WCAG Compliance Partial Better Good

16. Developer Experience

Feature Element UI Element Plus Quasar
Documentation Quality ✅ Good ✅ Good ✅ Excellent (very detailed)
Playground ✅ Element Plus Playground ✅ CodePen/Codandsandbox starters
DevTools Vue DevTools Vue DevTools Vue DevTools
Starter Templates ✅ Official starters
IDE Support Vetur Volar (official) Volar
Type Inference Partial ✅ Full ✅ Good
Discord / Community GitHub issues Discord + GitHub ✅ Discord (very active) + Forum
Figma / Sketch Kit ✅ Community
Upgrade Guide N/A ✅ Migration from Element UI ✅ Upgrade guide per version

17. Performance

Feature Element UI Element Plus Quasar
Tree Shaking Plugin-based (babel-plugin-component) ✅ Native ESM ✅ Automatic
On-demand Import ✅ (with plugin) ✅ (native + unplugin) ✅ (auto-detected by CLI)
Virtual Scrolling ✅ (V2 components) ✅ (QVirtualScroll, QTable, QSelect)
Lazy Loading Image component Image component ✅ QImg + QIntersection
Code Splitting Manual Manual ✅ Auto (CLI manages routes)
Gzip Size (full) ~200 KB ~220 KB ~100–150 KB (typical SPA)

18. Mobile / Touch Support

Feature Element UI Element Plus Quasar
Touch Gestures ✅ (swipe, pan, hold, repeat)
Pull to Refresh QPullToRefresh
Swipeable Drawer QDrawer (swipe to open/close)
Bottom Sheet $q.bottomSheet()
Responsive Design Basic grid Basic grid ✅ Comprehensive (layout + grid + CSS helpers)
Cordova Integration ✅ First-class
Capacitor Integration ✅ First-class
Native-like Components ✅ (spinners, pull-refresh, drawer, etc.)
Platform-specific Styling ✅ (detect iOS/Android, adapt)
Addressbar Color ✅ Plugin

19. Desktop App Support

Feature Element UI Element Plus Quasar
Electron Integration ❌ (manual) ❌ (manual) quasar dev -m electron
Electron Preload Scripts N/A N/A ✅ Built-in
Electron Builder N/A N/A ✅ (packager or builder)
Title Bar Component QBar

20. Summary Matrix

Dimension Element UI Element Plus Quasar
Best For Legacy Vue 2 admin panels Vue 3 admin panels / dashboards Full-stack apps, multi-platform
Component Count ~55 ~70+ ~80+ components + directives + plugins
Learning Curve Low Low Medium (more concepts)
Flexibility Medium Medium High
Opinionatedness Medium Medium High (framework-level)
Admin Template Ecosystem Huge (vue-element-admin, etc.) Growing Moderate
Mobile Readiness ❌ Poor ❌ Poor ✅ Excellent
Enterprise Adoption Very High (China) Growing Growing
Long-term Viability ❌ Declining (Vue 2 EOL) ✅ Active ✅ Active
Unique Strengths Mature ecosystem, huge community Modern Vue 3, TS, CSS vars Multi-platform, CLI, touch, SSR, PWA
Weaknesses Vue 2 only, no mobile, no TS Desktop-focused, no CLI Steeper learning curve, smaller admin ecosystem

21. Migration Path

Element UI (Vue 2) ──→ Element Plus (Vue 3)   [Component API ~80% compatible]
Element UI (Vue 2) ──→ Quasar v2 (Vue 3)      [Full rewrite needed]
Element Plus ──────→ Quasar v2                  [Full rewrite needed]

Element UI → Element Plus Migration Notes:

  • Most component names stay the same (el-*)
  • Icon system changed from font to SVG components
  • Some props renamed
  • Event names changed to kebab-case
  • size values changed (minismall)
  • Vue 3 Composition API compatible

To Quasar Migration:

  • Completely different component names (Q* prefix)
  • Different API philosophy (more prop-driven, less slot-heavy)
  • Need to learn Quasar CLI and project structure
  • Gain: multi-platform support, utilities, plugins

Bottom Line:

  • Element UI: Legacy choice for Vue 2. Don't start new projects with it.
  • Element Plus: Best for Vue 3 admin dashboards / internal tools with a familiar API. Desktop-focused.
  • Quasar: Best for multi-platform apps (web + mobile + desktop + PWA) from a single codebase. More of a framework than a library. Steeper learning curve but vastly more capable for complex/multi-platform projects.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment