zoukankan      html  css  js  c++  java
  • 如何写好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字体库中对应图标的宽度不一样。

    源码下载

  • 相关阅读:
    敏捷之一:以终为始
    Rails non browser app高级篇-capistrano/daemon部署
    ios 5下设置屏幕方向为landscape
    Android敏捷开发实践(连载)
    Rails+Mongodb的一个重要技巧:如何得到last N Records?
    在macos x上 编译jzmq 3.x
    计划缓冲区
    转载程序员的十层楼
    特权账户是什么?
    如何管理公司的共享iPad?
  • 原文地址:https://www.cnblogs.com/cqhaibin/p/7822109.html
Copyright © 2011-2022 走看看