# 生成规则 ### 简写约定 ```text + m is margin + p is padding + h is height + w is width ``` ### 方向约定 trblxy ```text + y代表上下tb x代表左右lr组合方向 + tblr代表上下左右单方向 + 权重优先级 tblr单项 > xy双向组合 > 四项组合 ``` ### 伪类约定 ```text + 伪类后跟任意属性 hover|link|visited|active|focus|focus-within 等伪类 后接属性 如 hover:c-red active:w-233 ``` ### 媒体查询约定 ```text 内置三种媒体查询 如果需要覆盖或自定义添加 请看进阶使用 sm : '(min-width: 640px)', md : '(min-width: 768px)', lg : '(min-width: 1024px)', xl : '(min-width: 1280px)' 如 sm@bg-fff lg@w-2333 xl@m-t-10 即可在不同屏幕大小中正确使用媒体查询支持全部属性 如需要与伪类配合使用 语法如下 <媒体查询>@<伪类>:<属性> ``` ### 数值约定 ```text + m-16 16代表正数 + m-m-16 -m-16代表负数(部分属性支持) + 数值全部支持小数 如 m-t-0.222vh w-33.333333p ``` ### 单位约定 ```text + p为百分比%的缩写。默认不传为px + v为可变单位 例如 w-10 => 10 / 16 => width: 0.625rem (在配置文件中编写 vToAny 生效) ``` ```javascript const UNIT_ENUM = ['cm', 'mm', 'in', 'px', 'pt', 'pc', 'em', 'ex', 'ch', 'rem', 'vw', 'vh', 'vmin', 'vmax', 'p', 'rpx'] const UNIT_ENUM_STR = UNIT_ENUM.join('|') ``` ### 属性约定 ```text + 大部分属性符合key-value形式,部分属性会兼容简写,如dispaly-flex / d-flex + 部分属性为常用组合属性,如正方形 square-80(width:80px;height:80px) flex-center-center等 ``` ### 详情如下 * 宽或高 #### (w|h)-(数值)(单位)? ```css .w-10p{width:10%} .w-375{width:375px} ``` ```javascript new RegExp(`^[wh]-(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 最大(小)宽(高) #### (min|max)-(h|w)-(数值)(单位)? ```css .max-w-100 {max-width:100px;} .min-w-300rem {min-width:300rem;} .max-h-100vh {max-height:100vh} ``` ```javascript new RegExp(`^(min|max)-[wh]-(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 正方形简写 #### square-(数值)(单位)? ```css .w-10p{width:10%} .w-375{width:375px} .square-80{width:80px;height:80px} ``` ```javascript new RegExp(`^square-(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 内外间距 #### (m|p)-(方向-)?(m|p)(方向-)(m-)?(数值)(单位)? ```css .m-16 {margin:16px} .m-b-32rem{margin-bottom:32rem} .m-x-m-22rem {margin-left:-22rem;margin-right:-22rem;} .p-x-24{padding-left:24px;padding-right:24px} .mx-20{margin-left:20px;margin-right:20px} .px-10{padding-left:10px;padding-right:10px} ``` ```javascript new RegExp(`^[mp](-|)(([trblxy])-)?(m-)?(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 图层高度 #### z-index-(m-)?(数值) ```css .z-index-9{z-index:9} .z-index-m-9{z-index:-9} ``` ```javascript /^z-index-(m-)?(0|[1-9]\d*)$/ ``` * flex 系数 #### flex-(数值|参数) ```css .flex-1{flex:1} .flex-none{flex:none} .flex-auto{flex:auto} ``` ```javascript /^flex-(null|auto|(0|[1-9]\d*))$/ ``` * flex组合属性 #### flex-(主轴参数)-(交叉轴参数) ```css .flex-space-between-center { display:flex; justify-content:space-between; align-items:center; } .flex-center-center { display:flex; justify-content:center; align-items:center; } ``` ```javascript new RegExp(`^flex-(${JUSTIFY_CONTENT_ENUM_STR})-(${ALIGN_ITEMS_ENUM_STR})$`) ``` * flex 换行 #### flex-wrap-(参数) ```css .flex-wrap-inherit{flex-wrap:inherit;} .flex-wrap-initial{flex-wrap:initial;} .flex-wrap-nowrap{flex-wrap:nowrap;} .flex-wrap-wrap-reverse{flex-wrap:wrap-reverse;} .flex-wrap-wrap{flex-wrap:wrap;} ``` ```javascript /^flex-wrap-(inherit|initial|nowrap|wrap|wrap-reverse)$/ ``` * flex主轴 #### justify-content-(主轴参数) ```css .justify-content-space-between {justify-content:space-between;} ``` ```javascript new RegExp(`^justify-content-(${JUSTIFY_CONTENT_ENUM_STR})$`) ``` * flex交叉轴 #### align-items-(交叉轴参数) ```css .align-items-center {align-items:center} ``` ```javascript new RegExp(`^align-items-(${ALIGN_ITEMS_ENUM_STR})$`) ``` * flex轴方向 #### (flex-direction|flex)-(轴方向参数) ```css .flex-direction-column{ flex-direction:column; } .flex-column{ flex-direction:column; } ``` ```javascript /^(flex-direction|flex)-(row|row-reverse|column|column-reverse)$/ ``` * 文字水平对齐 #### (text-align|text)-(参数) ```css .text-align-center {text-align:center} .text-center {text-align:center} ``` ```javascript /^(text-align|text)-(start|end|left|right|center|justify|match-parent)$/ ``` * 行高 #### (lh|line-height)-(((数值)(单位)?)|参数) ```css .lh-14{line-height:14px;} .lh-normal{line-height:normal;} .line-height-14rem{line-height:14rem;} ``` ```javascript new RegExp(`^(lh|line-height)-(((0|[1-9]\\d*)(${UNIT_ENUM_STR})?)|normal|unset|inherit|initial)$`) ``` * 定位 #### position-(定位参数) ```css .position-relative{position:relative} ``` ```javascript /^position-(static|relative|sticky|unset|absolute|fixed|inherit|initial)$/ ``` * 方向定位 #### (方向[trbl]top|right|bottom|left)-(m-)?-(数值)(单位)? ```css .l-283{left:283px;} .top-0px{top:0;} .right-m-672{right:-672px;} ``` ```javascript new RegExp(`^[trbl]-(m-)?(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 字体大小 #### (font-size|fs)-(数值)(单位)? ```css .fs-22{font-size:22px} .font-size-22rem{font-size:22rem} ``` ```javascript new RegExp(`^(font-size|fs)-(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 字体粗细 #### (font-weight|fw)-(参数) ```css .fw-bolder{font-weight:bolder} .font-weight-300{font-weight:300} .fw-900{font-weight:900} ``` ```javascript new RegExp(`^(font-size|fs)-(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 鼠标样式 #### cursor-(参数) ```css .cursor-pointer{cursor:pointer;} ``` ```javascript new RegExp(`^cursor-(${CURSOR_ENUM_STR})$`) ``` * 文字折叠 #### word-break-(参数) ```css .word-break-break-all{word-break:break-all} ``` ```javascript /^word-break-(normal|break-all|keep-all|break-word|inherit|initial|unset)$/ ``` * display #### (display|d)-(参数) ```css .display-none{display:none} .d-flex{display:flex} ``` ```javascript /^(display|d)-(none|inline|block|inline-block|flex|contents)$/ ``` * overflow #### overflow-(xy)?-(参数) ```css .overflow-x-hidden{overflow-x:hidden;} .overflow-auto{overflow:auto;} ``` ```javascript /^overflow(-[xy])?-(hidden|auto|visible|scroll|inherit)$/ ``` * 颜色相关 #### 自带 white transparent blue black 可进行配置 ```javascript new RegExp( `^(?color|c|text|bg|background|border-color|border-c)-(?(#?([a-fA-F0-9]{8}$|[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))|${getColorsKey().join('|')})(-(?1|([1-9]\\d?)))?$`) ``` * 字体颜色 ##### (color|c|text)-?(16进制色[8位,6位,3位]|自定义颜色)(-透明度 8位没有透明度)? ```css .c-red{color:rgba(255,0,0,1)} .color-43ad7f-25{color:rgba(67,173,127,0.25)} ``` * 背景色 ##### (bg|background)-(伪类-)?(16进制色[6位或3位]|自定义颜色)(-透明度)? ```css .bg-black-35{background:rgba(0,0,0,0.35)} .background-active-43ad7f-35:active{background:rgba(67,173,127,0.35)} ``` * 边框色 ##### (border-color|border-c)-(伪类-)?(16进制色[6位或3位]|自定义颜色)(-透明度)? ```css .border-c-black-35{border-color:rgba(0,0,0,0.35)} .border-color-active-43ad7f-35:active{border-color:rgba(67,173,127,0.35)} ``` + 透明度 ### /^opacity-(0-100)$/ ```css opacity-20{ opacity: 0.2 } ``` * 字间距 #### letter-spacing-(数值)(单位)? ```css .letter-spacing-4{letter-spacing:4px} .letter-spacing-4rem{letter-spacing:4rem} ``` ```javascript new RegExp(`^letter-spacing-(m-)?(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 组合属性 circle #### circle 只有一个 ```css .circle{border-radius:50%;} ``` ```javascript /^circle$/ ``` * flex缩放 #### flex-(shrink|grow)-(数值|参数) ```css .flex-grow-1{flex-grow:1} .flex-shrink-0{flex-shrink:0} .flex-shrink-initial{flex-shrink:initial} ``` ```javascript /^flex-(shrink|grow)-((0|[1-9]\d*)|initial|inherit)$/ ``` * flex占用轴空间 #### flex-basis-((数值(单位)?)|其他参数) ```css .flex-basis-20p{flex-basis:20%} .flex-basis-20{flex-basis:20px;} .flex-basis-auto{flex-basis:auto;} ``` ```javascript new RegExp(`^flex-basis-((0|[1-9]\\d*)(${UNIT_ENUM_STR})?|initial|inherit|auto)$`) ``` * 边框宽度 自带实线 黑色 #### (border|border-width|border-w)-(方向-)?(数值)(单位)? ```css .border-2{ border-width: 2px; border-style: solid; border-color: black; } .border-w-x-2em{ border-width: 2em; border-style: solid; border-color: black; } ``` ```javascript new new RegExp(`^(border|border-width|border-w)-([trblxy]-)?(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 边框圆角 #### (border-radius|br)-(数值)(单位)? ```css .border-radius-4{border-radius:4px} .br-20p{border-radius:20%} ``` ```javascript new RegExp(`^(border-radius|br)-(0|[1-9]\\d*)(${UNIT_ENUM_STR})?$`) ``` * 边框类型 #### border-style-(参数) ```css .border-style-dashed{border-style:dashed} ``` ```javascript /^border-style-(none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset|inherit)$/ ``` * 图片填充 #### object-fit-(参数) ```css .object-fit-fill{object-fit:fill} ``` ```javascript /^object-fit-(fill|contain|cover|none|scale-down|inherit|initial|revert|unset)$/ ``` * text-align-last #### text-align-(参数) ```css .text-align-last-right{text-align-last:right;} ``` ```javascript /^(text-align-last|text-last)-(auto|left|right|center|justify|start|end|initial|inherit)$/ ``` * 文本修饰 #### (text-decoration|text)-(参数) ```css .text-decoration-underline{text-decoration:underline} .text-overline{text-decoration:overline} ``` ```javascript /^(text-decoration|text)-(none|underline|overline|line-through|blink|inherit)$/ ``` * 鼠标选择 #### (user-)?select-(参数) ```css .user-select-none{user-select:none} .select-none{user-select:none} .select-auto{user-select:auto} ``` ```javascript /^(user-)?select-(none|auto|text|all|contain|element)$/ ``` * 文字超出换行 #### (text-ellipsis|ellipsis)(-num)? ```css .ellipsis { display:inline-block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap } .ellipsis-2 { overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; } .text-ellipsis-2 { overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; } ``` ```javascript regExp: /^(text-)?ellipsis-[1-9]\d*$/ ``` * 间距 #### gap-((数值(单位)?)|其他参数) ```css .gap-20 { column-gap:20px; row-gap:20px; } .gap-20p { column-gap:20%; row-gap:20%; } .gap-unset { column-gap:unset; row-gap:unset; } ``` ```javascript regExp: /^gap-((<数字><单位>?)|inherit|initial|unset)*$/ ``` * 列间距 #### column-gap-((数值(单位)?)|其他参数) ```css .column-gap-20 { column-gap:20px; } .column-gap-20p { column-gap:20%; } .column-gap-unset { column-gap:unset; } ``` ```javascript regExp: /^column-gap-((<数字><单位>?)|inherit|initial|unset)*$/ ``` * 行间距 #### row-gap-((数值(单位)?)|其他参数) ```css .row-gap-20 { row-gap:20px; } .row-gap-20p { row-gap:20%; } .row-gap-unset { row-gap:unset; } ``` ```javascript regExp: /^row-gap-((<数字><单位>?)|inherit|initial|unset)*$/ ``` #### visibility-(值) ```css .visibility-hidden { visibility: hidden; } .visibility-visible { visibility: visible; } ``` ### 进阶使用 + 关于 overrideRules 可覆盖属性如下 + alignItems + border + borderRadius + borderStyle + boxSizing + circle + color + columnGap + cursor + display + flexBasis + flexDirection + flexJustAli + flexNum + flexShrinkAndGrow + flexWrap + fontSize + fontWeight + gap + height + index + justifyContent + letterSpacing + lineHeight + marginAndPadding + maxHeight + maxWidth + minHeight + minWidth + objectFit + opacity + orientation + overflow + position + rowGap + square + textAlign + textAlignLast + textDecoration + textEllipsis + userSelect + verticalAlign + visibility + width + wordBreak + zIndex ### 说明如下 ```javascript overrideRules: { /** * 如需覆盖自带属性 则属性名 相同 * 此处值 为 object 或者 函数 函数必须返回相同格式的对象 * 函数可接受 自带工具 工具有 * textToRgbText 将16进制颜色 或定义的颜色转为rgba语法 * getColorsKey 获取所有定义的颜色的key数组 * getColors 获取所有定义的颜色的对象 * UNIT_ENUM_STR 捕获单位的正则字符串 * NONNEGATIVE_NUMBER_REGEX_STR 捕获数字的正则字符串 * DIRECTION_MAP 方向定义的 map */ zIndex: ({ textToRgbText, getColorsKey, getColors, UNIT_ENUM_STR, NONNEGATIVE_NUMBER_REGEX_STR, DIRECTION_MAP }) => { return { /** * 此处必须存在 regExp 为正则表达式 或 函数 函数必须返回正则表达式 * 此处必须存在 render 函数 * 入参 为 字符串mathch 正则表达式的结果 (只有匹配上的才会调用render) * render 函数必须返回 name:String order:Number css:Array * 将会使用 render 返回的结果 生成css * 如果导出 num 则会按照num 组内渲染排序 与其他css 排序无关 * 如果捕获组有 unit 会自动处理单位问题 */ regExp: /^zindex-(?m-)?(?0|[1-9]\d*)$/, render ({ groups }) { let { isMinus, num } = groups if (isMinus) { num = 0 - num } return { name: 'zIndex', order: 190, num, css: [`z-index: ${num}] } } } } }, mediaQueries: { // 前面为前缀 后面为媒体属性 // 属性相同则覆盖自带属性 sm: '(min-width: 640px)', md: '(min-width: 768px)', lg: '(min-width: 1024px)', xl: '(min-width: 1280px)' } ```