表单模块可以分为两部分:一是表单的布局,也就是规范表单元素单元的排列位置;二是表单元素,如:输入框、单选、复选、列表组件、搜索组件等,由于列表组件、搜索组件不是单纯的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字体库中对应图标的宽度不一样。