On August 21st we had our fourth Thursday night minihackathon. The goal for this minihackathon was to create a Tower Defense game with as few lines of code as possible. External libraries and CSS were not included in the line count.

I had used jQuery and D3.js for animation in previous projects, and for a while now I wanted to learn more about CSS animations, so I decided to do the game with only CSS. I knew I wasn’t going to be able to implement a real game with only CSS, but I wanted to see just how far I could go with only CSS. Plus, the irony of doing a project in only CSS without a lick of Javascript at a coding bootcamp that teaches only Javascript and not a lick of CSS kinda amused me. Here’s a demo of CSS Defense.


    Challenges/Things I’ve learned

  • Hardest part of this project was figuring out how to make the towers appear and fire bullets after you click on the screen.

    Early on I decided to use a grid of links to make the towers “magically” appear when you click on the board. The boards starts with white links on a white background so the towers aren’t visible. When users click the board, a link changes to the visited state, turns black, and a tower appears. That was the semi-easy part.

    The hard part was making the moving bullets appear after the towers appear. Since the only css rules you can apply to visited links are color and animation, I had to create a second grid of clickable links for the bullets, and position the two grids on top each other.

    Each cell on one board has a unique url. The corresponding cells on the two boards share the same url so when you click a cell on the towers board, the corresponding cell on the bullet board will also appear.

  • Using formulas in the :nth-child() selector is pretty nifty way to get finer control over which elements to apply styles to.

    This code applies different rotation rules to every fourth tower. Tower 1 rotates to the right in 1 second, tower 2 rotates to the left in 2 seconds, etc.

    #board_towers a:nth-child(4n+1) {
    animation: 1s towers_right infinite ;
    #board_towers a:nth-child(4n+2) {
    animation: 2s towers_left infinite ;
    #board_towers a:nth-child(4n+3) {
    animation: 3s towers_right infinite ;
    #board_towers a:nth-child(4n+4) {
    animation: 4s towers_left infinite ;
  • Using a multiple keyframes in a animation can allow for some complicated movements. Here’s the code to move the three shapes along the path.
    @keyframes slide in {
    0% {
    20% {
    60% {
    80% {
    100% {
  • Before the hackathon, I didn’t get much of a chance to use absolute/relative positioning, so I always got those rules confused. I had to use positioning a few times in this project which greatly helped my understanding of positioning. A little bit of practice can go a long a way.
  • Before the hackathon, I was not aware that the only css rules you can apply to visited links were color and animation. I originally hoped to use a:visited:after {content} to make the towers and bullets appear after the click. Because of the limitations of visited links, I had to do some major hacky creativity to find a workable solution for the towers/bullets.
  • After the hackathon, I found examples of fully functional games that only use CSS. Pong, Space ship, Minesweeper, CSS Panic, and car game.
  • “Programming” in a language that isn’t meant for programming was more challenging and more fun than I had anticipated. Who would’ve thunk that doing things the hard way to produce a non-functional app could be so entertaining?