Iframe Generator

iframe 可访问性指南

全面了解如何提升 iframe 的可访问性,确保所有用户都能顺畅使用

键盘可访问性

确保内容可通过键盘访问:

  • 合理设置 tabindex 属性
  • 实现键盘焦点管理
  • 提供键盘快捷键
  • 确保焦点顺序合理

键盘访问示例:

// 焦点管理器实现
class IframeFocusManager {
  constructor(iframe) {
    this.iframe = iframe;
    this.focusableElements = [];
    this.currentFocusIndex = -1;
    
    this.init();
  }

  init() {
    // 设置 iframe 可聚焦
    this.iframe.setAttribute('tabindex', '0');
    
    // 监听键盘事件
    this.iframe.addEventListener('keydown', (e) => {
      switch(e.key) {
        case 'Tab':
          e.preventDefault();
          this.handleTabKey(e.shiftKey);
          break;
        case 'Escape':
          this.exitIframe();
          break;
      }
    });

    // 监听焦点变化
    this.iframe.addEventListener('focus', () => {
      this.updateFocusableElements();
    });
  }

  updateFocusableElements() {
    const doc = this.iframe.contentDocument;
    this.focusableElements = Array.from(
      doc.querySelectorAll(
        'a[href], button, input, textarea, select, [tabindex]:not([tabindex="-1"])'
      )
    );
  }

  handleTabKey(isShiftKey) {
    if (this.focusableElements.length === 0) return;
    
    this.currentFocusIndex = isShiftKey ? 
      (this.currentFocusIndex - 1 + this.focusableElements.length) % 
        this.focusableElements.length :
      (this.currentFocusIndex + 1) % this.focusableElements.length;
    
    this.focusableElements[this.currentFocusIndex].focus();
  }

  exitIframe() {
    this.iframe.blur();
    window.focus();
  }
}

视觉可访问性

提升视觉可访问性的关键点:

  • 确保足够的颜色对比度
  • 支持文字缩放
  • 适配高对比度模式
  • 提供焦点指示器
  • 支持深色模式

视觉优化示例:

:root {
  --focus-ring-color: #2563eb;
  --focus-ring-width: 3px;
}

/* 高对比度模式适配 */
@media (forced-colors: active) {
  :root {
    --focus-ring-color: CanvasText;
  }
}

.iframe-container {
  /* 确保边框可见 */
  border: 1px solid currentColor;
  
  /* 焦点状态样式 */
  &:focus-within {
    outline: var(--focus-ring-width) solid var(--focus-ring-color);
    outline-offset: 2px;
  }
}

/* 深色模式支持 */
@media (prefers-color-scheme: dark) {
  .iframe-container {
    background-color: #1a1a1a;
    border-color: #404040;
  }
}

/* 支持文字缩放 */
.iframe-content {
  font-size: 1rem; /* 16px */
  line-height: 1.5;
  
  @media (max-width: 768px) {
    font-size: calc(14px + 0.5vw);
  }
}

屏幕阅读器支持

优化屏幕阅读器体验:

  • 提供描述性的 title 属性
  • 使用 ARIA 标签和属性
  • 确保内容结构语义化
  • 提供替代文本

ARIA 属性示例:

<div 
  role="region"
  aria-label="嵌入内容区域"
  class="iframe-container"
>
  <iframe
    title="产品演示视频"
    src="https://example.com/video"
    aria-describedby="iframe-description"
  ></iframe>
  
  <div id="iframe-description" class="sr-only">
    这是一个展示产品主要功能的演示视频,
    时长3分钟,包含字幕
  </div>
  
  <!-- 加载状态提示 -->
  <div 
    role="status"
    aria-live="polite"
    class="loading-indicator"
  >
    正在加载内容...
  </div>
  
  <!-- 错误提示 -->
  <div
    role="alert"
    aria-atomic="true"
    class="error-message hidden"
  >
    内容加载失败,请稍后重试
  </div>
</div>

<style>
  .sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    border: 0;
  }
</style>

移动设备可访问性

优化移动设备访问体验:

  • 确保触摸目标足够大
  • 支持手势操作
  • 适配不同屏幕尺寸
  • 优化触摸反馈

移动适配示例:

.iframe-container {
  /* 确保触摸目标大小合适 */
  min-height: 44px;
  min-width: 44px;
  
  /* 触摸反馈 */
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
  
  /* 防止双击缩放 */
  touch-action: pan-x pan-y;
}

/* 响应式布局 */
@media (max-width: 768px) {
  .iframe-container {
    margin: 1rem 0;
    border-radius: 8px;
    
    /* 适应不同设备方向 */
    @media (orientation: landscape) {
      max-height: 80vh;
    }
  }
  
  /* 增大按钮点击区域 */
  .control-button {
    padding: 12px;
    margin: 4px;
    
    &::before {
      content: '';
      position: absolute;
      top: -8px;
      right: -8px;
      bottom: -8px;
      left: -8px;
    }
  }
}

可访问性提示: 定期进行可访问性测试,使用辅助工具和屏幕阅读器验证功能。收集用户反馈持续改进可访问性。