Go to comments

HTML+CSS宝典 HTML进阶 美化表单元素

一、:focus 伪类选择器,表示元素聚焦时的样式

用鼠标点击文本框的时候,文本框外面多了一个蓝色的边框,这是浏览器默认给加的聚焦样式

<a href="">lorem</a>

<input type="text">

<button>提交</button>

检查元素

1. 选中左边,文本框的 input 代码

2. 右边点击 :hov (打开 Force element state)

3. 按照视频里袁老师的方法,选择的是 :focus 后,没有出现浏览器默认的样式,应该是现在的浏览器升级了

现在选择 :focus-visible 是浏览器设置的现默认样式了 

image.png


分析一下,

浏览器默认的聚焦样式有哪些设置

:focus-visible { 

  outline: -webkit-focus-ring-color auto 1px;

1. :focus-visible 前面没有加元素选择器,表示给页面上所有元素都设置了这个聚焦样式

2. outline 表示外边框

3. -webkit-focus-ring-color 是谷歌浏览器特有的颜色

4. auto 表示边框的样式,我们常常设置solid,auto表示自动的,浏览器会根据实际情况设置(边框的四个角会有些弧度)

5. 1px 边框的宽度,设置 auto 的时候边框宽度是无效的


看其他元素聚焦,

按键盘的Tab键(来回切换),聚焦样式是所有元素都有的


tabindex 属性可以控制Tab键的切换顺序,按照 tabindex 属性的数字顺序去切换

<a tabindex="2" href="">lorem</a>

<input tabindex="1" type="text">

<button tabindex="3">提交</button>


浏览器表单元素,默认聚焦的边框样式需要覆盖掉,有那些样式需要覆盖呢?

1. 聚焦的样式可以通过伪类选择器  :focus  来设置

2. 把外边框  outline: none  去掉,input元素聚焦后就没有外边框了

<style>
  input:focus{ 
    outline: none;
  }
</style>

<input type="text">

<textarea name="" cols="30" rows="6"></textarea>


为什么要覆盖浏览器的默认边框样式呢?

1. 不同的浏览器,input 元素默认边框样式不一样

2. 为了在每一个浏览器里面统一,需要覆盖掉浏览器的默认样式


怎么覆盖掉呢?

设置为  outline: none 

或设置为其它值  outline: 1px solid #ff8c8c;  

input:focus{
  outline: 1px solid #ff8c8c;
}

效果不太理想,因为浏览器的默认样式还给加了  outline-offset: 0px; 

input:focus-visible {

  outline-offset: 0px;

}


如果默认边框样式不是 solid 是 auto,这个  outline-offset: 0px  没有效果,不是 auto它就有效了, outline-offset: 0px;  表示外边框的偏移量


我们自己设置  outline-offset:0 px; 

<style>

input:focus{
  outline: 1px solid #ff8c8c;
  outline-offset: 1px; /* 取值从-3~0~6测试一下,就看出来了 */
}

</style>

<input type="text">


outline-offset: 0px; 设置为0效果也不理想,还有默认的边

input{
  outline:none;
  color:#ccc;
}

input:focus{
  outline:1px solid #ff8c8c;
  outline-offset:0;
  color:red;
}


这样定义

input{
  outline: none;
  border: 1px solid #ccc;
}

input:focus{
  border: 1px solid #ff8c8c;
}


二、:checked 伪类选择器,表示单选框或多选框被选中时的样式(特指单选或多选框被选中时的样式)

 :checked  表示被选中,只有单选多选有这个伪类,其他元素就不要用了(就像a元素有自己特有的伪类,爱恨法则)

<style>
  input:checked{
    background: red;
  }
</style>

<p>
  <input type="radio" name="gender" value="female" checked> 女
  <input type="radio" name="gender" value="male"> 男
</p>


单选框背景设置成红色是生效的,但是没有显示效果,

因为单选框和多选框是可替换元素,可替换元素里面有些样式是我们控制不了的


单选框和多选框,几乎没什么样式让我们控制,不能控制样式,这个 :checked 有什么用呢?

看例子,gender 被选中后,设置下一个 label 元素,加号选择选中的是下一个兄弟元素,可以达到意想不到的效果 

<style>
  input:checked + label{
    color:red;
  }
</style>

<input type="radio" name="gender" value="female" checked id="radfemale">
<label for="radfemale">女</label>

<input type="radio" name="gender" value="male" id="radmale">
<label for="radmale">男</label>


总结,新学的两个伪类

:focus

:checked


三、重置表单元素样式的常见方法

常见用法不仅是 :focus、:checked 这两个伪类,还有其它东西


表单元素的样式是浏览器给的,但是每浏览器又不一样,不重置在不同的浏览器看到的效果就不一样,

还有浏览器默认的样式,跟设计稿不一样,基于这些情况都需要对表单样式进行重置


1. 重置文本框 和 textarea


怎么重置呢?

1 .去掉默认边框

2. 去掉聚焦时候的默认样式

3. 写自己的样式

<style>
  
  /* 去掉默认样式 */

  /* 去掉边框 */
  input,textarea,button,select{
    border: none;
  }

  /* 去掉聚焦时候的默认样式 */
  input:focus, textarea:focus, button:focus, select:focus{
    outline: none;
    outline-offset: 0;
  }

  /* 写自己的样式 */

  /* 单行文本框设置灰色边框 */
  input[type="text"], textarea, select{
    border:1px solid #ccc;
  }

  /* 添加聚焦时候的样式 */
  input[type="text"]:focus, textarea:focus{
    border:1px solid #ff8c8c;
  }

  /* 设置按钮 */
  button{
    border: 1px solid #008c8c;
    border-radius: 2px;
  }

</style>

<p>
  <input type="text">
</p>

<p>
  <select name="" id="">
    <option value="">重庆</option>
    <option value="">北京</option>
    <option value="">哈尔滨</option>
  </select>
</p>

<p>
  <textarea name="" id="" cols="30" rows="10"></textarea>
</p>

<p>
  <button>按钮</button>
</p>


2. 设置多行文本框(textarea)是否允许调整尺寸


css控制多行文本框是否允许调整尺寸,怎么来控制呢?resize属性控制调整尺寸

textarea{
  resize: vertical;
}


resize属性有这样一些取值

 resize: both;   默认值,两个方向上都可以调整尺寸

 resize: none;   两个方向上都不可以调整尺寸

 reseze: horizontal;  只有在水平方向上调整尺寸

 resize: vertical;   只在垂直方向上调整尺寸


3. 文本框边缘到内容的距离,


方式一

使用 padding

<style>
  input{
    padding:0 10px;
  }
</style>

<input type="text" value="文本框边缘 到 内容的距离">


方式二

使用 text-indent 表示首行缩进

<style>

  input, textarea{
    text-indent:1em;
  }

</style>

<input type="text" value="文本框边缘 到 内容的距离">

<textarea name="" id="" cols="30" rows="10"></textarea>


3. 控制单选框和多选框的样式


用div元素自己做 单元框 和 多选框

<style>
  .radio{
    width: 12px;
    height: 12px;
    border:1px solid #999;
    border-radius: 50%;
    cursor:pointer; 
    margin:20px;
  }

  /* 选中时的样式 */
  .radio.checked{
    border-color: #ff8c8c;
  }

  /* 用伪元素在里面加一个圈 */
  .radio.checked::after{
    content: "";
    display: block;
    width: 6px;
    height: 6px;
    background: #ff8c8c;
    border-radius: 50%;
    margin-top: 3px;
    margin-left: 3px;
  }
</style>

<div class="radio"></div>
<div class="radio checked"></div>


4. 实现单选框的切换效果


为什么不用div,因为在label里面不允许加div,可以加span

label可以关联一个单选框或多选框

<style>

  /* 1.找到span元素 */
  .radio-item .radio{
    width: 12px;
    height: 12px;
    border:1px solid #ccc;
    border-radius: 50%;
    cursor:pointer;
    display: inline-block;/* span默认是行盒不能设置宽高,这里设置成行块盒  */
  }

  /*
  2.选中的效果
   + 加号选择器,选中的是下一个兄弟元素
   1).span没有选中的效果,radio才有选中的效果
   2).找到选中的input单选框 .radio-item input:checked
   3).找到了之后,再找"选中单选框"的下一个兄弟元素
     类名为.radio的元素
   4).使用伪元素选择器,设置span的样式,加一个after子元素
  */
  .radio-item input:checked + .radio{
    border:1px solid #ff8c8c;
  }
  .radio-item input:checked + .radio::after{
    content: "";
    display: block;
    width: 8px;
    height: 8px;
    background: #ff8c8c;
    border-radius: 50%;
    margin-top: 2px;
    margin-left: 2px;
  }


  /* 
  3.改文字颜色
   ~ 选中的是后面所有的兄弟元素
   1).找到选中的单选框,后面第二个span元素
   2).单选框后面两个都被选中了,第一个span设置文字颜色也没有什么意义
  */
  .radio-item input:checked ~ span{
    color: #ff8c8c;
  }
  /* 
  4.最后精确隐藏input单选框 
  */
  .radio-item input[type="radio"]{
    display: none;
  }

</style>

<p>
  请选择性别:
  <label class="radio-item">
    <input type="radio" name="gender" value="female" checked>
    <span class="radio"></span>
    <span>女</span>
  </label>
  <label class="radio-item">
    <input type="radio" name="gender" value="female">
    <span class="radio"></span>
    <span>男</span>
  </label>
</p>


FirstTime 20220129


四、表单练习

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="reg.css">
<title>注册页面</title>
</head>
<body>

  <div class="form">

    <h1>
      <span>注册</span>
    </h1>

    <div class="form-area">

      <!-- 登录名 -->
      <div class="form-item hasError">
        <input type="text" placeholder="账号">
        <div class="error">
          该昵称已被他人使用
        </div>
      </div>

      <!-- 密码 -->
      <div class="form-item">
        <input type="password" placeholder="密码(6-16个字符组成,区分大小写)">
      </div>

      <!-- 选择框由两个部分组成 -->
      <div class="form-item">

        <!-- 里面分两部分 -->
        <div class="select clearfix">

          <!-- 第一部分左浮动 -->
          <div class="select-item">
            <div class="title">中国大陆</div>
            <ul>
              <li class="active">中国大陆</li>
              <li>中国香港特别行政区</li>
              <li>中国澳门特别行政区</li>
              <li>中国台湾</li>
              <li>美国</li>
              <li>比利时</li>
              <li>澳大利亚</li>
              <li>法国</li>
            </ul>
          </div>

          <!-- 第二部分也是左浮动 -->
          <div class="input">
            <input type="text" placeholder="填写常用的手机号">
          </div>

        </div>
      </div>

      <!-- 里面由两部分组成 -->
      <div class="form-item">
        <input type="text" value="请输入短信验证码">
        <button type="button" class="btn-sncode">点击获取</button>
      </div>

      <!-- 注册协议说明文字 -->
      <div class="readme">
        <label>
          <input type="checkbox">
          <span class="checkbox"></span>
          <span>
            我已同意
            <a href="javascript:;">《哔哩哔哩弹幕网用户使用协议》</a>
            和
            <a href="javascript:;">《哔哩哔哩弹幕网账号中心规范》</a>
          </span>
        </label>
      </div>

      <!-- 按钮 -->
      <div class="form-item">
        <button class="fill" disabled>注册</button>
      </div>

      <!-- 已有账号直接登录 -->
      <div class="readme txtright">
        <a href="javascript:;">已有账号,直接登录 &gt;</a>
      </div>

    </div>

  </div>

</body>
</html>


reg.css

.clearfix::after{
  content: '';
  display: block;
  clear: both;
}

/* 统一设置表单里a元素的颜色,网站上a元素的颜色,往往上统一的 */
.form a{
  color:#00A1D6;
}

.form{
  width: 980px;
  margin: 1em auto;
}
.form h1{
  font-size: 38px;
  border-bottom: 1px solid #ddd;
  height: 20px;
  position: relative;
  margin-bottom: 34px;
}
.form h1 span{
  position: absolute;
  width: 120px;
  height: 38px;
  left: 50%;
  top: -5px;
  margin-left: -60px;
  text-align: center;
  background-color: #fff;
}

/* 表单区域 */
.form-area{
  width: 423px;
  margin: 0 auto;
}

.form-area .form-item{
  margin: 50px 0;
  /* 每个 form-tiem 都是相对定位*/
  position: relative;
}

/* select区域,左右两部分 */
.form-area .select .select-item,
.form-area .select .input{
  float: left;
  height: 40px;
}
.form-area .select .select-item{
  width: 140px;
  border:1px solid #DCDFE6;
  border-radius: 4px;
  box-sizing: border-box;
  position: relative;
  /* 
  圆角边框是一个速写属性
  border-radius 分成
  border-top-left-radius       上左的圆弧半径
  border-top-right-radius      上右的圆弧半径
  border-bottom-right-radius   下右的圆弧半径
  border-bottom-left-radius    下左的圆弧半径

  单独设置
  border-bottom-right-radius:0; 
  border-top-right-radius:0;

  也可以这样,按照次序依次书写
  border-radius:左上 右上 右下 左下;
  */
  border-radius: 4px 0 0 4px;
  border-right: none;
}
.form-area .select .input{
  width: 283px;
}
.form-area .select .input input{
  /* 这里再一次单独的设置,把之前的覆盖掉 */
    border-radius: 0 4px 4px 0;
}

.form-area .select .select-item .title{
  height: 40px;
  line-height: 40px;
  padding: 0 20px;
  color: #909399;
  cursor:pointer;
}

.form-area .select .select-item ul{
  background-color: #fff;
  /*
  最大高度
  意思上如果内容不满256,按照内容为准,
  如果内容超过了256,那么最多久256
  */
  max-height: 256px;
  overflow-y: auto;
  
  position: absolute;
  top:50px;
  left: 0;
  width: 100%;
  box-sizing: border-box;
  border:1px solid #DCDFE6;
  border-radius: 4px;
  color: #606266;
  padding: 10px 0;
  font-size: 14px;
  
  display: none;
}
.form-area .select .select-item ul li{
  height: 34px;
  line-height: 34px;
  padding: 0 20px;
  cursor: pointer;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.form-area .select .select-item ul li.active{
  color:#00A1D6;
  font-weight: 700;;
}
.form-area .select .select-item ul li:hover{
  background-color: #f5f7fa;
}

.form-area .form-item .btn-sncode{
  width: 130px;
  height: 36px;
  position: absolute;
  right: 2px;
  top: 2px;
}

.form-area .readme{
  /* margin-top: -40px; */
  /* 上下都需要缩进距离,直接设置上下负数,左右为0 */
  margin: -40px 0;
  
  font-size: 12px;
}

/* 多选框的效果 */
.form-area .readme .checkbox{
  display: inline-block;
  width: 14px;
  height: 14px;
  border: 1px solid #DCDFE6;
  border-radius: 4px;
  box-sizing: border-box;
}
/* 选中多选框后的效果 */
.form-area .readme input:checked+.checkbox{
  border-color: #00A1D6;
  border-radius: 0;
}
.form-area .readme input:checked+.checkbox::after{
  content: "";
  display: block;
  height: 10px;
  width: 10px;
  margin: 1px;
  /* border-radius: 4px; */
  background: #00A1D6;
}

.form-area .form-item .error{
  position: absolute;
  width: 240px;
  height: 40px;
  line-height: 40px;
  right: -255px;
  top:0;
  color: #f45d90;
  font-size: 12px;
  display: none;
}

/*
如果有错误,
1.就找到.form-item.hasError
2.下面的.form-item.hasError .error
3.显示出来display: block;
*/
.form-area .form-item.hasError .error{
  display: block;
}
.form-area .form-item.hasError input{
  border-color: #f45d90;
}

.form-area .readme input{
  display: none;
}

/* 统一文本框样式 */
input[type="text"], input[type="password"]{
  border: 1px solid #dcdfe6;
  width: 100%;
  box-sizing: border-box;
  border-radius: 4px;
  height: 40px;
  text-indent: 1em;
  font-size: 14px;
  color: #606266;
  font-family: "PingFangSC-Medium;"
}

/* 边框hover效果 */
input[type="text"]:hover, input[type="password"]:hover{
  border-color:#c0c4cc;
}

/* placeholder字体颜色 */
input[type="text"]::placeholder, input[type="password"]::placeholder{
  color:#c0c4cc;
}

/* input聚焦时候颜色 */
input[type="text"]:focus, input[type="password"]:focus{
  border-color:#00a1d6;
}

/* 统一设置按钮(button)样式 */
button{
  height: 40px;
  background-color: #00a1d6;
  color: #fff;
  border-radius: 4px;
  font-size: 14px;
}
button:hover{
  background-color: #33b4de;
}

button.fill{
  width: 100%;
}

.txtright{
  text-align: right;
}

/* 
:disbled 也上一个伪类

button:disabled 意思上按钮禁用状态下他的样式
*/
button:disabled{
  background-color: #f5f5f5;
  color:rgba(0,0,0, .25);
  border: 1px solid #d9d9d9;

  /* not-allowed 表示不允许 */
  cursor:not-allowed;
}


reset.css

/* 
  http://meyerweb.com/eric/tools/css/reset/ 
  v2.0 | 20110126
  License: none (public domain)
*/

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
  margin: 0;
  padding: 0;
  border: 0;
  font-size: 100%; /* 可以理解为1em */
  font: inherit;
  vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
  display: block;
}
body {
  line-height: 1; /* 行高是1 */
}
ol, ul {
  list-style: none;
}
blockquote, q {
  quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
  content: '';
  content: none;
}
table {
  border-collapse: collapse;
  border-spacing: 0;
}

/* 自己添加的a元素初始化 */
a{
  text-decoration: none;
  color: inherit;
}

/* 淘宝的字体设置 */
body{
  font: 14px/1.5 "Helvetica Neue",Helvetica,Arial,"Microsoft Yahei","Hiragino Sans GB","HeitiSC","WenQuanYi Micro Hei",sans-serif;
}

/* 重置表单元素 */
input, textarea, button, select{
  border: none;
}
input:focus,
textarea:focus,
button:focus,
select:focus{
  outline:none;
  outline-offset:0;
}


firstTime 20220130



Leave a comment 0 Comments.

Leave a Reply

换一张