Settings

Theme

Star Wars opening crawl from 1977 in HTML/CSS/JS

codepen.io

202 points by TimPietrusky 12 years ago · 67 comments

Reader

pyalot2 12 years ago

Ah my eyes, the aliasing.

If anybody's interested why there's aliasing it's important to know how CSS transforms work. If you transform, the browser lifts the transformed rectangle into its own layer and renders its content to a texture. Then, later, it is composited with the page by blitting that texture with whatever transformation was applied.

So CSS transforms are an application of texturing. And in texturing what you do to avoid aliasing is mipmapping (you might also throw anisotropic filtering on top). However as the texture holding the rect the browser rendered isn't square power of two, some devices do not support mipmapping it. It is also quite slow to generate the mipmap for a texture every frame.

So with CSS transforms not being able to utilize mipmapping --> aliasing.

Now, in particular mipmapping text (that's supposed to be sharp) isn't even the best idea. It just gets blurry and looks unappealing (although that's better with anisotropic filtering, but then, anisotropic filtering is also expensive and not every device/GPU supports it).

  • lookingsideways 12 years ago

    Are you able to upload a screenshot of the aliasing problem somewhere?

    Running on a retina MBP, both Safari and Chrome render the text pin-sharp with no noticeable aliasing.

    • kaoD 12 years ago

      http://i.imgur.com/UzZYLW5.png

      Check the farthest text. It's even worse in motion because the aliasing changes discretely.

      • chiph 12 years ago

        Speaking as an old guy who saw Star Wars in the theater, it looked like that in 1977 as well. Not because of aliasing problems, but because they hit the resolution of the 35mm film and transfer process.

      • leokun 12 years ago

        It looks fine on a Retina MBP. The farthest text gets a little tiny bit of flickering maybe, but it looks sharp all the way until it fades out. Nothing like that.

        • ygra 12 years ago

          The flickering is what kaoD referred to with discretely changing aliasing. It shouldn't happen, ideally. Small pixels make it a little less jarring but still noticeable.

  • Pxtl 12 years ago

    Heh, it still feels wonderfully retro, but instead of evoking the original Star Wars, it evokes the old early-'90s PC games like X-Wing.

  • TimPietruskyOP 12 years ago

    So what do you suggest I should change?

    Thanks in advance.

    • pyalot2 12 years ago

      Well in CSS you can't do anything about it, that's just how the browser works.

      If you'd be doing WebGL you can do some things like using square power of two textures and enabling mipmapping and if available anisotropic filtering.

      You can also do things like using signed distance field fonts or draw fonts by rasterizing (in the fragment shader) the bezier curves, which can be made to nicely anti-alias (using standard derivatives).

      • ghayes 12 years ago

        Is this to say that CSS 3D transformations on text are bound to be aliased [in similar circumstances]? Is there a suggestion to the spec such as a "mipmap hint" that could (one day) be added to reduce this flaw without the need for other technologies?

        • pyalot2 12 years ago

          It's not just 3D transforms, a simple scale down will exhibit aliasing as well.

          There's no flag to control aliasing migitating strategies for CSS in the spec, nor is there any discussion about it as far as I know.

      • derefr 12 years ago

        > draw fonts by rasterizing (in the fragment shader) the bezier curves

        So, ideally, browsers would be doing this themselves, after applying the transform to any non-text in the texture, and then compositing with the combined texture?

    • gnoway 12 years ago

      Could be the speed, content, or something else, but the text at http://fotcorn.github.io/StarRSS/ doesn't seem to shake (as much, anyway) as it fades.

      • ygra 12 years ago

        Exhibits exactly the same issue here. Horrible flickering of horizontal lines because those alternate between being a pixel and no pixel wide.

    • jcampbell1 12 years ago

      You could make everything oversized, then apply a scale of .25. That will improve the aliasing a bit.

      Same for the logo. The scale transform should never exceed 1.0.

jasonkester 12 years ago

Gotta preload that audio. Even 100ms of lag between the logo showing up and the music starting is noticeable. Jarring even for (presumably) most of us, who have seen that opening crawl dozens, hundreds, or possibly for children of the 70s who went on to own laserdisc players in the 80s, thousands of times.

In any other context, you could safely pull off not preloading. But this example is just too ingrained into people's minds.

  • TimPietruskyOP 12 years ago

    Yeah I know and it's freaking me out. I already use the attribute preload="auto" of the <audio>-element, but it's not enough.

    Do you know any better ways to preload it?

jensenbox 12 years ago

I wish I could see it - seems busted on Chrome 29.0.1547.65 - Crunchbang Waldorf x64

Logo appears and fades out then nothing but music and blackness.

  • TimPietruskyOP 12 years ago

    This sounds like 3D is turned off in your Chrome. Can you please check your settings chrome://flags. Maybe "GPU compositing on all pages" is turned off -> turn it on.

    • Arkeus 12 years ago

      I have the same issue with no text after the logo. My "GPU compositing on all pages" was set to the default, but after changing it to "enabled" I still see no text. Version 31.0.1626.5 dev-m Aura SyzyASan

      • th0br0 12 years ago

        After enabing and relaunching chrome the text now works for me. (31.0.1612.0), what does chrome://gpu/ tell you?

lbenes 12 years ago

Back in 1994, my 486 had no issue rendering the Star Wars opening crawl in a sweet game, Star Wars: TIE Fighter. Fast forward 20 years, and thanks to the wonders of web, my computer can't even render it correctly. I get a blank screen after the star wars logo. So much for progress.

http://www.youtube.com/watch?v=IYks9ZfupZ0

  • mahesh_rm 12 years ago

    To a tech naive eye, this CSS looks and sounds much better than the 486 version. If I had to show my granny my first pc (a ~20 kilos 486) playing the game intro and a retina ipad rendering this css effect, she'd probably be amazed by tech progress in these last 20 years. Further, I can't see how the next 20 years may produce a greater improvement in this render than the past 20s. It's probably just that we can't fully appreciate progress from within..

    • nougatmachine 12 years ago

      Actually, on my retina iPad this demo doesn't work at all. You hear the music, but no visuals appear.

  • laureny 12 years ago

    Yes, who could have guessed we would still have bugs in the 21st century, right?

skriticos2 12 years ago

If I remember correctly, the crawl converged in a point at about 1/3 rd from the top in the original while in this one it scrolls off the top of the screen (at least in the default view). That's a pretty big oversight.

spmurrayzzz 12 years ago

I love the fact that the scrolling text is 'contenteditable="true"'. Fun to keep typing during the animation. Very cool.

increment_i 12 years ago

It's missing the Episode IV: A New Hope part...what gives?

klausjensen 12 years ago

You can even edit the text as it scrolls, which is a pretty interesting effect.

  • verbatim 12 years ago

    I assume this is what caused the somewhat strange result of "starship" being underlined as a misspelled word?

  • mithras 12 years ago

    Just contenteditable=true, no magic there.

chewxy 12 years ago

There is also this one which I posted a few months ago: http://scotch.io/demos/star-wars-attack-of-the-dom

joshuak 12 years ago

You're doing it wrong.

http://static03.mediaite.com/themarysue/uploads/2012/08/bts1...

ydeft 12 years ago

A very creative mixture of nostalgia and modern web dev.

Thanks for sharing!

lelf 12 years ago

Is it really worth #1 on HN?

PS: telnet towel.blinkenlights.nl

stefcosma 12 years ago

Tim, you amaze me every time. Nice job! :)

meerita 12 years ago

The logo maybe would be better with SVG, but I think that will not help anyways for the antialiasing.

  • ygra 12 years ago

    Is is SVG. It's just your browser (I'm guessing Chrome) that chooses to render it at a fixed size and then scale it up. It's perfectly crisp in IE and Firefox, for example.

