表单模块可以分为两部分:一是表单的布局,也就是规范表单元素单元的排列位置;二是表单元素,如:输入框、单选、复选、列表组件、搜索组件等,由于列表组件、搜索组件不是单纯的css组件,所以暂且没有实现。
一、表单布局的实现
表单布局分为:表单容器、行、表单元素组(包含元素标题、元素)。并且实现根据屏幕进行自适应。示例效果如下:
从示例效果可以看出,布局会根据浏览器大小实现自适应。自适应代码如下:
@import '../mixins/breakpoints'; .f-form-container{ @extend .border-sizing; margin-top: $form-row-space; > .f-form-row{ display: block; white-space: nowrap; margin: 0px; padding: 0px; font-size: 0px; } > .f-form-row + .f-form-row{ margin-top: $form-row-space; } &.fluid{ //自适应 xs = md -1 @include media-breakpoint-max('xs'){ .f-form-group{ display: block; margin: 0px; + .f-form-group{ margin-top: get-space(lg); } } } } }
首先对容器内部的f-form-row(表单行)进行了Magin-top的设置。然后增加了fluid类名,用于控制此表单列表是否需要支持自适应效果 。
二、表单元素的实现(部分)
表单元素只实现的input、checkbox、radio等三个基本元素类型。
2.1 input元素
对Input元素主要实现了前缀和后缀的能力,其中前后缀中的内容可以任意宽度,现在引入的为font-awesome的web字体库。其实check和radio的图标也是来至于font-awesome。代码如下:
.f-form-control{ display: inline-block; width: 100%; padding: $form-input-padding; border: 1px solid $form-border-color; font-family: $font-family; font-size: $font-size; line-height: $line-height; border-radius: $radius-width-base; outline: none; resize: none; &:focus{ border-color: $form-border-focuscolor; } } .f-input-addon{ //图标 display: inline-block; font-size: $font-size; //line-height可以解决两个inline-block高度不致的问题(字体类型不一样的情况下) line-height: $line-height; padding: $form-input-padding; border: 1px solid $form-border-color; background-clip: padding-box; &:after{ //解决fa与输入框字体一致的问题 content: ''; display: inline-block; } } //addon position .f-form-group{ &.addon-before{ .f-input-addon{ border-radius: $radius-width-base; border-right-width: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; } .f-form-control{ border-top-left-radius: 0px; border-bottom-left-radius: 0px; } } &.addon-after{ .f-input-addon{ border-radius: $radius-width-base; border-left-width: 0px; border-top-left-radius: 0px; border-bottom-left-radius: 0px; } .f-form-control{ border-top-right-radius: 0px; border-bottom-right-radius: 0px; } } } //处理input宽度占了100%的问题 .f-form-group{ &.addon-before, &.addon-after{ display: inline-table; .f-input-addon, .f-form-control{ display: table-cell; } } }
其中遇到两个比较棘手的问题处理方案:
1. addon和control两个字体类型不致,导致在相同字体大小的情况下,两个容器的高度表现不一致。所以我就用了行高(line-height)来解决此问题
2. 由于control默认的宽度为100%,而加入了addon之后,会导致control的宽度溢出的现象,所以我就用了table-cell来解决此问题。
2.2. checkbox和radio元素
示例代码只列出了checkbox的,其radio与此相同,就只改变了图标而已:
.f-form-control{ &.checkbox{ > input{ display: none; &:checked{ + .checkbox-icon{ @extend .fa-check-square-o; } } } > .checkbox-icon{ @extend .vertical-middle; @extend .fa; @extend .fa-square-o; width: 16px; height: 16px; font-size: $font-size-md; margin-right: get-space('lg'); } > .checkbox-desc{ font-size: $font-size; @extend .vertical-middle; } } }
由于引入的为font-awesome字体库,所以就控制了icon宽度,因为checkbox的选中与不选中的状态,fa的web字体库中对应图标的宽度不一样。