zoukankan      html  css  js  c++  java
  • 表单自定义样式

    总结自定义表单样式的控件,涉及到一些css伪类伪元素知识

    css组合选择符

    css组合选择符在自定义表单控件中扮演着连接的作用,便于控制元素样式,css3中有四种组合选择符。

    后代选择器 :以空格分离,选择后代相匹配的元素;#div p 选择的是#div下所有的p元素

    子元素选择器 :以大于号分离,选择子元素相匹配的元素;#div>p 选择的是#div下直接子元素为p元素

    相邻兄弟选择器 :以加号分离,选择紧接的元素,二者有相同父级,#div+p选择的是#div相邻的p,只是第一个,因为第一个相邻的

    后续兄弟选择器 :以波浪线分离,选择所有相邻兄弟元素,都有相同的父级,#div~p 选择的是#div相邻的所有的p元素

    伪类和伪元素

    伪类 通过选择器找到不存在DOM树中的信息以及一些css选择器获得不到的信息,一般用冒号开头

    常见的伪类

      anchors伪类                                           
    a:link      //未访问的链接                              
    a:visited   //已访问的链接
    a:hover     //鼠标滑过的链接
    a:active    //已选中的链接

    css-伪类
    :first-child  //元素的第一个子元素
    :last-child   //元素的最后一个子元素
    :nth-child(n) //元素的第n个子元素
    :first-letter //常用作文本,选择元素的第一个字母
    :first-line   //常用作文本,选择元素的第一行
    :checked      //选中的表单元素,比如radio Checkbox option
    :disabled     //禁用的表单元素
    :focused      //元素输入后具有焦点的元素

    伪元素 在DOM树中创建一些抽象的元素,不存在与文档语言中,css为区分伪类和伪元素,伪元素为::

    常见的伪元素有

      ::before 作为元素的第一个子节点插入DOM中
      ::after 作为元素的左右一个子节点插入DOM中  //常常与content相匹配生成内容,这里content有点意思,后面详细说

    label标签

    此标签表示用户界面中项目的标题,是内联元素inline,通常关联表单控件,或者放入其中

      //直接嵌套型
      <label>click <input type='text' id='user' name='username'></label>
      //for绑定id型
      <label for='user'>click</label>   
      <input type='text' id='user' name='username'>

    除了绑定这些控件,还搭配选择组

    optgroup

    <optgroup label='fruit'>

    自定义控件样式的实现

    主要原理:

    • 隐藏原生的input控件

    • 使用label,对label添加样式,使其代替原来的控件

    因为,label可以关联到所指定的控件,因而既可以为label添加样式,显示出控件样子;又可以使checkbox有原来的动态(即单选、多选)

    雪碧图和图标字体

    雪碧图

    css图像合成技术,主要用来弄小图标的,雪碧图直接合成在一张图片上;作用:减少过多的文件请求,减少http请求。

    图标字体

    font-awesome

    代码部分

    方法一: 利用checked和:after

    HTML结构

      <div id="first">
            Checkbox控件<br>
            <input type="checkbox" name="box" id="box1">
            <label for="box1"></label>
            <input type="checkbox" name="box" id="box2">
            <label for="box2"></label>
            <input type="checkbox" name="box" id="box3">
            <label for="box3"></label><br>
            radio控件<br>
            <input type="radio" name="radios" id="radio1">
            <label for="radio1"></label>
            <input type="radio" name="radios" id="radio2">
            <label for="radio2"></label>
      </div>

    CSS样式

         //隐藏原来的input控件
         #first input{     
            display:none;
         }
         /*checkbox  设置label*/
         #first input[type='checkbox']+label{    
            16px;
            height:16px;
            display:inline-block;
            border:1px solid #d9d9d9;
         }
         /*:checked后*/
         #first input[type='checkbox']:checked+label:after{
            content:'2714';                   /*这里的content内容有点意思,另一篇文章中再总结*/
            color:red;
            8px;
            height:8px;
            line-height:8px;
            text-align:center;
            font-size:20px;
         }
         /*radio   设置label*/
         #first input[type='radio']+label{     
            16px;                       
            height:16px;
            display:flex;                     /*这里必须用flex布局,radio的label中的点才会出现*/
            border:1px solid #d9d9d9;
            border-radius:50%;
         }
         /*:checked后*/
         #first input[type='radio']:checked+label::after{
            border-radius: 50%;
                   8px;
                  height: 8px;
                  line-height: 8px;
                  content: '';
                  margin:auto;
                  background: #d73d32;
         }
         /*:checked的input的边框变化*/
         #first input:checked+label{
            border:1px solid #d73d32;
         }

    方法二: 直接利用雪碧图定位获取

    css样式

          /*为所有的label设置宽高 背景*/
          #fisrt input+label{
               16px;
              height:16px;
              border:none;
              display: inline-block;
              background:url('bg.png') no-repeat;
          }   
          /*利用雪碧图定位一开始的CheckBox radio背景*/
          #first input[type='checkbox']+label{
             background-position:-25px -32px;
          }
          #first input[type='radio']+label{
              background-position: -24px -10px;
          }
          /*利用雪碧图定位选中后的CheckBox radio背景*/
          #first input[type='checkbox']:checked+label{
              background-position: -60px -32px;
          }
          #first input[type='radio']:checked+label{
              background-position: -59px -10px;
          }

    总结

    两种方法都是通过设置label的样式代替原生的样式;前者是利用:before,:after来添加内容;后者是利用图片直接添加;这个过程都利用:checked触发动作而生成。

    欢迎访问我的个人网站:博客地址

  • 相关阅读:
    HDU 4832(DP+计数问题)
    mongodb安装与使用
    (hdu step 6.3.7)Cat vs. Dog(当施工方规则:建边当观众和其他观众最喜爱的东西冲突,求最大独立集)
    dba_dependencies查询结果视图
    情绪一点点
    c#基于这些,你已经看到了?(一)-----谁才刚刚开始学习使用
    九. 200创业教训万元获得--“神刻”这是忽悠?
    初步swift语言学习笔记6(ARC-自己主动引用计数,内存管理)
    采用CSS3 Media Query技术适应Android平板屏幕分辨率和屏幕像素密度
    线程的上下文
  • 原文地址:https://www.cnblogs.com/iDouble/p/8560945.html
Copyright © 2011-2022 走看看