我们知道如果使用原生HTML的file组件时,其默认效果是这样的:
这个效果看起来实在是太丑了,那么我们能不能更改一下它的呈现形式呢? 答案是可以的.
我们知道label标签的作用是:当用户点击label标签中的文本时,就会触发label标签for属性中指定的控件(for属性指定了控件id),例如
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<label for="username">用户名</label>
<input id="username" type="text">
</body>
</html>
这个时候,我们点击"用户名"三个字时,就会让input输入框获得焦点,
同理,如果我们把label的for属性指定成input 的id 那么我们是不是就能唤醒文件上传功能了?答案是肯定的
既然<input type='file'/>的功能label也能做,那么我们将input隐藏,给label写样式就好了,隐藏input也不会影响其它元素的布局,因为它不在文档流中继续占据位置. 代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
input[type='file'] {
display: none;
}
label {
padding: 3px;
background-color: black;
color: #ffffff;
cursor: pointer;
font-size: 12px;
}
</style>
</head>
<body>
<label for="upload">上传文件</label>
<input id="upload" type="file">
</body>
</html>
另外,强调一个基本的知识点,行内元素仅仅不支持垂直方向的margin,而padding不管是哪个方向,它都是支持的,所以我们不用将label设置成 display:inline-block 因为在这里我们是通过设置padding 让文字在label中水平垂直居中的.