ionic 平台

Ionic 平台(Platform)完全实战指南

(Ionic 7+,判断设备、方向、尺寸、暗黑模式、键盘等所有场景)

1. 注入和基本使用(99% 场景都这么写)

import { Platform } from '@ionic/angular';

constructor(private platform: Platform) {}

ngOnInit() {
  // 常用判断写在这里
  console.log('是手机?', this.platform.is('mobile'));        // true
  console.log('是平板?', this.platform.is('tablet'));
  console.log('是 iOS?', this.platform.is('ios'));
  console.log('是 Android?', this.platform.is('android'));
  console.log('是桌面浏览器?', this.platform.is('desktop'));
  console.log('是 PWA?', this.platform.is('pwa'));
  console.log('是横屏?', this.platform.isLandscape());
  console.log('是竖屏?', this.platform.isPortrait());
}

2. 最常用判断合集(直接复制)

需求代码写法说明
只在真机上执行if (this.platform.is('capacitor') || this.platform.is('cordova'))浏览器里不执行原生代码
只在 iPhone 上执行if (this.platform.is('iphone'))包括 iPhone + iPad
只在 Android 手机上执行if (this.platform.is('android') && this.platform.is('mobile'))排除平板
判断是暗黑模式if (this.platform.is('dark'))自动跟随系统
判断是否刘海屏/安全区if (this.platform.is('ios') && parseInt(this.platform.platforms()[0].split('ios')[1] || '0') >= 11)粗暴但有效
页面准备好后执行(推荐)this.platform.ready().then(() => { ... })比 ngOnInit 更保险

3. 动态监听(屏幕旋转、暗黑模式切换等)

// 监听屏幕方向变化
this.platform.resize.subscribe(() => {
  console.log('当前方向:', this.platform.isLandscape() ? '横屏' : '竖屏');
});

// 监听暗黑模式切换(超实用)
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
  const dark = e.matches;
  document.body.classList.toggle('dark', dark);
});

4. 键盘处理(输入框不被遮挡!)

import { Keyboard } from '@ionic/angular';

ngOnInit() {
  // 键盘弹出时自动上推页面(默认开启,无需代码)
  // 如果你手动关了,可以这样重新打开:
  this.keyboard.setResizeMode('native'); // 或 'ionic'

  // 监听键盘高度(自定义处理)
  this.keyboard.onKeyboardWillShow().subscribe(e => {
    console.log('键盘弹出,高度:', e.keyboardHeight);
    document.documentElement.style.setProperty('--keyboard-height', `${e.keyboardHeight}px`);
  });

  this.keyboard.onKeyboardWillHide().subscribe(() => {
    document.documentElement.style.removeProperty('--keyboard-height');
  });
}
/* 配合键盘高度做底部固定按钮 */
ion-footer {
  margin-bottom: var(--keyboard-height, 0);
  transition: margin-bottom 0.3s;
}

5. 安全区(刘海屏、iPhone X 底部小黑条)—— 2025 必写!

/* global.scss 全局写一次即可 */
ion-content {
  --offset-bottom: env(safe-area-inset-bottom);
  --offset-top: env(safe-area-inset-top);
}

/* 底部固定按钮自动避开小黑条 */
ion-footer {
  padding-bottom: env(safe-area-inset-bottom);
  padding-bottom: constant(safe-area-inset-bottom); /* iOS < 11.2 兼容 */
}
<!-- 页面内容自动避开刘海 -->
<ion-content class="ion-padding" fullscreen>
  <!-- fullscreen 会自动加上 --offset-top -->
</ion-content>

6. 平台样式自动切换(一行代码搞定)

<!-- 自动根据平台切换图标 -->
<ion-icon name="arrow-back" mode="ios"></ion-icon>
<ion-icon name="arrow-back-sharp" mode="md"></ion-icon>

<!-- 或者用 CSS 变量(推荐) -->
<ion-icon [name]="platform.is('ios') ? 'heart' : 'heart-sharp'"></ion-icon>

7. 终极封装(推荐放 utils 或 service)

// platform.util.ts
import { Platform } from '@ionic/angular';
import { Injectable } from '@angular/core';

@Injectable({ providedIn: 'root' })
export class DeviceUtil {
  constructor(private platform: Platform) {}

  isIOS() { return this.platform.is('ios'); }
  isAndroid() { return this.platform.is('android'); }
  isMobile() { return this.platform.is('mobile'); }
  isRealDevice() { return this.platform.is('capacitor') || this.platform.is('cordova'); }
  isDarkMode() { return window.matchMedia('(prefers-color-scheme: dark)').matches; }
}

8. 一句话总结

// 任何页面最前面都写这几行就够了
await this.platform.ready();
if (this.platform.is('ios')) { /* iOS 特有 */ }
if (this.platform.is('android')) { /* Android 特有 */ }

这样写出来的 App,无论 iPhone 16、华为、小米折叠屏、iPad、Web 端、PWA,全部完美适配!

需要我发你一个「完整适配所有机型 + 刘海屏 + 暗黑模式 + 键盘不遮挡」的 Ionic 模板页面吗?一句话就发~

文章已创建 2588

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部