下拉列表

<select>

Introduction

属性
item desc
selected 默认选中当前 <option>
size 显示几个 option;通常不指定,以免影响页面布局
multiple 多选;使用较少
<select name="school" id="school" class="school">
  <option value="">please select your school...</option>
  <option value="guilin">guilin</option>
  <option value="xiamen">xiamen</option>
  <option value="foshan">foshan</option>
  <option value="haikou" selected>haikou</option>
  <option value="dongguan">dongguan</option>
</select>

CSS

Initialization

[] 初始化样式
select {
  appearance: none;
  display: block;
  width: 100%;
  outline: none;
  border: none;
  font: inherit;
  color: inherit;
  background-color: transparent;
  padding: 0 10px;
}
[] 定制样式1 - 不增加元素
.school {
  border: 1px solid #eee;
  padding: 4px 10px;
  background-image: url(../imgs/down.png);
  background-repeat: no-repeat;
  background-position: right 10px top 10px;
}

.school:hover {
  border-color: #f40;
}

JavaScript

  1. 获取元素
  2. 响应事件
事件
item desc
change 选择改变时
const school = document.getElementById("school")
school.addEventListener('change',  ()=> {
    console.log(school.value);
    // ...
})
[] 定制样式2 - 额外增加1个容器、1个遮罩和1个标记
  1. 增加一个容器元素 wrap 包裹表单元素 <select>;wrap 为 相对定位,为 mask 和 marker 提供定位依据
  2. 增加一个遮罩元素 mask,用于显示选中的值;mask 为绝对定位,覆盖 <select>;取消事件响应
  3. 增加一个标记元素 marker,显示上下箭头,用于提示用户操作;marker 为绝对定位到容器右部;取消事件响应;可以是图片或字体图标
  4. 设置 <select> 字体颜色透明;会影响到 <option>,所以需要设置 <option> 颜色为黑色
  5. 增加 JavaScript;一开始获取 <select> 的值给遮罩元素 mask
  6. 为 <select> 增加 change 事件,每次改变时修改遮罩元素 mask 的内容
  7. 其它细节设计,如 高度、:hover、:focus等
  8. 更多设计细节,请参考天猫登录页面淘宝高仿
[] 定制样式3 - 下拉列表 全新定制
[] 主题切换 Theme
<option value="#f40" data-bg="#f40">红色</option>
option[data-bg="#f40"] {
  background-color: #f40;
  color: #fff;
}
const body = document.body
const theme = document.getElementById('theme')
theme.addEventListener('change', () => {
  body.style.background = theme.value
})

Summary & Homework

Summary

Homework

. 使用 <select> 元素完善个人网站的留言板或信息采集表的设计