在前端页面开发中,下拉框是常用的交互组件,原生的<select>标签样式受浏览器限制难以自定义,因此很多场景需要使用纯css编写自定义下拉框。下面会详细介绍实现思路和具体代码。

基础HTML结构搭建
首先需要搭建下拉框的基础结构,包含一个触发按钮和下拉选项列表,结构如下:
<div class="dropdown">
<button class="dropdown-btn">请选择选项</button>
<ul class="dropdown-list">
<li class="dropdown-item">选项一</li>
<li class="dropdown-item">选项二</li>
<li class="dropdown-item">选项三</li>
<li class="dropdown-item">选项四</li>
</ul>
</div>
基础CSS样式编写
接下来给下拉框添加基础样式,首先设置外层容器的定位,隐藏默认的下拉列表,再设置按钮和选项的基础样式:
/* 外层容器相对定位,作为下拉列表的定位参照 */
.dropdown {
position: relative;
width: 200px;
margin: 20px;
}
/* 触发按钮样式 */
.dropdown-btn {
width: 100%;
height: 40px;
padding: 0 15px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
text-align: left;
cursor: pointer;
font-size: 14px;
/* 添加右侧小箭头 */
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='%23999' d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 10px center;
background-size: 12px;
}
/* 下拉列表默认隐藏 */
.dropdown-list {
position: absolute;
top: 45px;
left: 0;
width: 100%;
max-height: 0;
overflow: hidden;
border: 1px solid #eee;
border-radius: 4px;
background-color: #fff;
list-style: none;
padding: 0;
margin: 0;
transition: max-height 0.3s ease;
z-index: 10;
}
/* 下拉选项样式 */
.dropdown-item {
height: 36px;
line-height: 36px;
padding: 0 15px;
font-size: 14px;
cursor: pointer;
}
/* 选项 hover 效果 */
.dropdown-item:hover {
background-color: #f5f5f5;
}
实现下拉交互效果
现在需要实现点击按钮显示下拉列表,再次点击隐藏的交互,这里使用css的:focus-within伪类实现,不需要额外写js代码:
/* 当容器内的元素获得焦点时,显示下拉列表 */
.dropdown:focus-within .dropdown-list {
max-height: 200px;
border-color: #ccc;
}
/* 按钮获得焦点时的样式 */
.dropdown-btn:focus {
outline: none;
border-color: #409eff;
}
这里给按钮添加tabindex="0"属性,让按钮可以获得焦点,修改后的按钮代码如下:
<button class="dropdown-btn" tabindex="0">请选择选项</button>
实现选项选中效果
接下来实现点击选项后,按钮显示选中内容,同时下拉列表隐藏的效果,这里需要配合少量js实现:
// 获取所有下拉选项
const dropdownItems = document.querySelectorAll('.dropdown-item');
// 获取触发按钮
const dropdownBtn = document.querySelector('.dropdown-btn');
// 给每个选项绑定点击事件
dropdownItems.forEach(item => {
item.addEventListener('click', function() {
// 把选项内容赋值给按钮
dropdownBtn.textContent = this.textContent;
// 移除按钮的焦点,触发下拉列表隐藏
dropdownBtn.blur();
});
});
常见问题优化
- 如果需要下拉框支持搜索过滤,可以在按钮上方添加输入框,结合js过滤选项列表
- 如果下拉列表内容过多,可以设置固定高度并添加滚动条,修改
.dropdown-list的样式:max-height: 200px; overflow-y: auto; - 如果需要适配移动端,可以调整按钮和选项的字体大小,提升点击区域面积
注意:使用:focus-within实现的下拉框,点击页面其他区域时也会自动收起下拉列表,符合用户的使用习惯,如果需要更复杂的交互逻辑,可以结合js优化。
css下拉框css_select样式css_下拉菜单前端样式修改时间:2026-07-05 09:39:28