File Input
Thefile class creates a custom-styled file upload button. The file input requires a specific HTML structure.
Basic File Input
<div class="file">
<label class="file-label">
<input class="file-input" type="file" name="resume">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
</label>
</div>
Structure
The file input uses the following structure:file- main containerfile-label- clickable label wrapperfile-input- native file input (hidden)file-cta- call-to-action buttonfile-icon- optional icon containerfile-label- button textfile-name- optional selected filename display
With File Name Display
Show the selected filename:<div class="file has-name">
<label class="file-label">
<input class="file-input" type="file" name="resume">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
No file selected
</span>
</label>
</div>
const fileInput = document.querySelector('.file-input');
const fileName = document.querySelector('.file-name');
fileInput.addEventListener('change', (e) => {
if (e.target.files.length > 0) {
fileName.textContent = e.target.files[0].name;
} else {
fileName.textContent = 'No file selected';
}
});
Colors
Apply color modifiers to the file container:<div class="file is-primary">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Primary file…
</span>
</span>
</label>
</div>
<div class="file is-info has-name">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Info file…
</span>
</span>
<span class="file-name">
document.pdf
</span>
</label>
</div>
<div class="file is-warning">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Warning file…
</span>
</span>
</label>
</div>
<div class="file is-danger">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Danger file…
</span>
</span>
</label>
</div>
Sizes
File inputs come in four sizes:<div class="file is-small">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Small file…
</span>
</span>
</label>
</div>
<div class="file is-normal">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Normal file…
</span>
</span>
</label>
</div>
<div class="file is-medium">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Medium file…
</span>
</span>
</label>
</div>
<div class="file is-large">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Large file…
</span>
</span>
</label>
</div>
Alignment
Centered
<div class="file is-centered">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Centered file…
</span>
</span>
</label>
</div>
Right Aligned
<div class="file is-right">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Right-aligned file…
</span>
</span>
</label>
</div>
<div class="file is-right has-name">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-name">
document.pdf
</span>
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose file…
</span>
</span>
</label>
</div>
Full Width
Make the file input take full width:<div class="file is-fullwidth has-name">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
document.pdf
</span>
</label>
</div>
Boxed Layout
Create a vertical boxed layout:<div class="file is-boxed">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
</label>
</div>
Boxed with File Name
<div class="file is-boxed has-name">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
project-report.pdf
</span>
</label>
</div>
Boxed Sizes
<div class="file is-boxed is-small">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Small boxed
</span>
</span>
</label>
</div>
<div class="file is-boxed is-medium">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-cloud-upload-alt"></i>
</span>
<span class="file-label">
Medium boxed
</span>
</span>
</label>
</div>
<div class="file is-boxed is-large">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-cloud-upload-alt fa-2x"></i>
</span>
<span class="file-label">
Large boxed
</span>
</span>
</label>
</div>
Form Integration
Upload Form
<form>
<div class="field">
<label class="label">Upload your resume</label>
<div class="file has-name is-fullwidth">
<label class="file-label">
<input class="file-input" type="file" name="resume" accept=".pdf,.doc,.docx">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
No file selected
</span>
</label>
</div>
<p class="help">Accepted formats: PDF, DOC, DOCX (max 5MB)</p>
</div>
<div class="field">
<label class="label">Cover letter (optional)</label>
<div class="file has-name is-fullwidth">
<label class="file-label">
<input class="file-input" type="file" name="cover-letter" accept=".pdf,.doc,.docx">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-file-alt"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
No file selected
</span>
</label>
</div>
</div>
<div class="field is-grouped">
<div class="control">
<button class="button is-link" type="submit">Submit Application</button>
</div>
</div>
</form>
Image Upload
<div class="field">
<label class="label">Profile picture</label>
<div class="file is-info is-boxed has-name">
<label class="file-label">
<input class="file-input" type="file" name="profile-pic" accept="image/*">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-camera"></i>
</span>
<span class="file-label">
Upload photo
</span>
</span>
<span class="file-name">
No image selected
</span>
</label>
</div>
<p class="help">JPG, PNG or GIF (max 2MB)</p>
</div>
Multiple Files
<div class="field">
<label class="label">Upload documents</label>
<div class="file has-name is-fullwidth">
<label class="file-label">
<input class="file-input" type="file" name="documents" multiple>
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose files…
</span>
</span>
<span class="file-name">
No files selected
</span>
</label>
</div>
<p class="help">You can select multiple files</p>
</div>
With Validation
<div class="field">
<label class="label">Required document</label>
<div class="file has-name is-fullwidth is-danger">
<label class="file-label">
<input class="file-input" type="file" name="document" required>
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-exclamation-triangle"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
No file selected
</span>
</label>
</div>
<p class="help is-danger">This field is required</p>
</div>
<div class="field">
<label class="label">Verified upload</label>
<div class="file has-name is-fullwidth is-success">
<label class="file-label">
<input class="file-input" type="file" name="verified">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-check"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
verified-document.pdf
</span>
</label>
</div>
<p class="help is-success">File uploaded successfully</p>
</div>
JavaScript Example
Complete example with file name and size display:const fileInput = document.querySelector('.file-input');
const fileName = document.querySelector('.file-name');
const fileContainer = document.querySelector('.file');
fileInput.addEventListener('change', (e) => {
const files = e.target.files;
if (files.length > 0) {
const file = files[0];
const fileSize = (file.size / 1024 / 1024).toFixed(2);
fileName.textContent = `${file.name} (${fileSize} MB)`;
// Remove is-empty class if present
fileContainer.classList.remove('is-empty');
} else {
fileName.textContent = 'No file selected';
fileContainer.classList.add('is-empty');
}
});
Empty State
Hide the filename when no file is selected:<div class="file has-name is-empty">
<label class="file-label">
<input class="file-input" type="file">
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
No file selected
</span>
</label>
</div>
is-empty class hides the file name and makes the button full width.
Accessibility
<div class="field">
<label class="label" id="resume-label">Upload resume</label>
<div class="file has-name is-fullwidth">
<label class="file-label">
<input
class="file-input"
type="file"
name="resume"
aria-labelledby="resume-label"
aria-describedby="resume-help"
accept=".pdf,.doc,.docx"
required
>
<span class="file-cta">
<span class="file-icon">
<i class="fas fa-upload" aria-hidden="true"></i>
</span>
<span class="file-label">
Choose a file…
</span>
</span>
<span class="file-name">
No file selected
</span>
</label>
</div>
<p id="resume-help" class="help">PDF, DOC, or DOCX format, maximum 5MB</p>
</div>
Use the
accept attribute to restrict file types, and always validate file types and sizes on the server side for security.