程序技术好文:纯原生javascript下拉框表单美化实例教程

简介: 程序技术好文:纯原生javascript下拉框表单美化实例教程

html的表单有很强大的功能,在web早期的时候,表单是页面向服务器发起通信的主要渠道。但有些表单元素的样式没办法通过添加css样式来达到满意的效果,而且不同的浏览器之间设置的样式还存在兼容问题,比如下拉框。


本实例通过创建div和li等元素来生成一个模拟下拉框,以达到美化下拉框的效果。学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础。


先创建一个select元素,作为美化下拉框的数据来源,如下所示:


[/span>div class="select_wrap" id="selectWrap"

[/span>dl

[/span>dt

[/span>dd

[/span>select id="selectElem"

[/span>option value="1"

[/span>option value="2"

[/span>option value="3"

[/span>option value="4"

[/span>option value="5"

[/span>option value="6"





既然是做一个下拉框美化的效果,那肯定是需要用一些css样式来实现。读者可以根据自己有喜好编写,也可以直接复制以下代码:


.select_wrap{


Width</span>:800px;


margin:30px auto;


}


.select_wrap dt{


float:left;


Width</span>:120px;


line-Height</span>:36px;


text-align:right;


font-size:14px;


}


.select_wrap dd{


margin-left:130px;


line-Height</span>:36px;


}


.select_wrap input【type=text】,.select_wrap input【type=password】{


Height</span>:24px;


line-Height</span>:22px;


padding:0 5px;


border:1px solid #aaa;


border-radius:2px;


}


.select_wrap .btn{


padding:0 20px;


color:#fff;


cursor:pointer;


line-Height</span>:30px;


border:none;


margin-right:20px;


background:#108ee9;


}


.select_container{


position:relative;


display:inline-block;


}


.input_container:{


position:relative;


}


.input_container::after{


content:"";


position:absolute;


top:15px;


right:8px;


display:inline-block;


Height</span>:0px;


border:6px solid transparent;


border-top-color:#ccc;


pointer-events:none;


}


.input_container input{


Height</span>:30px;


line-Height</span>:28px;


padding:0 5px;


border:1px solid #aaa;


border-radius:4px;


}


.input_container //代码效果参考:http://www.jhylw.com.cn/063729577.html

input:focus{

border-color:#129cff;


outline:none;


box-shadow:0 0 6px #65bfff;


}


.select_container ul{


position:absolute;


top:35px;


Width</span>:100%;


margin:0;


padding:0;


background:#fff;


border-radius:4px;


box-shadow:0 0px 5px #ccc;


}


.select_container li{


list-style:none;


font-size:12px;


line-Height</span>:30px;


padding:0 10px;


cursor:pointer;


}


.select_container li:hover,.select_container li.cur{


background:#dbf0ff;


}


前期工作做好之后,可以开始编写javascript代码了。按照惯例,还是把功能分析为一个一个步骤,再写具体的代码,思路会很清晰。


1. 获取已有的下拉框元素


这里需要获取多个元素,首先通过id获取select元素,再找到select元素的父元素。因为生成的美化下拉框需要放到父元素中。还要获取到select所有的option子节点。如下所示:


//获取下拉框


var eSelect = document.getElementById('selectElem');


//获取下拉框父节点


var eDd = eSelect.parentNode;


//获取下拉框选项


var aOptions = //代码效果参考:http://www.jhylw.com.cn/562235531.html

eSelect.getElementsByTagName('option');

2. 创建美化下拉框元素


先看一下美化后的下拉框,如下图所示:


想一下这个下拉框应该包含哪些元素,一个div元素把所有内容包含在里面;一个input文本框,显示选中的值;input元素还需要一个父级容器div元素;一个ul加一组li元素组成下拉列表。好,知道需要哪些元素了,先来创建文本框部分,如下所示:


//创建美化select容器


var eContainer = document.createElement('div');


eContainer.className = 'select_container';


//创建input父级容器


var eInputCon = document.createElement('div');


eInputCon.className = 'input_container';


//创建input文本框,显示选中的值


var eInput = document.createElement('input');


//设置文本框不能输入


eInput.readOnly = true;


eInput.placeholder = '请选择';


//把文本框放到容器中


eInputCon.appendChild(eInput);


再来创建下拉列表。下拉列表可以创建一个ul元素,通过遍历aOptions下拉框选项,组合成li列表的字符串,通过innerHTML放到ul元素中,实现代码如下:


//创建ul元素,作为下拉列表容器


var eUl = document.createElement('ul');


//声明变量,用于组合下拉列表的字符串


var sLi = '';


//遍历原有下拉框选项


for(let i=0;i{


//判断下拉框是否已打开


if(status){


//下拉框打开则关闭下拉框


eUl.style.display = 'none';


}else{


//下拉框关闭则打开下拉框


eUl.style.display = 'block';


}


//修改下拉框状态


status = +!status;


},false);


可以看到,在eInput元素上点击,可以打开和关闭下拉框了。但选择下拉选项还是无效的。在下拉选项上也绑定click事件


4. 下拉选项绑定click事件,点击时修改下拉框的值,如下所示:


//获取下拉选项列表元素的集合


var eLi = eUl.getElementsByTagName('li');


//遍历下拉列表


for(let i=0;i

//给每一个li元素绑定点击事件


eLi【i】.addEventListener('click',(event)=>{


//修改下拉框状态为已关闭状态


status = 0;


//清除所有列表的class


for(let n=0;n

eLi【n】.className = '';


}


//激活当前列表选中样式


eLi【i】.className = 'cur';


//设置下拉框当前选中值


eUl.dataset.val = eLi【i】.dataset.val;


//还需要把值设置到原select元素上


eSelect.value = eUl.dataset.val;


//触发原select上的函数


typeof eSelect.onchange=='function'&&select.onchange();


//修改eInput元素显示的值


eInput.value = eLi【i】.innerHTML;


//关闭下拉框


eUl.style.display = 'none';


},false);


}


目前为止,功能基本完成。不过只能在选择选项后或再在文本框上点击才能关闭下拉框。所以还需要修改一下功能,在页面其他位置点击时也能关闭下拉框


5. 在document绑定点击事件,用于关闭下拉框。


注意两点:一是在下拉框关闭时需要取消document上的绑定事件;二是eContainer元素上点击时需要阻止冒泡,否则下拉框会打不开了。修改后的代码如下:


//设置下拉框打开状态,0为关闭,1为打开


var status = 0;


//绑定click事件,用于显示下拉列表


eInput.addEventListener('click',event=>{


//判断下拉框是否已打开


if(status){


//下拉框打开则关闭下拉框


eUl.style.display = 'none';


//取消document上的绑定事件


document.removeEventListener('click',closeUl);


}else{


//下拉框关闭则打开下拉框


eUl.style.display = 'block';


//在document上绑定点击事件,用于关闭下拉框


document.addEventListener('click',closeUl,false);


}


//修改下拉框状态


status = +!status;


},false);


//获取下拉选项列表元素的集合


var eLi = eUl.getElementsByTagName('li');


//遍历下拉列表


for(let i=0;i

//给每一个li元素绑定点击事件


eLi【i】.addEventListener('click',(event)=>{


//修改下拉框状态为已关闭状态


status = 0;


//清除所有列表的class


for(let n=0;n

eLi【n】.className = '';


}


//激活当前列表选中样式


eLi【i】.className = 'cur';


//设置下拉框当前选中值


eUl.dataset.val = eLi【i】.dataset.val;


//还需要把值设置到原select元素上


eSelect.value = eUl.dataset.val;


//触发原select上的函数


typeof eSelect.onchange=='function'&&select.onchange();


//修改eInput元素显示的值


eInput.value = eLi【i】.innerHTML;


//关闭下拉框


eUl.style.display = 'none';


//取消document上的绑定事件


document.removeEventListener('click',closeUl);


},false);


}


//绑定到document上关闭下拉框的函数


function closeUl(){


//修改下拉框状态为已关闭状态


status = 0;


//关闭下拉框


eUl.style.display = 'none';


//取消document上的绑定事件


document.removeEventListener('click',closeUl);


}


//阻止冒泡,否则点击时冒泡到document上,会导致下拉框刚打开就关闭


eContainer.addEventListener('click',event=>{


event.stopPropagation();


});


一个美化后的下拉框已经完成,如果动手一步一步实现它,理解应该会更深一些。

相关文章
|
1月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
1月前
|
JavaScript 前端开发 API
探索后端技术:Node.js的优势和实际应用
【10月更文挑战第6天】 在当今数字化时代,后端开发是任何成功软件应用的关键组成部分。本文将深入探讨一种流行的后端技术——Node.js,通过分析其核心优势和实际应用案例,揭示其在现代软件开发中的重要性和潜力。
118 2
|
8天前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
19 3
|
10天前
|
JavaScript 前端开发
利用事件循环提高 JavaScript 程序的性能
本文介绍了事件循环在JavaScript中的工作原理,以及如何通过合理利用事件循环来优化程序性能,包括异步操作、任务优先级和避免阻塞等技巧。
|
10天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
17 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
11天前
|
JavaScript 前端开发 中间件
JS服务端技术—Node.js知识点
本文介绍了Node.js中的几个重要模块,包括NPM、Buffer、fs模块、path模块、express模块、http模块以及mysql模块。每部分不仅提供了基础概念,还推荐了相关博文供深入学习。特别强调了express模块的使用,包括响应相关函数、中间件、Router和请求体数据解析等内容。文章还讨论了静态资源无法访问的问题及其解决方案,并总结了一些通用设置。适合Node.js初学者参考学习。
27 1
|
26天前
|
前端开发 JavaScript 安全
JavaScript前端开发技术
JavaScript(简称JS)是一种广泛使用的脚本语言,特别在前端开发领域,它几乎成为了网页开发的标配。从简单的表单验证到复杂的单页应用(SPA),JavaScript都扮演着不可或缺的角色。
19 3
|
1月前
|
JavaScript 数据安全/隐私保护
2024了,你会使用原生js批量获取表单数据吗
2024了,你会使用原生js批量获取表单数据吗
47 4
|
1月前
|
JavaScript 前端开发
如何使用Vue.js构建响应式Web应用程序
【10月更文挑战第9天】如何使用Vue.js构建响应式Web应用程序