I just started on a new project recently and one of the things on the page I was working on was displaying progress bars in different colors. The progress bars need to display an indeterminate state and after talking with a co-worker we thought making it look like KITT from Night Rider was the best (and most awesome) way to display that.
Because of a lot of my work being done on the canvas, and to have communication being done with web sockets, I am only supporting modern browsers for this app. I knew there are a ton of new elements in HTML 5 and one of my personal goals is to become better at writing semantically correct html. A quick look through the elements, and I found the <progress> tag. Even better, it comes with an indeterminate state and is supported in the browsers I care about. My next requirement was just to style the progress elements different colors based on their states. I thought this is going to be easy. All I need to do is add some classes to set the color and I'm done!
So after a quick search I find out you pretty much can't do anything to style a progress element. Which made me think... how do you expect people to use this element if they can't make it look how they need it to?
I was determined to use CSS only to get this to work and make my page semantically awesome. I found some sites like this that show you how to clear out the native browser appearance and add your own. So I started with that and then added my own classes to style them how I needed. A lot of CSS later, I came up with the following:
With the lower half repeated for each class that I wanted, I was almost done. While verbose, I was able to style the progress as necessary. The only thing left was to get KITT to work. After some quick thinking I figured I would use a ::before pseudo element and animate it.
Finally some progress...
Is that you Mr. Feeny? |
I was determined to use CSS only to get this to work and make my page semantically awesome. I found some sites like this that show you how to clear out the native browser appearance and add your own. So I started with that and then added my own classes to style them how I needed. A lot of CSS later, I came up with the following:
.progressContainer{ position:relative; width: 100px; } progress{ height:5px; border:0; appearance: none; -moz-appearance: none; -webkit-appearance: none; width:100% !important; } progress.connected::-webkit-progress-value{ background: green; } progress.connected::-moz-progress-value{ background: green; } progress.connected::progress-value{ background: green; } progress.connected::-webkit-progress-bar{ background: green; } progress.connected::-moz-progress-bar{ background: green; } progress.connected::progress-bar{ background: green; } progress.connected:not([value])::-webkit-progress-bar{ background:green; } progress.connected:not([value])::-moz-progress-bar{ background:green; } progress.connected:not([value])::progress-bar{ background:green; }
With the lower half repeated for each class that I wanted, I was almost done. While verbose, I was able to style the progress as necessary. The only thing left was to get KITT to work. After some quick thinking I figured I would use a ::before pseudo element and animate it.
@-webkit-keyframes knightRider { 0% { left: 0%; } 50% { left:100%; margin-left:-10px; } 100%{ left:0%; } } @keyframes knightRider { 0% { left: 0%; } 50% { left:100%; margin-left:-10px; } 100%{ left:0%; } } progress.searching::before{ content:""; background-color:blue; width:10px; height:5px; position: absolute; animation: knightRider 2s infinite linear; -webkit-animation: knightRider 2s infinite linear; }A quick refresh of my fiddle and BOOM it was working. Now I just need to make sure it is working in Firefox which should be just a formality, right? Wrong! Only webkit browsers support ::before and ::after on progress for some bizzaro reason. So I ended up adding a hidden div next to the progress bar that would use the animation from above and only show up when a specific class is added to the progress bar.
Finally some progress...
No comments:
Post a Comment