如何写好CSS系列之表单(form)

巧了我就是萌 提交于 2019-11-29 03:52:00

本文转载于:猿2048网站如何写好CSS系列之表单(form)

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

源码下载

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!