移动端适配示例

移动端优化系统概览

全面的移动设备表单优化方案,实现跨设备的一致用户体验

此示例演示如何使用kinlink API实现移动端表单优化。通过设备检测响应式布局调整移动端交互优化,确保表单在各种移动设备上都能提供最佳的用户体验。

移动端适配核心功能

  • 📱 设备检测:自动识别移动设备类型和特性
  • 🔧 布局优化:针对小屏幕调整字段布局和间距
  • ✏️ 输入优化:优化虚拟键盘和输入体验
  • 👆 触控友好:增大按钮尺寸,优化触控交互
  • 🎨 视觉调整:适配移动端的视觉元素和字体大小
  • 性能优化:减少不必要的动画和复杂效果

关键功能

  • 检测移动设备类型和屏幕尺寸
  • 动态调整表单布局和样式
  • 优化移动端输入体验
  • 增强触控交互友好性

代码示例

/**
* 示例8: 移动端适配
* 功能:检测移动设备并优化表单布局和交互
*/
(function () {
kinlink.events.on(kinlink.FormEvents.FORM_LOADED, () => {
  try {
    // 移动设备检测
    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
      navigator.userAgent
    );
    const isTablet = /iPad|Android.*(?!.*Mobile)/i.test(navigator.userAgent);
    const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;

    // 获取设备信息
    const deviceInfo = {
      isMobile: isMobile,
      isTablet: isTablet,
      isTouchDevice: isTouchDevice,
      screenWidth: window.screen.width,
      screenHeight: window.screen.height,
      viewportWidth: window.innerWidth,
      viewportHeight: window.innerHeight,
      pixelRatio: window.devicePixelRatio || 1,
    };

    console.log('设备信息:', deviceInfo);

    // 如果是移动设备,应用移动端优化
    if (isMobile || isTablet || isTouchDevice) {
      applyMobileOptimizations(deviceInfo);
    }

    // 创建设备信息显示面板
    createDeviceInfoPanel(deviceInfo);

    // 监听屏幕方向变化
    window.addEventListener('orientationchange', () => {
      setTimeout(() => {
        handleOrientationChange();
      }, 100);
    });

    // 监听窗口大小变化
    window.addEventListener('resize', () => {
      handleWindowResize();
    });

  } catch (error) {
    console.error('移动端适配初始化失败:', error);
  }
});

// 应用移动端优化
function applyMobileOptimizations(deviceInfo) {
  const formElement = document.querySelector('.ant-form');
  if (!formElement) return;

  // 添加移动端样式类
  formElement.classList.add('mobile-optimized');

  // 创建移动端样式
  const mobileStyles = document.createElement('style');
  mobileStyles.textContent = `
    .mobile-optimized {
      font-size: 16px !important; /* 防止iOS缩放 */
    }
    
    .mobile-optimized .ant-form-item {
      margin-bottom: 20px !important; /* 增加间距 */
    }
    
    .mobile-optimized .ant-input,
    .mobile-optimized .ant-select-selector,
    .mobile-optimized .ant-picker {
      min-height: 44px !important; /* 触控友好的最小高度 */
      font-size: 16px !important;
      padding: 12px !important;
      border-radius: 8px !important;
    }
    
    .mobile-optimized .ant-btn {
      min-height: 44px !important;
      font-size: 16px !important;
      padding: 12px 20px !important;
      border-radius: 8px !important;
    }
    
    .mobile-optimized .ant-form-item-label {
      font-size: 16px !important;
      font-weight: 500 !important;
      margin-bottom: 8px !important;
    }
    
    /* 小屏幕适配 */
    @media (max-width: 768px) {
      .mobile-optimized {
        padding: 16px !important;
      }
      
      .mobile-optimized .ant-form-item {
        margin-bottom: 24px !important;
      }
      
      .mobile-optimized .ant-col {
        width: 100% !important;
        flex: none !important;
      }
    }
    
    /* 横屏适配 */
    @media (orientation: landscape) and (max-height: 600px) {
      .mobile-optimized .ant-form-item {
        margin-bottom: 16px !important;
      }
    }
  `;
  document.head.appendChild(mobileStyles);

  // 设置特定字段的移动端优化
  optimizeSpecificFields();

  // 优化数字输入
  optimizeNumericInputs();

  // 添加移动端特定功能
  addMobileSpecificFeatures();
}

// 优化特定字段
function optimizeSpecificFields() {
  // 邮箱字段设置为email类型
  const emailField = kinlink.formApi.getFieldElement('文字列__1行__3');
  if (emailField) {
    const emailInput = emailField.querySelector('input');
    if (emailInput) {
      emailInput.type = 'email';
      emailInput.autocomplete = 'email';
    }
  }

  // 电话字段设置为tel类型
  const phoneField = kinlink.formApi.getFieldElement('文字列__1行__2');
  if (phoneField) {
    const phoneInput = phoneField.querySelector('input');
    if (phoneInput) {
      phoneInput.type = 'tel';
      phoneInput.autocomplete = 'tel';
    }
  }

  // 日期字段优化
  ['日期_1', '日期_2'].forEach(fieldCode => {
    const dateField = kinlink.formApi.getFieldElement(fieldCode);
    if (dateField) {
      const dateInput = dateField.querySelector('input');
      if (dateInput) {
        dateInput.autocomplete = 'bday';
      }
    }
  });
}

// 优化数字输入
function optimizeNumericInputs() {
  const numericFields = document.querySelectorAll('input[type="number"]');
  numericFields.forEach(input => {
    input.inputMode = 'numeric';
    input.pattern = '[0-9]*';
  });
}

// 添加移动端特定功能
function addMobileSpecificFeatures() {
  // 防止双击缩放
  const viewport = document.querySelector('meta[name="viewport"]');
  if (viewport) {
    viewport.content = 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no';
  }

  // 添加触摸反馈
  const touchElements = document.querySelectorAll('button, .ant-btn, .ant-input, .ant-select');
  touchElements.forEach(element => {
    element.addEventListener('touchstart', function() {
      this.style.opacity = '0.7';
    });
    
    element.addEventListener('touchend', function() {
      setTimeout(() => {
        this.style.opacity = '1';
      }, 150);
    });
  });
}

// 创建设备信息显示面板
function createDeviceInfoPanel(deviceInfo) {
  const infoPanel = document.createElement('div');
  infoPanel.style.cssText = `
    position: fixed;
    top: 10px;
    right: 10px;
    background: rgba(0,0,0,0.8);
    color: white;
    padding: 10px;
    border-radius: 6px;
    font-size: 12px;
    z-index: 1000;
    max-width: 200px;
  `;

  infoPanel.innerHTML = `
    <div><strong>设备信息</strong></div>
    <div>移动设备: ${deviceInfo.isMobile ? '是' : '否'}</div>
    <div>平板设备: ${deviceInfo.isTablet ? '是' : '否'}</div>
    <div>触控设备: ${deviceInfo.isTouchDevice ? '是' : '否'}</div>
    <div>屏幕: ${deviceInfo.screenWidth}×${deviceInfo.screenHeight}</div>
    <div>视口: ${deviceInfo.viewportWidth}×${deviceInfo.viewportHeight}</div>
    <div>像素比: ${deviceInfo.pixelRatio}</div>
  `;

  document.body.appendChild(infoPanel);

  // 5秒后自动隐藏
  setTimeout(() => {
    infoPanel.style.opacity = '0';
    infoPanel.style.transition = 'opacity 0.5s';
    setTimeout(() => {
      if (infoPanel.parentNode) {
        infoPanel.parentNode.removeChild(infoPanel);
      }
    }, 500);
  }, 5000);
}

// 处理屏幕方向变化
function handleOrientationChange() {
  console.log('屏幕方向已改变');
  kinlink.formApi.showMessage('info', '屏幕方向已改变,已自动调整布局', 2);
}

// 处理窗口大小变化
function handleWindowResize() {
  console.log('窗口大小已改变:', window.innerWidth + 'x' + window.innerHeight);
}
})();

使用说明

要使用此功能,只需将代码复制到您的kinlink自定义JavaScript中。代码会自动检测移动设备并应用相应的优化。建议在移动设备上测试效果。

完整代码请下载查看:

8-移动端适配.js

注意事项

移动端适配涉及CSS样式修改,请确保样式不会与现有的主题冲突。建议在不同设备和方向上充分测试表单的显示效果。

API参考

此示例使用了以下kinlink API:
  • kinlink.events.on(eventName, callback) - 注册事件监听器

  • kinlink.FormEvents.FORM_LOADED - 表单加载完成事件

  • kinlink.formApi.getFieldElement(fieldCode) - 获取字段DOM元素

  • kinlink.formApi.showMessage(type, message, duration) - 显示消息提示