• uniapp\ taro 如何使用 UnoCSS 原子化css


    unocss-preset-weapp

    相较于 tailwindcss 和 windicssunocss的性能和可扩展性都优于它们

    UnoCSS小程序预设 unocss-preset-weapp

    内置 transformer 用于兼容小程序


    uniapp-vue3 demo 在线地址​playful-gumption-4bb42b.netlify.app/

    使用

    uniapp-vue2

    使用配置与DEMO

    uniapp-vue3

    使用配置与DEMO

    taro for react vue2 vue3

    使用配置与DEMO

    原生微信小程序 wxml

    使用配置与DEMO


    其他

    修改 w h 默认单位

    unocss-preset-weapp,wh默认单位 `rpx`,例如
    1. .text-20 {
    2. font-size: 20rpx;
    3. }
    4. .h-10 {
    5. height: 10rpx;
    6. }
    7. .top-10 {
    8. top: 10rpx;
    9. }
    设置 whRpx为 false,修改默认单位,按 rem 规则递增
    • unocss.config.ts
    1. import presetWeapp from 'unocss-preset-weapp'
    2. export default defineConfig({
    3. presets: [
    4. presetWeapp({
    5. whRpx: false,
    6. }),
    7. ],
    8. })

    1. .text-20 {
    2. font-size: 160rpx;
    3. }
    4. .h-10 {
    5. height: 80rpx;
    6. }
    7. .top-10 {
    8. top: 160rpx;
    9. }

    自定义转换规则

    如需更改默认的转换规则,可通过  transformRules 进行修改
    • unocss.config.js
    1. import presetWeapp from 'unocss-preset-weapp'
    2. import { extractorAttributify, transformerClass } from 'unocss-preset-weapp/transformer'
    3. import { defineConfig } from 'unocss'
    4. const transformRules = {
    5. '.': '-d111-',
    6. '/': '-s111-',
    7. ':': '-c111-',
    8. '%': '-p111-',
    9. '!': '-e111-',
    10. '#': '-w111-',
    11. '(': '-b111l-',
    12. ')': '-b111r-',
    13. '[': '-f111l-',
    14. ']': '-f111r-',
    15. '$': '-r111-',
    16. ',': '-r222-',
    17. }
    18. const { presetWeappAttributify, transformerAttributify } = extractorAttributify({
    19. transformRules
    20. })
    21. export default defineConfig({
    22. presets: [
    23. // https://github.com/MellowCo/unocss-preset-weapp
    24. presetWeapp({
    25. transformRules,
    26. }),
    27. // attributify autocomplete
    28. presetWeappAttributify()
    29. ],
    30. transformers: [
    31. // options 见https://github.com/MellowCo/unocss-preset-weapp/tree/main/src/transformer/transformerAttributify
    32. transformerAttributify({
    33. transformRules,
    34. }),
    35. // options 见https://github.com/MellowCo/unocss-preset-weapp/tree/main/src/transformer/transformerClass
    36. transformerClass({
    37. transformRules,
    38. }),
    39. ],
    40. })

    原子化 css 冲突问题

    例如  tmui,自身有一套 原子化 css,导致与 unocss 冲突

    • unocss.config.ts
    presetWeapp 配置  prefixtransformerAttributify 配置  classPrefix
    1. import presetWeapp from 'unocss-preset-weapp'
    2. import { extractorAttributify, transformerClass } from 'unocss-preset-weapp/transformer'
    3. import { defineConfig } from 'unocss'
    4. const prefix = 'li-'
    5. const { presetWeappAttributify, transformerAttributify } = extractorAttributify({
    6. classPrefix: prefix
    7. })
    8. export default defineConfig({
    9. presets: [
    10. // https://github.com/MellowCo/unocss-preset-weapp
    11. presetWeapp({
    12. prefix
    13. }),
    14. // attributify autocomplet
    15. presetWeappAttributify()
    16. ],
    17. transformers: [
    18. // options 见https://github.com/MellowCo/unocss-preset-weapp/tree/main/src/transformer/transformerAttributify
    19. transformerAttributify(),
    20. // options 见https://github.com/MellowCo/unocss-preset-weapp/tree/main/src/transformer/transformerClass
    21. transformerClass(),
    22. ],
    23. })
    这样冲突问题就解决了
    1. "#333" p="x-6 y-10" w100 h200 class="li-bg-red">
    2. this is a unocss

    transform

    1. class="li-bg-red li-bg-#333 li-p-x-6 li-p-y-10 li-w100 li-200">
    2. this is a unocss

    tm-ui-demo

    css预设

    UnoCSS 文档

    Windi CSS文档

    默认单位 rpx,w-100 => w-100rpx

    渐变背景 (v0.1.12)

    gradients

    <view class="bg-gradient-to-t from-#f39c12/60 via-#2ecc71:80 to-#9b59b6_70"></view>

    animation (v0.1.9)

    参考 windicss-animation @windicss/plugin-animations

    相关动画网站 animate.css animista.net

    • unocss.config.js 自定义动画
    1. import presetWeapp from 'unocss-preset-weapp'
    2. import { defineConfig } from 'unocss'
    3. export default defineConfig({
    4. presets: [
    5. // https://github.com/MellowCo/unocss-preset-weapp
    6. presetWeapp(),
    7. ],
    8. theme: {
    9. // v0.1.9 加入动画预设
    10. // https://github.com/MellowCo/unocss-preset-weapp#animation-v019
    11. // 设置自定义动画
    12. animation: {
    13. keyframes: {
    14. 'my-animation': '{0% {letter-spacing: -0.5em;transform: translateZ(-700px);opacity: 0;}40% {opacity: 0.6;}100% {transform: translateZ(0);opacity: 1;}}',
    15. },
    16. durations: {
    17. 'my-animation': '0.8s',
    18. },
    19. counts: {
    20. 'my-animation': 'infinite',
    21. },
    22. timingFns: {
    23. 'my-animation': 'cubic-bezier(0.215, 0.610, 0.355, 1.000)',
    24. },
    25. },
    26. },
    27. })
    28. class="animate-pulse">
    29. <view class="animate-back-in-down animate-iteration-infinite">view>
    30. <view class="animate-[4s_linear_0s_infinite_alternate_bounce]">view>
    31. .animate--fl-4s_linear_0s_infinite_alternate_bounce-fr- {
    32. -webkit-animation: 4s linear 0s infinite alternate bounce;
    33. animation: 4s linear 0s infinite alternate bounce;
    34. }

    safe-area (v0.1.6)

    classProperties
    p-safepadding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)
    pt-safepadding-top: env(safe-area-inset-top)
    pb-safepadding-bottom: env(safe-area-inset-bottom)
    pl-safepadding-left: env(safe-area-inset-left)
    pr-safepadding-right: env(safe-area-inset-right)

    width and height

    classProperties
    h-1_2
    h-1/2
    h-half
    height: 50%
    w-1_3
    w-1/3
    width: 33.33333%
    h-fullheight: 100%
    width-20width: 20r
    h-xsheight: 180rpx
    预设
    1. export const baseSize = {
    2. 'xs': '180rpx',
    3. 'sm': '220rpx',
    4. 'md': '260rpx',
    5. 'lg': '300rpx',
    6. 'xl': '340rpx',
    7. '2xl': '390rpx',
    8. '3xl': '440rpx',
    9. '4xl': '490rpx',
    10. '5xl': '540rpx',
    11. '6xl': '590rpx',
    12. '7xl': '640rpx',
    13. '8xl': '690rpx',
    14. '9xl': '740rpx',
    15. 'full': '100%',
    16. 'half': '50%',
    17. }

    border

    classProperties
    border-2border-width:2rpx;border-style:solid;
    b-2border-width:2rpx;border-style:solid;
    border-dashedborder-style:dashed
    rounded-1_2
    rounded-1/2
    rounded-half
    border-radius:50%
    rounded-mdborder-radius:12rpx
    预设
    1. export const borderRadius = {
    2. 'DEFAULT': '8rpx',
    3. 'none': '0',
    4. 'sm': '4rpx',
    5. 'md': '12rpx',
    6. 'lg': '16rpx',
    7. 'xl': '24rpx',
    8. '2xl': '32rpx',
    9. '3xl': '48rpx',
    10. 'half': '50%',
    11. 'full': '9999px',
    12. }

    border-color

    classProperties
    border-red-100
    border-red-1
    --un-border-opacity:1; border-color:rgba(254,226,226,var(--un-border-opacity))
    border-opacity-20
    border-op-20
    --un-border-opacity:0.2
    border-black_10
    border-black/10
    border-black:10
    border-color:rgba(0,0,0,0.1)

    color

    classProperties
    op-10
    opacity-10
    opacity:0.1
    color-hex-157
    c-hex-157
    c-[#157]
    --un-text-opacity:1;color:rgba(17,85,119,var(--un-text-opacity))
    c-hex-157_10
    c-hex-157/10
    c-[#157]/10
    c-[#157]:10
    c-[#157]_10
    color:rgba(17,85,119,0.1)
    color-blue,
    color-blue-400,
    c-blue
    --un-text-opacity:1;color:rgba(96,165,250,var(--un-text-opacity))
    text-red-100
    text-red100
    text-red1
    --un-text-opacity:1;color:rgba(254,226,226,var(--un-text-opacity))
    text-red-100_20
    text-red-100/20
    text-red-100:20
    color:rgba(254,226,226,0.2)

    bg

    classProperties
    bg-hex-452233_40
    bg-[#452233]_40
    bg-[#452233]/40
    bg-[#452233]:40
    background-color:rgba(69,34,51,0.4)
    bg-red-100
    bg-red1
    bg-red100
    --un-bg-opacity:1;background-color:rgba(254,226,226,var(--un-bg-opacity))
    bg-teal-100_55
    bg-teal-100/55
    bg-teal-100:55
    background-color:rgba(204,251,241,0.55)
    bg-opacity-45--un-bg-opacity:0.45

    typography

    classProperties
    text-basefont-size:32rpx;line-height:48rpx
    text-100
    text-size-100
    font-size:100rpx
    text-2emfont-size:2em
    font-900,
    font-black
    fw-900
    font-weight:900
    font-leading-2
    leading-2
    line-height:16rpx
    indenttext-indent:48rpx
    indent-2text-indent:16rpx
    indent-1_2
    indent-1/2
    indent-1:2
    text-indent:50%
    indent-lgtext-indent:64rpx
    text-shadow-lg--un-text-shadow:6rpx 6rpx 12rpx var(--un-text-shadow-color, rgba(0,0,0,0.26)),0 0 10rpx var(--un-text-shadow-color, rgba(15,3,86,0.22));text-shadow:var(--un-text-shadow)
    word-spacing-2word-spacing:16rpx
    tracking-2letter-spacing:16rpx
    fontSize预设  text-base
    1. export const fontSize: Theme['fontSize'] = {
    2. 'xs': ['24rpx', '32rpx'],
    3. 'sm': ['28rpx', '40rpx'],
    4. 'base': ['32rpx', '48rpx'],
    5. 'lg': ['36rpx', '56rpx'],
    6. 'xl': ['40rpx', '56rpx'],
    7. '2xl': ['48rpx', '64rpx'],
    8. '3xl': ['60rpx', '72rpx'],
    9. '4xl': ['72rpx', '80rpx'],
    10. '5xl': ['96rpx', '1'],
    11. '6xl': ['120rpx', '1'],
    12. '7xl': ['144rpx', '1'],
    13. '8xl': ['192rpx', '1'],
    14. '9xl': ['256rpx', '1'],
    15. }
    16. text-100 => font-size:100rpx
    textIndent 预设  indent-lg
    1. export const textIndent: Theme['textIndent'] = {
    2. 'DEFAULT': '48rpx',
    3. 'xs': '16rpx',
    4. 'sm': '32rpx',
    5. 'md': '48rpx',
    6. 'lg': '64rpx',
    7. 'xl': '80rpx',
    8. '2xl': '96rpx',
    9. '3xl': '128rpx',
    10. }
    leadings  tracking  word-spacing  indent 计算方式

    indent-2 原为 text-indent: 0.5rem 等于 8px ,

    小程序使用 750rpx 的基准是 2倍px 等于 16rpx ,

    所以计算为 2*0.5*1rem = 2*0.5*16px = 16rpx

    1. indent-2
    2. text-indent: 0.5rem
    3. text-indent: 16rpx
    4. tracking-2
    5. letter-spacing: 0.5rem
    6. letter-spacing:16rpx
    7. word-spacing-2
    8. word-spacing: 0.5rem
    9. word-spacing:16rpx
    10. leadings-2
    11. line-height: 0.5rem
    12. line-height:16rpx

    spacing

    classProperties
    p-2,p2padding:16rpx
    mx-2margin-left:16rpx;margin-right:16rpx
    -m-lgmargin:-36rpx
    pl-10pxpadding-left:10px
    m-10rpxmargin:10rpx
    > 预设
    1. export const spacing = {
    2. 'DEFAULT': '32rpx',
    3. 'none': '0',
    4. 'xs': '24rpx',
    5. 'sm': '28rpx',
    6. 'md': '36rpx',
    7. 'lg': '40rpx',
    8. 'xl': '48rpx',
    9. '2xl': '60rpx',
    10. '3xl': '72rpx',
    11. '4xl': '96rpx',
    12. '5xl': '120rpx',
    13. '6xl': '144rpx',
    14. '7xl': '192rpx',
    15. '8xl': '256rpx',
    16. }

    box-shadow

    预设
    1. export const boxShadow = {
    2. 'DEFAULT': ['var(--un-shadow-inset) 0 1px 3px 0 rgba(0,0,0,0.1)', 'var(--un-shadow-inset) 0 1px 2px -1px rgba(0,0,0,0.1)'],
    3. 'none': '0 0 rgba(0,0,0,0)',
    4. 'sm': 'var(--un-shadow-inset) 0 1px 2px 0 rgba(0,0,0,0.05)',
    5. 'md': ['var(--un-shadow-inset) 0 4px 6px -1px rgba(0,0,0,0.1)', 'var(--un-shadow-inset) 0 2px 4px -2px rgba(0,0,0,0.1)'],
    6. 'lg': ['var(--un-shadow-inset) 0 10px 15px -3px rgba(0,0,0,0.1)', 'var(--un-shadow-inset) 0 4px 6px -4px rgba(0,0,0,0.1)'],
    7. 'xl': ['var(--un-shadow-inset) 0 20px 25px -5px rgba(0,0,0,0.1)', 'var(--un-shadow-inset) 0 8px 10px -6px rgba(0,0,0,0.1)'],
    8. '2xl': 'var(--un-shadow-inset) 0 25px 50px -12px rgba(0,0,0,0.25)',
    9. 'inner': 'inset 0 2px 4px 0 rgba(0,0,0,0.05)',
    10. }
    连体写法
    <view class="shadow-[0px_4px_4px_0px_rgba(237,_0,_0,_1)]"></view>

    flex gap

    classProperties
    flex-basis-1_2flex-basis:50%
    flex-basis-2flex-basis:16rpx
    gap-4grid-gap:32rpx;gap:32rpx
    gap-x-2grid-column-gap:16rpx;column-gap:16rpx;

  • 相关阅读:
    Simulink之输出模块Goto和输入模块From
    containerd 镜像构建工具 -- nerdctl 和 buildkit
    HiSilicon352 android9.0 适配红外遥控器
    【GCC编译优化系列】GCC链接失败的错误提示 undefined reference to ‘xxx‘ 可能还有一种情况你没注意到?
    理解 WebView
    Android原生插件开发-Parameters篇
    linux下编译安装和使用cURL库(含有openssl)
    wxpython的ListCtrl的复选框问题
    vis 右键节点展开菜单
    1022 D进制的A+B
  • 原文地址:https://blog.csdn.net/weixin_51225684/article/details/133670149