0.写在前面
当有要上传文件需要的时候常会用到<input type="file">
,但它默认的样式确实有些影响使用体验......
上传图片<input type="file" name="fn">
在谷歌浏览器使用该标签的样式
再看一个我通过修改CSS实现的样式:
呃,虽然只是个没什么特色的绿底白字的样式,但是总比初始的感觉好吧... 言归正传,当你明白了修改
input type="file"
按钮的原理后,自然可以设计出更佳的样式。
1.修改原理(分步讲解)
<div class="filebutton"><div>上传图片</div><input type="file" name="fn"></div>
这是html中的内容,文本和input
标签被一个class
为filebutton
的div
标签包裹起来,其中文本“上传图片”也被一个单独的div
标签包裹起来,这里使用div
标签的原因是:便于之后更改按钮大小。
先看下未加css的效果:
现在我们先来改下包裹文字的
div
样式:
.filebutton div{
font-size: 25px;
background: #00ff7f;
color: white;
padding: 10px 15px;
}
自然,现在点击“上传图片”这块区域是不管用的,现在要做的就是使“选择文件”的响应区域与之重合。
尝试将“选择文件”按钮移入“上传图片”区域:
.filebutton{
position: relative;
}
.filebutton input{
position: absolute;
top: 0;
}
“上传图片”这按钮太长了,理想的状态是使他的宽度随文本长度而变,且我们可以使用
padding
等属性调整,于是父div
里加上display: inline-block
:
.filebutton{
position: relative;
display: inline-block;
}
宽度也调整好了,但总不能使用这个样子的按钮吧,那就将它透明度设置为'0'隐藏起来(
opacity: 0;
):
.filebutton input{
position: absolute;
top: 0;
opacity: 0;
}
现在看起来似乎没什么问题了,但实际上这个按钮现在的响应区域有很大问题:实际响应区域
现在增大
input
中的font-size
来增大响应区域:
.filebutton input{
position: absolute;
top: 0;
opacity: 0;
font-size: 100px;
}
现在按钮内所有区域都能响应了,但你会发现,按钮外的很大一部分区域也会响应...
注释掉opacity:0
来看看现在的真实效果:
.filebutton input{
position: absolute;
top: 0;
/*opacity: 0;*/
font-size: 100px;
}
实际上这句文字所在行才是真正的响应区域,也许你已经有对策了,在父
div
里设置"overflow:hidden"
.filebutton{
position: relative;
display: inline-block;
overflow: hidden;
}
响应区域调整完成。
最后取消掉
opacity:0
的注释,大功告成!
2.完整CSS代码
.filebutton{
position: relative;
display: inline-block;
overflow: hidden;
}
.filebutton input{
position: absolute;
top: 0;
opacity: 0;
font-size: 100px;
}
.filebutton div{
font-size: 25px;
background: #00ff7f;
color: white;
padding: 10px 15px;
}
这样设置也有不好的地方,选择文件后不会像之前一样文字显示选中了哪个文件,但没关系,将鼠标在按钮处停滞一会就可以知道选中了什么文件:
若你有其他的修改方法,欢迎一起讨论~
网友评论