阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 无障碍访问设计

无障碍访问设计

作者:陈川 阅读数:1232人阅读 分类: ECharts

无障碍访问设计的重要性

无障碍访问设计确保所有用户都能平等地获取和使用数字产品。对于数据可视化库ECharts来说,这意味着要考虑色盲用户、键盘导航、屏幕阅读器兼容性等问题。良好的无障碍设计不仅能满足法规要求,更能扩大用户群体,提升产品包容性。

颜色对比度与色盲友好设计

ECharts图表中颜色使用需要满足WCAG 2.1 AA级标准,即文本和背景的对比度至少达到4.5:1。对于色盲用户,应避免仅靠颜色区分数据:

option = {
  color: [
    // 避免红绿色组合
    '#4E79A7', // 蓝色
    '#F28E2B', // 橙色
    '#E15759', // 红色
    '#76B7B2', // 蓝绿色
    '#59A14F'  // 绿色
  ],
  series: [{
    type: 'pie',
    data: [
      {value: 1048, name: '搜索引擎'},
      {value: 735, name: '直接访问'},
      // 为每个数据项添加图案
      {value: 580, name: '邮件营销', itemStyle: { 
        color: {
          image: document.createElement('canvas'),
          repeat: 'repeat'
        }
      }}
    ]
  }]
};

ARIA属性与屏幕阅读器支持

通过ARIA属性让屏幕阅读器能够正确解读图表内容:

option = {
  aria: {
    enabled: true,
    label: {
      description: '这是一个展示季度销售额的柱状图,横轴表示季度,纵轴表示销售额'
    },
    decal: {
      show: true
    }
  },
  xAxis: {
    type: 'category',
    data: ['Q1', 'Q2', 'Q3', 'Q4'],
    axisLabel: {
      ariaLabel: '季度'
    }
  },
  yAxis: {
    type: 'value',
    axisLabel: {
      ariaLabel: '销售额'
    }
  }
};

键盘导航支持

确保用户可以通过键盘操作图表:

myChart.on('keydown', function (params) {
  const keyCode = params.event.keyCode;
  // 左右箭头切换数据系列焦点
  if (keyCode === 37 || keyCode === 39) {
    const series = myChart.getModel().getSeries();
    // 实现焦点切换逻辑
  }
  // 空格或回车键查看详情
  if (keyCode === 32 || keyCode === 13) {
    const focusedItem = getFocusedItem();
    showTooltip(focusedItem);
  }
});

高对比度模式

提供高对比度主题选项:

// 高对比度主题
const highContrastTheme = {
  backgroundColor: '#000',
  color: ['#FFF', '#FF0', '#0FF'],
  textStyle: {
    color: '#FFF'
  },
  axisLine: {
    lineStyle: {
      color: '#FFF'
    }
  }
};

// 应用主题
echarts.registerTheme('high-contrast', highContrastTheme);
myChart.setOption({
  theme: 'high-contrast'
});

动态描述与数据表格

为图表提供替代的数据表格展示:

function generateDataTable(option) {
  const table = document.createElement('table');
  table.setAttribute('role', 'presentation');
  table.setAttribute('aria-label', '图表数据表格');
  
  option.series.forEach(series => {
    series.data.forEach(dataItem => {
      const row = table.insertRow();
      row.insertCell().textContent = dataItem.name;
      row.insertCell().textContent = dataItem.value;
    });
  });
  
  return table;
}

// 将表格插入到图表容器附近
chartContainer.appendChild(generateDataTable(option));

动画与闪烁控制

避免可能引发癫痫的快速闪烁动画:

option = {
  animationDuration: 2000, // 适当延长动画时间
  animationEasing: 'linear',
  series: [{
    type: 'pie',
    animationType: 'scale', // 使用平缓的缩放动画
    animationDelay: function (idx) {
      return idx * 200; // 错开动画开始时间
    }
  }]
};

响应式设计与缩放

确保图表在不同缩放级别下保持可用:

window.addEventListener('resize', function() {
  myChart.resize();
  // 根据窗口大小调整字体
  const baseFontSize = Math.max(12, window.innerWidth / 100);
  myChart.setOption({
    textStyle: {
      fontSize: baseFontSize
    },
    axisLabel: {
      fontSize: baseFontSize * 0.8
    }
  });
});

触控设备优化

为触控设备提供更大的点击区域:

option = {
  series: [{
    type: 'pie',
    selectedMode: 'single',
    selectedOffset: 20, // 扩大选中偏移量
    itemStyle: {
      borderWidth: 2,
      borderColor: '#fff'
    },
    emphasis: {
      itemStyle: {
        borderWidth: 4 // 悬停时增加边框
      }
    }
  }],
  tooltip: {
    triggerOn: 'click|mousemove|touchstart' // 支持多种触发方式
  }
};

多语言与本地化

支持多语言描述和标签:

const i18n = {
  en: {
    title: 'Sales Report',
    legend: ['Product A', 'Product B']
  },
  zh: {
    title: '销售报告',
    legend: ['产品A', '产品B']
  }
};

function setLanguage(lang) {
  myChart.setOption({
    title: {
      text: i18n[lang].title
    },
    legend: {
      data: i18n[lang].legend
    }
  });
}

性能与渐进增强

确保在低性能设备上也能基本使用:

const useSimpleMode = detectLowPerformanceDevice();

option = {
  series: [{
    type: 'line',
    progressive: useSimpleMode ? 200 : 400,
    progressiveThreshold: useSimpleMode ? 1000 : 2000,
    large: useSimpleMode,
    largeThreshold: useSimpleMode ? 100 : 200,
    // 简化数据采样
    sampling: useSimpleMode ? 'average' : 'none'
  }]
};

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