Advertisement

Taro小程序兼容H5 CSS 样式问题

阅读量:

Taro小程序兼容H5 CSS 样式问题

记录在实际开发过程中,所遇到的Taro小程序CSS兼容H5的问题。


文章目录

  • Taro小程序兼容H5 CSS 样式问题
  • 一、rpx、rem单位转换
  • 二、公共组件在引用地方被样式污染
  • 三、box-sizing
  • 四、H5底部会有白色快级
  • 五、Taro css 不要使用标签选择器
  • 六、Image 图片处理,最好加一个 className 在 Image 上
  • 七、AtModal 组件样式不兼容 H5
  • 八、使用 AtIcon 组件 size 设置
  • 九、Taro Ui AtInput 组件
  • 总结

一、rpx、rem单位转换

  1. css文件样式处理
    Taro本身就已经通过 postcss-pxtransform 实现兼容不同端的单位转换,下面是一部分配置信息;
    config/index编译配置文件中添加H5配置
    Taro 官方参考文档
    postcss-pxtransform 配置参考文档
复制代码
      h5: {
    ...
    pxtransform: {
      ...
      enable: true,
      config: {
        platform: 'h5',
        designWidth: 750,
        rootValue: 16,
        onePxTransform: true, // 设置 1px 是否需要被转换
        unitPrecision: 5, // rem 单位允许的小数位
        propList: ['*'], // 允许转换的属性
        selectorBlackList: [], // 黑名单里的选择器将会被忽略,不做转换处理
        replace: true, // 直接替换而不是追加一条进行覆盖
        mediaQuery: false, // 允许媒体查询里的 px 单位转换
        minPixelValue: 0 // 设置一个可被转换的最小 px 值
      }
    }
      }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
  1. 在节点style 中使用了 px 作为单位
复制代码
     <View style={{ width: Taro.pxTransform(100)}}></View>
    
    
      
    
  1. Taro UI 第三方库单位多端转换
    参考文档
复制代码
      h5: {
    esnextModules: ['taro-ui'],
      }
    
    
      
      
      
    

二、公共组件在引用地方被样式污染

公共组件在引用地方重写样式,记得将父级 className 放在重写的 css 外层,避免 A 页面 调转 B页面,造成样式污染。

三、box-sizing

box-sizing 属性在不同平台的默认值可能不同,这可能导致布局差异。在 CSS 中,box-sizing: border-box; 确保了元素的总宽度和高度包括内容、内边距和边框,而不仅仅是内容。

  1. 开发时随手不上
复制代码
    box-sizing: border-box;
    
    
      
    
  1. 全局样式修改
复制代码
    * {
       box-sizing: border-box;
     }
    
    
      
      
      
    

四、H5底部会有白色快级

在高度塌陷的情况下,高度塌陷造成的 子元素 hight 大于 父级的 hight, 并且超出页面的 hight时,并且使用了position: absolute,在 H5的场景下会出现底部有空白,在小程序端是正常的。

五、Taro css 不要使用标签选择器

在开发过程中,发现有些同学为了方便,使用标签选择器来添加样式:如 ViewImage等标签,因为在不同的端,打包后标签会转为各端适配的标签;
下面表格为小程序和h5端 ViewImage转化不同的标签:

View Image
小程序 <view></view> <image></image>
H5 <taro-view-core><div></div></taro-view-core> <taro-image-core><img /></taro-image-core>

可以看出在小程序中,转化的不是W3C的标签,至于为什么,不细说了;在H5中,会在外层多包裹一层 taro-[tag]-core,如果使用标签选择器添加css样式,在H5中,会选择不到你要处理的元素节点,尽量使用 className 来选择元素节点。

六、Image 图片处理,最好加一个 className 在 Image 上

使用 Image 标签最好加一个 className 处理图片大小,因为在 H5 打包后,会在 img 标签外加一个 taro-image-core 标签, 如果通过继承上一个 View 标签的宽高,在微信小程序是正常的,在 H5 打包中 taro-image-core 会有一个默认的值,通过标签选择器修改 imageimg 的宽高,图片是会正常的但是外层的 taro-image-core 会有默认的值,将元素撑开。

七、AtModal 组件样式不兼容 H5

H5 中,AtModal 组件转为 H5 包含 taro-scroll-view-coretaro-button-core 多个组件,其都包含默认样式,

  1. 建议使用 Taro.showModal
  2. 修改 AtModal 全局样式
复制代码
    .at-modal__action {
     taro-button-core {
       margin-top: 0;
       border-radius: 0;
       background-color: #fff;
       border: none;
       color: #333;
     }
    
     taro-button-core::after {
       border: none;
     }
    
     taro-button-core:nth-last-child(1) {
       color: #6190E8;
     }
    
     taro-button-core:nth-last-child(1)::after {
       z-index: 30;
       border-radius: 0;
       border-left-width: 1px;
       border-left-style: solid;
       border-left-color: rgb(229, 229, 229);
     }
    }
    
    .at-modal__footer::before {
     z-index: 30;
     border-top-width: 1px;
     border-top-style: solid;
     border-top-color: rgb(229, 229, 229);
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

八、使用 AtIcon 组件 size 设置

AtIcon 组件中,props 有一个 size 参数作为图标的大小,在转为 H5 端后,size 的计算会有问题,fontsize 会为空,需要再 className 中设置 fontsize

tips : 同一个图标的 value 在微信的图标和H5的图标可能会存在差异。

九、Taro Ui AtInput 组件

AtInput 在微信小程序中 type=phone 时,在小程序端手机号加密带有 * 号可以正常显示,在 H5 中会校验格式,不显示。

总结

小程序和 H5 样式兼容存在的最大问题,就是因为一个是 W3C标准一个自定的标签,Taro在处理多端时,会存在元素节点的差异,导致在不同的端样式存在差异;在处理样式兼容问题时,你会发现大多数的CSS都是可以兼容的,你只要处理标签元素的就行;更痛苦的是第三方组件、及组件的兼容处理。
以上就是在处理Taro小程序兼容H5过程中遇到的CSS问题,js和组件兼容问题下篇文章在做记录。

全部评论 (0)

还没有任何评论哟~