{"id":123,"date":"2011-04-20T11:22:38","date_gmt":"2011-04-20T17:22:38","guid":{"rendered":"http:\/\/timothypoon.com\/blog\/?p=123"},"modified":"2011-04-20T11:25:45","modified_gmt":"2011-04-20T17:25:45","slug":"html5-video-player-for-webkit","status":"publish","type":"post","link":"https:\/\/timothypoon.com\/blog\/2011\/04\/20\/html5-video-player-for-webkit\/","title":{"rendered":"HTML5 Video Player For WebKit"},"content":{"rendered":"<p>I had to play some videos in Chrome recently, but the player had to be custom for the project. Rather than tinker with some <a href=\"http:\/\/videojs.com\/\" refl=\"no-follow\">pre<\/a>&#8211;<a href=\"http:\/\/sublimevideo.net\/\" rel=\"no-follow\">made<\/a> <a href=\"http:\/\/www.html5video.org\/\" rel=\"no-follow\">solutions<\/a> out there, I instead decided to do this myself and see what I could accomplish (disclaimer: I&#8217;ve actually written something like this a few times before, but I never got around to writing about it).<\/p>\n<h2>Looking Good<\/h2>\n<p>The end goal was to achieve something that looks like this (in a modal overlay):<\/p>\n<p><a href=\"http:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2011\/04\/video-player-1.png\"><img decoding=\"async\" src=\"http:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2011\/04\/video-player-1.png\" alt=\"\" title=\"HTML5 Video Player For WebKit\" width=\"100%\" class=\"aligncenter size-full wp-image-124\" srcset=\"https:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2011\/04\/video-player-1.png 640w, https:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2011\/04\/video-player-1-300x168.png 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>The main challenge I could see would be the progress bar. Being that I only had WebKit browsers with which to concern myself, my first instinct was to use the <a href=\"http:\/\/www.whatwg.org\/specs\/web-apps\/current-work\/#the-progress-element\">&lt;progress&gt; element<\/a>. However, is it possible to style this element with CSS?<\/p>\n<p>Absolutely sort of! As long as you&#8217;re using a WebKit browser, it turns out that you can use the vendor-specific selector pseudo element <em>::-webkit-progress-bar-value<\/em> (<a href=\"http:\/\/stackoverflow.com\/questions\/5016011\/is-there-any-possibility-to-color-the-html5-progress-tag\/5020891#5020891\">relevant Stack Overflow post<\/a>) to style the value portion of the element in addition to the actual element itself. I&#8217;m sure the other engines will follow suit eventually, but it&#8217;s just WebKit for now.<\/p>\n<p>Here&#8217;s the HTML structure I ended up with:<\/p>\n<div class=\"codecolorer-container html4strict railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/><\/div><\/td><td><div class=\"html4strict codecolorer\"><span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player-wrapper&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;video&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;source <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;\/video.ogv&quot;<\/span> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">'video\/ogg; codecs=&quot;theora, vorbis&quot;'<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span>video&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player-bar&quot;<\/span>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/button.html\"><span class=\"kw2\">button<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player-play&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/button.html\"><span class=\"kw2\">button<\/span><\/a>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/span.html\"><span class=\"kw2\">span<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player-timer&quot;<\/span>&gt;<\/span>0.00<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/span.html\"><span class=\"kw2\">span<\/span><\/a>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;progress <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player-seek&quot;<\/span>&gt;<\/span>0.00<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span>progress&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/span.html\"><span class=\"kw2\">span<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player-duration&quot;<\/span>&gt;<\/span>0.00<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/span.html\"><span class=\"kw2\">span<\/span><\/a>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/a.html\"><span class=\"kw2\">a<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player-knob&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/a.html\"><span class=\"kw2\">a<\/span><\/a>&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a>&gt;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/a.html\"><span class=\"kw2\">a<\/span><\/a> <span class=\"kw3\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;video-player-skip&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/a.html\"><span class=\"kw2\">a<\/span><\/a>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/div.html\"><span class=\"kw2\">div<\/span><\/a>&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>As a side note, I put an .ogv video file in there just to remind you that they are the preferred format for HTML5 videos. In my experience, other formats such as .mp4 will occasionally freeze Chrome and probably make you sad. I&#8217;ve encountered some issues with .webm, too, while .ogv and .m4v have yet to halt my browser.<\/p>\n<p>Here&#8217;s the CSS to make things look like they should:<\/p>\n<div class=\"codecolorer-container css railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/>90<br \/>91<br \/>92<br \/>93<br \/>94<br \/>95<br \/>96<br \/>97<br \/>98<br \/>99<br \/>100<br \/>101<br \/>102<br \/>103<br \/>104<br \/>105<br \/>106<br \/>107<br \/>108<br \/>109<br \/>110<br \/>111<br \/>112<br \/>113<br \/>114<br \/><\/div><\/td><td><div class=\"css codecolorer\"><span class=\"re1\">.video-player-wrapper<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">top<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">left<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">100%<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">100%<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">z-index<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">9999<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">color<\/span><span class=\"sy0\">:<\/span><span class=\"re0\">#FFFFFF<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">position<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">absolute<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span><span class=\"kw3\">rgba<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span>.85<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; -webkit-user-select<span class=\"sy0\">:<\/span><span class=\"kw2\">none<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">.video-player-wrapper<\/span> <span class=\"re1\">.video-player-skip<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">40px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">40px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">border<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">2px<\/span> <span class=\"kw2\">solid<\/span> <span class=\"re0\">#FFFFFF<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">border-radius<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">20px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span><span class=\"re0\">#000000<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">position<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">absolute<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">text-align<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">center<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">font-size<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">30px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">.video-player-wrapper<\/span> <span class=\"re1\">.video-player-skip<\/span><span class=\"sy0\">::<\/span><span class=\"kw5\">before<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">content<\/span><span class=\"sy0\">:<\/span><span class=\"st0\">'x'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"re1\">.video-player<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">position<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">absolute<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">overflow<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">hidden<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"re1\">.video-player-bar<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">position<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">absolute<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">bottom<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">left<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">100%<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">65px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span>-webkit-linear-gradient<span class=\"br0\">&#40;<\/span><span class=\"kw2\">left<\/span><span class=\"sy0\">,<\/span><span class=\"kw3\">rgba<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span>.7<span class=\"br0\">&#41;<\/span> <span class=\"re3\">0px<\/span><span class=\"sy0\">,<\/span><span class=\"kw3\">rgba<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span>.7<span class=\"br0\">&#41;<\/span> <span class=\"re3\">95px<\/span><span class=\"sy0\">,<\/span><span class=\"kw4\">transparent<\/span> <span class=\"re3\">95px<\/span><span class=\"sy0\">,<\/span><span class=\"kw4\">transparent<\/span> <span class=\"re3\">98px<\/span><span class=\"sy0\">,<\/span><span class=\"kw3\">rgba<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span>.7<span class=\"br0\">&#41;<\/span> <span class=\"re3\">98px<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; -webkit-transition<span class=\"sy0\">:<\/span><span class=\"kw2\">bottom<\/span> <span class=\"re3\">.4s<\/span> ease-in<span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">.video-player-bar<\/span><span class=\"re1\">.hide<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">bottom<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">-65px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">.video-player-knob<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">display<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">block<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">position<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">absolute<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span><span class=\"re0\">#FFF<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">border-radius<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">22px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">44px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">44px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">bottom<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">46px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">left<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">161px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">opacity<\/span><span class=\"sy0\">:<\/span>.6<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; -webkit-box-shadow<span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span> <span class=\"nu0\">0<\/span> <span class=\"re3\">3px<\/span> <span class=\"kw3\">rgba<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span>.8<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; -webkit-transition<span class=\"sy0\">:<\/span>opacity <span class=\"re3\">.4s<\/span> ease-in<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">.video-player-knob<\/span><span class=\"sy0\">::<\/span><span class=\"kw5\">before<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">content<\/span><span class=\"sy0\">:<\/span><span class=\"st0\">''<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">display<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">block<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">1px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span><span class=\"re0\">#FFF<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">16px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">bottom<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">-16px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">left<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">21px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">position<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">absolute<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">.video-player-bar<\/span><span class=\"re1\">.hide<\/span> <span class=\"re1\">.video-player-knob<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">opacity<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">.video-player-bar<\/span> <span class=\"re1\">.video-player-play<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">display<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">inline-block<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">100%<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">95px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">border<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">none<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; -webkit-box-sizing<span class=\"sy0\">:<\/span><span class=\"kw2\">border-box<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">padding<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">margin-right<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">16px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span><span class=\"kw4\">transparent<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">text-align<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">center<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">.video-player-bar<\/span> <span class=\"re1\">.video-player-play<\/span><span class=\"sy0\">:<\/span><span class=\"kw5\">before<\/span><span class=\"sy0\">,<\/span> <span class=\"re1\">.video-player-bar<\/span> <span class=\"re1\">.video-player-play<\/span><span class=\"sy0\">:<\/span><span class=\"kw5\">after<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">content<\/span><span class=\"sy0\">:<\/span><span class=\"st0\">''<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">display<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">inline-block<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">.video-player-bar<\/span> <span class=\"re1\">.video-player-play<\/span><span class=\"re1\">.play<\/span><span class=\"sy0\">:<\/span><span class=\"kw5\">before<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">border-style<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">solid<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">border-width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">12px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">border-color<\/span><span class=\"sy0\">:<\/span><span class=\"kw4\">transparent<\/span> <span class=\"kw4\">transparent<\/span> <span class=\"kw4\">transparent<\/span> <span class=\"re0\">#FFF<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">margin<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">5px<\/span> <span class=\"nu0\">0<\/span> <span class=\"nu0\">0<\/span> <span class=\"re3\">9px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re1\">.video-player-bar<\/span> <span class=\"re1\">.video-player-play<\/span><span class=\"re1\">.pause<\/span><span class=\"sy0\">:<\/span><span class=\"kw5\">before<\/span><span class=\"sy0\">,<\/span> <span class=\"re1\">.video-player-bar<\/span> <span class=\"re1\">.video-player-play<\/span><span class=\"re1\">.pause<\/span><span class=\"sy0\">:<\/span><span class=\"kw5\">after<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">5px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">24px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span><span class=\"re0\">#FFF<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">margin<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">5px<\/span> <span class=\"re3\">3px<\/span> <span class=\"nu0\">0<\/span> <span class=\"re3\">3px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">.video-player-bar<\/span> span <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">font-size<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">21px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">50px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">margin<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">23px<\/span> <span class=\"re3\">11px<\/span> <span class=\"nu0\">0<\/span> <span class=\"re3\">11px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">display<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">inline-block<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">vertical-align<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">top<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">text-shadow<\/span><span class=\"sy0\">:<\/span><span class=\"nu0\">0<\/span> <span class=\"nu0\">0<\/span> <span class=\"re3\">4px<\/span> <span class=\"kw3\">rgba<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span>.8<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"re1\">.video-player-bar<\/span> <span class=\"re1\">.video-player-seek<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">height<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">4px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">width<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">100px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">border-radius<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">2px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span><span class=\"re0\">#FFF<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">margin<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">31px<\/span> <span class=\"re3\">10px<\/span> <span class=\"nu0\">0<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">vertical-align<\/span><span class=\"sy0\">:<\/span><span class=\"kw2\">top<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; -webkit-appearance<span class=\"sy0\">:<\/span><span class=\"kw2\">none<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re1\">.video-player-bar<\/span> <span class=\"re1\">.video-player-seek<\/span><span class=\"sy0\">::<\/span>-webkit-progress-bar-value <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">background<\/span><span class=\"sy0\">:<\/span>-webkit-linear-gradient<span class=\"br0\">&#40;<\/span><span class=\"kw2\">top<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">#37d0ff<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">#35addb<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">border-radius<\/span><span class=\"sy0\">:<\/span><span class=\"re3\">2px<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>You&#8217;ll notice all the special CSS3 things like box shadows and gradients are WebKit-specific. Other vendor prefixes for Mozilla and Opera (and the CSS3 standard) can be added if necessary.<\/p>\n<h2>The jQuery Magic<\/h2>\n<p>Although not written as a jQuery plug-in (which will probably happen at some point down the line), this puppy <em>does<\/em> use it to make things easier on the JavaScript side of things.<\/p>\n<p>First is to set up the videoPlayer object. This includes extending user options with the defaults, instantiating the object status variables, and creating and adding the new DOM elements:<\/p>\n<div class=\"codecolorer-container javascript railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/><\/div><\/td><td><div class=\"javascript codecolorer\"><span class=\"kw1\">var<\/span> $this <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">settings<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span>autoOpen<span class=\"sy0\">:<\/span><span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span> autoPlay<span class=\"sy0\">:<\/span><span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span> autoClose<span class=\"sy0\">:<\/span><span class=\"kw2\">true<\/span><span class=\"sy0\">,<\/span> controlTimeout<span class=\"sy0\">:<\/span><span class=\"nu0\">3500<\/span><span class=\"sy0\">,<\/span> skip<span class=\"sy0\">:<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> $this.<span class=\"me1\">close<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span> close<span class=\"sy0\">:<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span> open<span class=\"sy0\">:<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n$.<span class=\"me1\">extend<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.<span class=\"me1\">settings<\/span><span class=\"sy0\">,<\/span> options<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">opened<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">htimer<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">seeking<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">control<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">false<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">this<\/span>.$elem <span class=\"sy0\">=<\/span> $elem.<span class=\"me1\">css<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'pointer-events'<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">'none'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">video<\/span> <span class=\"sy0\">=<\/span> $elem.<span class=\"kw1\">get<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$play <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;button class=&quot;video-player-play pause&quot;&gt;'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$time <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;span class=&quot;video-player-timer&quot;&gt;0.00&lt;\/span&gt;'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$seek <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;progress class=&quot;video-player-seek&quot; value=&quot;0&quot; max=&quot;0&quot;&gt;0%&lt;\/progress&gt;'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$maxt <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;span class=&quot;video-player-duration&quot;&gt;0.00&lt;\/span&gt;'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$ctrl <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;div class=&quot;video-player-bar hide&quot;&gt;'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$knob <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;a class=&quot;video-player-knob&quot;&gt;'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$skip <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;a class=&quot;video-player-skip&quot;&gt;'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$skin <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;div class=&quot;video-player&quot;&gt;'<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">width<\/span><span class=\"br0\">&#40;<\/span>$elem.<span class=\"me1\">width<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">height<\/span><span class=\"br0\">&#40;<\/span>$elem.<span class=\"me1\">height<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span>$elem<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span>$this.$ctrl.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span>$this.$play<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span>$this.$time<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span>$this.$seek<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span>$this.$maxt<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span>$this.$knob<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$wrap <span class=\"sy0\">=<\/span> $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;div class=&quot;video-player-wrapper&quot;&gt;'<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">css<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'display'<\/span><span class=\"sy0\">,<\/span><span class=\"st0\">'none'<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">appendTo<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'body'<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.$skin<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.$skip<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>Most of the methods like <em>play()<\/em> and <em>pause()<\/em> are pretty self-explanatory, but <em>setTime()<\/em> and <em>setPosition()<\/em> are somewhat complex:<\/p>\n<div class=\"codecolorer-container javascript railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/><\/div><\/td><td><div class=\"javascript codecolorer\"><span class=\"kw1\">this<\/span>.<span class=\"me1\">setTime<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>time<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; time <span class=\"sy0\">=<\/span> parseFloat<span class=\"br0\">&#40;<\/span>time<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> vduration <span class=\"sy0\">=<\/span> parseFloat<span class=\"br0\">&#40;<\/span>$this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'duration'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>time <span class=\"sy0\">&gt;<\/span> vduration<span class=\"br0\">&#41;<\/span> time <span class=\"sy0\">=<\/span> vduration<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>time <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> time <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'currentTime'<\/span><span class=\"sy0\">,<\/span>time<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $this.$time.<span class=\"me1\">html<\/span><span class=\"br0\">&#40;<\/span>$this.<span class=\"me1\">formatTime<\/span><span class=\"br0\">&#40;<\/span>time<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $this.$seek.<span class=\"me1\">val<\/span><span class=\"br0\">&#40;<\/span>time<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">html<\/span><span class=\"br0\">&#40;<\/span>time <span class=\"sy0\">\/<\/span> vduration<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $this.$knob.<span class=\"me1\">css<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'left'<\/span><span class=\"sy0\">,<\/span><span class=\"br0\">&#40;<\/span>$this.$seek.<span class=\"me1\">offset<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">left<\/span> <span class=\"sy0\">-<\/span> $this.$skin.<span class=\"me1\">offset<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">left<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"br0\">&#40;<\/span>$this.$seek.<span class=\"me1\">width<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> <span class=\"br0\">&#40;<\/span>time <span class=\"sy0\">\/<\/span> vduration<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"br0\">&#40;<\/span>$this.$knob.<span class=\"me1\">width<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">\/<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.<span class=\"me1\">setPosition<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>pageX<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; $this.<span class=\"me1\">setTime<\/span><span class=\"br0\">&#40;<\/span>parseFloat<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>pageX <span class=\"sy0\">-<\/span> $this.$seek.<span class=\"me1\">offset<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">left<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">\/<\/span> $this.$seek.<span class=\"me1\">width<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> parseFloat<span class=\"br0\">&#40;<\/span>$this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'duration'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p><em>setPosition()<\/em> takes an x-position of the page and converts it to a time within the range of the video&#8217;s duration. If the x-position is to the left of the seek bar, the time is set to zero. If the x-position is to the right of the seek bar, the time is set to the video&#8217;s duration (and subsequently will stop). If the x-position is within the left and right x-positions of the seek bar, then we take its position ratio against the video&#8217;s duration and uses <em>setTime()<\/em> to set the place in the video playback.<\/p>\n<p>One other thing that might jump out at you is the <em>createSeek()<\/em>:<\/p>\n<div class=\"codecolorer-container javascript railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/><\/div><\/td><td><div class=\"javascript codecolorer\"><span class=\"co1\">\/\/ Things don't really start until the video is ready, i.e. video.readyState == true<\/span><br \/>\n<span class=\"kw1\">var<\/span> createSeek <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>$this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'readyState'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">var<\/span> updateTime <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>ev<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span>$this.<span class=\"me1\">seeking<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this.<span class=\"me1\">setTime<\/span><span class=\"br0\">&#40;<\/span>$this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'currentTime'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>$this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'currentTime'<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&gt;=<\/span> $this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'duration'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this.<span class=\"me1\">stop<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>$this.<span class=\"me1\">settings<\/span>.<span class=\"me1\">autoClose<\/span><span class=\"br0\">&#41;<\/span> $this.<span class=\"me1\">close<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; $this.$seek.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'max'<\/span><span class=\"sy0\">,<\/span> $this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'duration'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; $this.$maxt.<span class=\"me1\">html<\/span><span class=\"br0\">&#40;<\/span>$this.<span class=\"me1\">formatTime<\/span><span class=\"br0\">&#40;<\/span>$this.$elem.<span class=\"me1\">attr<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'duration'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; $this.$elem.<span class=\"me1\">bind<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'timeupdate'<\/span><span class=\"sy0\">,<\/span> updateTime<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>$this.<span class=\"me1\">settings<\/span>.<span class=\"me1\">autoOpen<\/span><span class=\"br0\">&#41;<\/span> $this.<span class=\"me1\">open<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; updateTime<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class=\"br0\">&#40;<\/span>createSeek<span class=\"sy0\">,<\/span> <span class=\"nu0\">150<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\ncreateSeek<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>This function isn&#8217;t called ever again (or at least shouldn&#8217;t be) and is truly only used for object instantiation. You have to wait for the video DOM element to return a <strong>readyState<\/strong> attribute so you know the video is loaded and ready to play. Otherwise, you just set a timeout to keep checking the <strong>readyState<\/strong> until the video is ready so you can apply the <em>updateTime()<\/em> function to the <strong>timeupdate<\/strong> event of the video.<\/p>\n<p>Lastly, there&#8217;s just a little bit of fun geometry. It moves the skip\/close button to the very upper-right corner of the video player.<\/p>\n<p><a href=\"http:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2011\/04\/video-player-2.png\"><img decoding=\"async\" src=\"http:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2011\/04\/video-player-2.png\" alt=\"\" title=\"Position the video player&#039;s close button\" width=\"100%\" class=\"aligncenter size-full wp-image-125\" srcset=\"https:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2011\/04\/video-player-2.png 500w, https:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2011\/04\/video-player-2-300x216.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p>This is done by finding the distance from the center of the element to one of its corners (its a square in the DOM even though it renders as a circle), subtracting the radius of the circle (which is also half the width of the square), and using the resulting value as the hypotenuse of an isosceles right triangle whose other sides are used as offsets from the top right corner of the video player.<\/p>\n<div class=\"codecolorer-container javascript railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/><\/div><\/td><td><div class=\"javascript codecolorer\"><span class=\"co1\">\/\/ Move the skip\/close button to the very top right corner of the player<\/span><br \/>\n<span class=\"kw1\">var<\/span> w <span class=\"sy0\">=<\/span> <span class=\"kw1\">this<\/span>.$skip.<span class=\"me1\">width<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; n <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">Math<\/span>.<span class=\"me1\">sqrt<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">Math<\/span>.<span class=\"me1\">pow<\/span><span class=\"br0\">&#40;<\/span>w<span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"kw4\">Math<\/span>.<span class=\"me1\">pow<\/span><span class=\"br0\">&#40;<\/span>w<span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">\/<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"br0\">&#40;<\/span>w <span class=\"sy0\">\/<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; o <span class=\"sy0\">=<\/span> <span class=\"kw4\">Math<\/span>.<span class=\"me1\">sqrt<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">Math<\/span>.<span class=\"me1\">pow<\/span><span class=\"br0\">&#40;<\/span>n<span class=\"sy0\">,<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">\/<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">this<\/span>.$skip.<span class=\"me1\">offset<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span>left<span class=\"sy0\">:<\/span><span class=\"br0\">&#40;<\/span>parseInt<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.$skin.<span class=\"me1\">css<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'left'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> <span class=\"kw1\">this<\/span>.$skin.<span class=\"me1\">width<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> o<span class=\"sy0\">,<\/span> top<span class=\"sy0\">:<\/span>parseInt<span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span>.$skin.<span class=\"me1\">css<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'top'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"kw1\">this<\/span>.$skip.<span class=\"me1\">height<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">+<\/span> o<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<h2>In Conclusion<\/h2>\n<p>That&#8217;s that! If you want to read about how to use it, check out <a href=\"https:\/\/github.com\/mockenoff\/HTML5-Video-Player\">my GitHub for this particular little doodad<\/a>. There are still a few things left to do, or at least things I&#8217;d like to eventually get around to doing since in its current state, this guy does exactly what I need it to do.<\/p>\n<ul>\n<li>Add volume controls &ndash; it&#8217;s simple enough. It works almost like the seek bar except it controls the volume.<\/li>\n<li>Turn into a jQuery plug-in &ndash; it currently relies on jQuery, so I should probably make it a jQuery plug-in instead of calling it as a new object (that, or just get rid of the dependency).<\/li>\n<li>Improved seek controls &ndash; if you jump around too fast, the events fire out of order and the video will go back to its pre-seek position after mouse release. Currently, you can avoid this by going a bit slower or by moving the mouse slightly either direction before releasing.<\/li>\n<li>Expand to other HTML5 browsers &ndash; currently only supports WebKit browsers even though &lt;video&gt; elements belong to HTML5 in general, so it would make sense to make this plug-in do the same.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/timothypoon.com\/blog\/demos\/video-player\/\" title=\"HTML5 Video Player Demo\">View the demo<\/a> (requires a WebKit browser). Video is from <a href=\"http:\/\/disney.go.com\/disneynature\/oceans\/\" rel=\"no-follow\"><em>Oceans<\/em><\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I had to play some videos in Chrome recently, but the player had to be custom for the project. Rather than tinker with some pre&#8211;made solutions out there, I instead decided to do this myself and see what I could accomplish (disclaimer: I&#8217;ve actually written something like this a few times before, but I never got around to writing about it). Looking Good The end goal was to achieve something that looks like this (in a modal overlay): The main challenge I could see would be the progress bar. Being&#8230;<a class=\"read-more\" href=\"https:\/\/timothypoon.com\/blog\/2011\/04\/20\/html5-video-player-for-webkit\/\">read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[14,16,18],"class_list":["post-123","post","type-post","status-publish","format-standard","hentry","category-code","tag-css3","tag-html5","tag-javascript","et-no-image","et-bg-layout-dark","et-white-bg"],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p462yg-1Z","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/posts\/123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/comments?post=123"}],"version-history":[{"count":6,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/posts\/123\/revisions"}],"predecessor-version":[{"id":131,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/posts\/123\/revisions\/131"}],"wp:attachment":[{"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/media?parent=123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/categories?post=123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/tags?post=123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}