How to style checkboxes to look like icons
Hello there guys. In my current Laravel project, I had to implement a functionality to mark a user with a checkbox but the checkbox must look like an icon. I found two challenges:
- How can I transform a checkbox into an icon?
- How can I make a dynamic ID for that checkbox?
Today I will show you how to implement this by using jQuery to get dynamic IDs and using Axios to update the DB.
Let’s get started
Step 1:
- Add a checkbox and an Icon element.
{!! Form::checkbox('super', true, null, ['class' => 'super-user-check']) !!} <i class="fa fa-star super-user-icon" aria-hidden="true"></i>
- Add a dynamic ID on the checkbox and the icon (for my case I will use a user id)
<div class="super-user"> {!! Form::checkbox('super', true, null, ['id' => "super-checkbox-$user->id", 'class' => 'form-check-input super-user-check']) !!} <i id="super-star-user-{{ $user->id }}" class="fa fa-star super-user-icon" aria-hidden="true"></i> </div>
Step: 2
- Define two different icons for the checkbox state (checked/unchecked)
- (In my case I will define an icon depending on the value of user DB field starred)
<div class="super-user"> {!! Form::checkbox('super', $user->starred, $user->starred, ['id' => "super-checkbox-$user->id", 'class' => 'form-check-input super-user-check', 'data-user' => $user->id ]) !!} <i id="super-star-user-{{ $user->id }}" class="fa {{ $user->starred ? 'fa-star' : 'fa-star-o' }} super-user-icon" aria-hidden="true"></i> </div>
Step: 3
- Add styles for both elements.
.super-user { position: relative; } .super-user-check { opacity: 0; height: 3rem; width: 3rem; position: absolute; z-index: 2; margin: 0; cursor: pointer; }
Step: 4
On our .js file we need to identify the dynamics id of the checkbox and the icon.
const starredCheckbox = $("[id^='super-checkbox-']"); const starredIcon = $("[id^='super-star-user-']");
Then, we need to know the state of the checkbox (checked/unchecked) to change the icon classes (colored/uncolored)
const starredCheckbox = $("[id^='super-checkbox-']"); const starredIcon = $("[id^='super-star-user-']"); starredCheckbox.change(function () { if ($(this).prop('checked')) { $(this).next(starredIcon).removeClass('fa-star-o'); $(this).next(starredIcon).addClass('fa-star'); } else { $(this).next(starredIcon).removeClass('fa-star'); $(this).next(starredIcon).addClass('fa-star-o'); } });
Finally, when you click on the icon we will update the DB field using Axios.
const starredCheckbox = $("[id^='super-checkbox-']"); const starredIcon = $("[id^='super-star-user-']"); starredCheckbox.change(function () { if ($(this).prop('checked')) { $(this).next(starredIcon).removeClass('fa-star-o'); $(this).next(starredIcon).addClass('fa-star'); } else { $(this).next(starredIcon).removeClass('fa-star'); $(this).next(starredIcon).addClass('fa-star-o'); } const user = $(this).data('user'); const payload = { starred: this.checked, }; axios.put(`/users/${user}/starred`, payload) .then(response => { console.log(response); }) .catch(error => { console.log(error); }); });
And at the end looks like this
I hope you find this information useful. If you can make any contribution, please comment below.