unreal37 12 years ago

Most of the code is actually to recreate the music. The scrolling of the text is the easy part.

  • TimPietruskyOP 12 years ago

    The tricky part was to sync the CSS animation with the HTML <audio>-element sound (1:34 minutes long) with the help of JavaScript.

    The scrolling itself is just a CSS "transform: perspective(300px) rotateX(25deg)".

    You can also edit the scrolled text because I added the contenteditable="true" attribute to the titles.

ananth99 12 years ago

Nice work! :)

goggles99 12 years ago

Cool, but sadly to me this is almost a parody of how modern web dev innovation HTML5/JS/CSS are so far behind the technology that actually exists in the world today (this was originally created in 1977). Web standards are good, but much faster and be far more "open" and expandable.

One suggestion. Don't just create a standard for (monopoly) ECMA Script, instead - create a standard for a VM that other languages can compile bytecode to. Create an API in this VM for graphics, video, audio, ETC. This may be self defeating for these clowns, because JavaScript/CSS/HTML may be decimated in a decade if they actually did this, but hey... One can hope.

Once Google firmly owns the browser (like Microsoft in the 2000s) one of two things will happen. One they say to hell with the standards board and push real innovation and opportunity for developers to innovate. Two, they will sit and let it stagnate. Either way, the cycle is coming around again. Android will own the market in a big way soon. Big opportunity is on the horizon and I am getting my hopes up that there is a big shake up with "browser standards". End the monopoly of lame markup, styling, and scripting (HTML/CSS/JS) in the OS of the internet.

  • f055 12 years ago

    "this is almost a parody of how modern web dev innovation HTML5/JS/CSS are so far behind the technology that actually exists in the world today (this was originally created in 1977)"

    That's a weird opinion. The original was analog, created by several people and shoot carefully in specific conditions. This HTML version was made by a guy in his bedroom in a fraction of a time and is sharable, editable and can be viewed on many devices, including mobile, instead of just a movie theatre like the original. For me this is innovation across the board (not only in web standards, but technology overall)

  • jacquesm 12 years ago

    > Don't just create a standard for (monopoly) ECMA Script, instead - create a standard for a VM that other languages can compile bytecode to. Create an API in this VM for graphics, video, audio, ETC.

    Please no. That's the opposite of where we should be going. Less executable code on the client, more powerful markup.

    JavaScript was a huge mistake that we will likely have to live with for decades, let's not compound it.

    • jerf 12 years ago

      "Less executable code on the client, more powerful markup."

      Well, since when it comes to layout, the union of everybody's desires appears to be simply Every Possible Thing, your more powerful markup is going to end up being executable code anyhow. If you specify a Turing-complete set of needs, you're going to need a Turing-complete language to satisfy them.

      You can already see this happening even in CSS, and the more they try to pretend that CSS isn't code (even though it increasingly is), the more frustrating it's going to get for everyone when you end up with a bug in your CSS, which you are not allowed to fix due to the fact that we're all pretending it's not code.

    • anon1385 12 years ago

      >Less executable code on the client, more powerful markup. JavaScript was a huge mistake that we will likely have to live with for decades, let's not compound it.

      That ship has well and truly sailed. Mozilla and Google both want to make the web into a general purpose app platform, and they have veto power over any proposed standards. Admittedly they both want a slightly different version of the idea (asm.js vs Dart or NaCl), but that gridlock just leaves us investing even more heavily into the current Javascript ecosystem.

    • kaoD 12 years ago

      Markup and JavaScript are orthogonal concepts.

      • jacquesm 12 years ago

        Lots of concepts that are now part of HTML5 could only be done with Javascript in earlier incarnations.

        • kaoD 12 years ago

          Although you're right, they're still orthogonal concepts. Powerful markup does not replace JavaScript for all use cases.

  • icebraining 12 years ago

    One suggestion. Don't just create a standard for (monopoly) ECMA Script, instead - create a standard for a VM that other languages can compile bytecode to. Create an API in this VM for graphics, video, audio, ETC. This may be self defeating for these clowns, because JavaScript/CSS/HTML may be decimated in a decade if they actually did this, but hey... One can hope.

    How would that bytecode be any less of a "monopoly" than ECMA Script is now?

    Web standards may be "far behind" in what they can do compared to native code, but their are far, far, far ahead in terms of giving some control back to the user, whether it's in terms of enabling browser extensions, letting content be viewed without running arbitrary code, doing presentation transformations (e.g. Readability), well defined semantics for sharing content (links), etc.

    Your suggestion would grant some more power to developers, at the expense of users. So thanks, but no thanks.

  • voyou 12 years ago

    "create a standard for a VM that other languages can compile bytecode to. Create an API in this VM for graphics, video, audio."

    There already is a standard VM with an API for graphics, video and audio - it's called HTML5, and, as a bonus, it also includes an API for text layout. Sure, if you sat down intending to design such a VM, you might not come up with HTML5, but so what; what concrete improvement would you get by distributing programs as bytecode rather than JavaScript?

  • kaoD 12 years ago

    > create a standard for a VM that other languages can compile bytecode to

    That sounds a lot like Asm.js [1] Check Emscripten too! [2]

    [1]http://asmjs.org/

    [2] https://www.emscripten.org

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection