其实最后两个知识点是很简单的,只是自己没想到而已。
第三个场景的出现用一个end的自定义动画就能搞定,延迟15s播放而已。然后再给body来个黑色背景,再多加几个地鼠,增加点难度,游戏就可以玩起了。
html:
<!DOCTYPE html> <head> <meta charset="utf-8" /> <title>打地鼠</title> <link href="style.css" rel="stylesheet" /> </head> <body> <div class="container"> <input id="startFlag" type="checkbox"> <div id="start" class="window"> <h1>打呀打地鼠</h1> <p>不许笑,一个严肃的 CSS 游戏</p> <div class="btn-group"> <div class="susliks not-button"></div> <label for="startFlag">开始</label> </div> </div> <div id="end" class="window"> <h2>Game Over</h2> <p>壮士欢迎从头再来</p> <p class="meta">按 F5/Command R 重来</p> <div class="susliks not-button"></div> </div> <div class="time-wrapper"> <p>游戏时间:</p> <div class="time"> <div class="progress"></div> </div> </div> <div id="map"> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> <div class="map"></div> </div> <div> <div class="group"> <input type="radio" name="score1" checked/> <label for="score1" class="susliks susliks1"></label> <input type="radio" name="score2" checked/> <label for="score2" class="susliks susliks2"></label> <div class="hole"></div> </div> <div class="group"> <input type="radio" name="score3" checked/> <label for="score3" class="susliks susliks3"></label> <div class="hole"></div> </div> <div class="group"> <input type="radio" name="score4" checked/> <label for="score4" class="susliks susliks4"></label> <input type="radio" name="score5" checked/> <label for="score5" class="susliks susliks5"></label> <input type="radio" name="score6" checked/> <label for="score6" class="susliks susliks6"></label> <div class="hole"></div> </div> <div class="group"> <input type="radio" name="score7" checked/> <label for="score7" class="susliks susliks7"></label> <input type="radio" name="score8" checked/> <label for="score8" class="susliks susliks8"></label> <div class="hole"></div> </div> <div class="group"> <input type="radio" name="score9" checked/> <label for="score9" class="susliks susliks9"></label> <input type="radio" name="score10" checked/> <label for="score10" class="susliks susliks10"></label> <div class="hole"></div> </div> <div class="group"> <input type="radio" name="score11" checked/> <label for="score11" class="susliks susliks11"></label> <input type="radio" name="score12" checked/> <label for="score12" class="susliks susliks12"></label> <div class="hole"></div> </div> </div> <div class="points"> <div class="points-viewport"> <div class="points-list"> <input type="radio" name="score1" id="score1"/><div class="block"></div> <input type="radio" name="score2" id="score2"/><div class="block"></div> <input type="radio" name="score3" id="score3"/><div class="block"></div> <input type="radio" name="score4" id="score4"/><div class="block"></div> <input type="radio" name="score5" id="score5"/><div class="block"></div> <input type="radio" name="score6" id="score6"/><div class="block"></div> <input type="radio" name="score7" id="score7"/><div class="block"></div> <input type="radio" name="score8" id="score8"/><div class="block"></div> <input type="radio" name="score9" id="score9"/><div class="block"></div> <input type="radio" name="score10" id="score10"/><div class="block"></div> <input type="radio" name="score11" id="score11"/><div class="block"></div> <input type="radio" name="score12" id="score12"/><div class="block"></div> </div> <div> <div class="point">0</div> <div class="point">1</div> <div class="point">2</div> <div class="point">3</div> <div class="point">4</div> <div class="point">5</div> <div class="point">6</div> <div class="point">7</div> <div class="point">8</div> <div class="point">9</div> <div class="point">10</div> <div class="point">11</div> <div class="point">12</div> </div> </div> </div> </div> </body>check the result
css:
* { padding : 0px; margin : 0px; box-sizing: border-box; } body { background-color : black; } .container { position : absolute; left : 50%; top : 50%; width : 600px; height : 600px; margin-left : -300px; margin-top : -300px; border : 1px solid black; overflow : hidden; background: -webkit-linear-gradient(top, #8adcf7 0%, #bbe8fd 100%); background: linear-gradient(to bottom, #8adcf7 0%, #bbe8fd 100%); } .window { position: absolute; left: 0; top: 0; width: 100%; height: 100%; background: #000; z-index: 9; -webkit-transition: opacity 0.6s; transition: opacity 0.6s; } .window .susliks { position: relative; top: 6px; left: 0; margin: 0 auto; } .susliks { position : absolute; top: 70px; left: 7px; width : 56px; height : 100px; border-radius : 20px; background : #e3c498; cursor : pointer; background-image : -webkit-radial-gradient(20px 23px, circle, #000000 5%, rgba(255, 255, 255, 0) 5%), -webkit-radial-gradient(17px 20px, circle, #ffffff 10%, rgba(255, 255, 255, 0) 10%), -webkit-radial-gradient(36px 23px, circle, #000000 5%, rgba(255, 255, 255, 0) 5%), -webkit-radial-gradient(39px 20px, circle, #ffffff 10%, rgba(255, 255, 255, 0) 10%), -webkit-radial-gradient(center 36px, circle, #000000 8%, rgba(255, 255, 255, 0) 8%), -webkit-radial-gradient(center 48px, circle, #ffffff 20%, rgba(255, 255, 255, 0) 20%); background-image : radial-gradient(circle at 20px 23px, #000000 5%, rgba(255, 255, 255, 0) 5%), radial-gradient(circle at 17px 20px, #ffffff 10%, rgba(255, 255, 255, 0) 10%), radial-gradient(circle at 36px 23px, #000000 5%, rgba(255, 255, 255, 0) 5%), radial-gradient(circle at 39px 20px, #ffffff 10%, rgba(255, 255, 255, 0) 10%), radial-gradient(circle at center 36px, #000000 8%, rgba(255, 255, 255, 0) 8%), radial-gradient(circle at center 48px, #ffffff 20%, rgba(255, 255, 255, 0) 20%); -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; } .susliks:before, .susliks:after { content : ''; left : -5px; top : -5px; width : 20px; height : 20px; position : absolute; background : #e3c498; border-radius : 50%; background-image : -webkit-radial-gradient(center, circle, #000000 40%, rgba(255, 255, 255, 0) 40%); background-image : radial-gradient(circle at center, #000000 40%, rgba(255, 255, 255, 0) 40%); } .susliks:after { left : auto; right : -5px; } .not-button { cursor : default; } .group input[type="radio"] + .susliks { opacity : 0; } .group input[type="radio"]:checked + .susliks { opacity : 1; } h1, h2, p { color: #fff; text-align: center; } h1 { line-height: 50px; } h2 { margin-top: 100px; margin-bottom: 10px; } .meta { margin-top: 50px; opacity: 0.6; } #end { top: -800px; opacity: 1; display: block; border-bottom: 2px solid #fff; } #end .susliks { position: absolute; left: 50%; top: auto; margin-left: -30px; bottom: -54px; } #startFlag:checked ~ #end { -webkit-animation: end 1s linear 15s forwards; animation: end 1s linear 15s forwards; } @-webkit-keyframes end { from { top: -800px; } to { top: 0; } } @keyframes end { from { top: -800px; } to { top: 0; } } .btn-group { margin: 80px auto; width: 100px; height: 90px; overflow: hidden; position: relative; } .btn-group label { display: block; position: absolute; bottom: 0; left: 0; width: 100%; height: 40px; background: #51a70d; color: #fff; text-align: center; line-height: 40px; cursor: pointer; border-bottom: 4px solid #62b210; border-radius: 4px; } .hole { position : absolute; left : 0px; top : 70px; width : 68px; height : 100px; background-image : -webkit-linear-gradient(left, #2a7d2f 0%, #78fc73 25%, #78fc73 35%, #113e15 95%); background-image : linear-gradient(to right, #2a7d2f 0%, #78fc73 25%, #78fc73 35%, #113e15 95%); border-left : 1px solid #236d22; box-shadow : 0px 2px 5px 0px rgba(0, 0, 0, 0.6); } .hole:before { display : block; content : ''; position : absolute; width : 84px; height : 24px; margin-left : -8px; top : -24px; background-image : -webkit-linear-gradient(top, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.3) 2px, rgba(255, 255, 255, 0.3) 3px, rgba(255, 255, 255, 0) 4px ), -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.4) 3px, rgba(255, 255, 255, 0.2) 5px, rgba(255, 255, 255, 0) 6px ), -webkit-linear-gradient(left, #2a7d2f 0%, #78fc73 25%, #78fc73 35%, #113e15 95%); background-image : linear-gradient(to bottom, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 0.3) 2px, rgba(255, 255, 255, 0.3) 3px, rgba(255, 255, 255, 0) 4px ), linear-gradient(to top, rgba(0, 0, 0, 0.4) 3px, rgba(255, 255, 255, 0.2) 5px, rgba(255, 255, 255, 0) 6px ), linear-gradient(to right, #2a7d2f 0%, #78fc73 25%, #78fc73 35%, #113e15 95%); } .time-wrapper { position: absolute; left: -150px; top: 20px; -webkit-transition: 1s; transition: 1s; } #startFlag:checked ~ .time-wrapper { left: 20px; } #startFlag:checked ~ .time-wrapper .progress { -webkit-animation: progress 15s linear 0s forwards; animation: progress 15s linear 0s forwards; } @-webkit-keyframes progress { from { width: 0; background: #00ff00; } to { width: 136px; background: #ff0000; } } @keyframes progress { from { width: 0; background: #00ff00; } to { width: 136px; background: #ff0000; } } .time-wrapper p { color: #fff; line-height: 24px; } .time { border: 2px solid #fff; width: 140px; height: 20px; } .time .progress { height: 16px; width: 0; } #map { position: absolute; bottom: 0; left: -600px; width: 1800px; height: 800px; -webkit-transform: perspective(600px) rotateX(45deg); transform: perspective(600px) rotateX(45deg); -webkit-transform-origin: center bottom; -ms-transform-origin: center bottom; transform-origin: center bottom; } .map { width: 5%; height: 100%; float: left; } .map:nth-child(2n) { background: #62b210; } .map:nth-child(2n+1) { background: #51a70d; } .group { position: absolute; width : 68px; } .group:nth-child(1) { left: 45px; top: 210px; } .group:nth-child(2) { left: 165px; top: 270px; } .group:nth-child(3) { left: 345px; top: 250px; } .group:nth-child(4) { left: 80px; top: 370px; } .group:nth-child(5) { left: 400px; top: 410px; } .group:nth-child(6) { left: 470px; top: 230px; } .group input[type="radio"] { position : absolute; top : -1000px; left : 0px } .points { position: absolute; top: -100px; left: 50%; width: 100px; height: 48px; margin-left: -50px; background: rgba(0, 0, 0, 0.2); border: 4px solid #ffffff; border-radius: 4px; color: #fff; -webkit-transition: top 1s; transition: top 1s; } #startFlag:checked ~ .points { top: 20px; } .points .points-viewport { overflow: hidden; height: 40px; width: 100%; } .points-list { margin-top : -480px; } .points-list input[type="radio"] { position : absolute; top : -1000px; left : 0px; } .points-list .block { width : 100px; height : 40px; transition : all 1s linear 0s; -webkit-transition : all 1s linear 0s; } .points-list input[type="radio"]:checked + .block{ height : 0px; } .point { display: block; height: 40px; text-align: center; font-size: 30px; font-weight: bold; cursor: default; } #startFlag { position: absolute; top: -20px; left: -20px; z-index: 999; } #startFlag:checked + #start { opacity: 0; pointer-events: none; -webkit-pointer-events: none; } .group input[type="radio"]:checked + .susliks1 { -webkit-animation-name: susliks1; animation-name: susliks1; -webkit-animation-delay: 2s; animation-delay: 2s; -webkit-animation-duration: 10s; animation-duration: 10s; } @-webkit-keyframes susliks1 { 0% { top: 70px; } 10% { top: 0; } 15% { top: 0; } 20% { top: 70px; } 100% { top: 70px; } } @keyframes susliks1 { 0% { top: 70px; } 10% { top: 0; } 15% { top: 0; } 20% { top: 70px; } 100% { top: 70px; } } .group input[type="radio"]:checked + .susliks2 { -webkit-animation-name: susliks2; animation-name: susliks2; -webkit-animation-delay: 2s; animation-delay: 2s; -webkit-animation-duration: 10s; animation-duration: 10s; } @-webkit-keyframes susliks2 { 0% { top: 70px; } 30% { top: 70px; } 60% { top: 0; } 70% { top: 0; } 90% { top: 0; } } @keyframes susliks2 { 0% { top: 70px; } 30% { top: 70px; } 60% { top: 0; } 70% { top: 0; } 90% { top: 0; } } .group input[type="radio"]:checked + .susliks3 { -webkit-animation-name: susliks3; animation-name: susliks3; -webkit-animation-delay: 0s; animation-delay: 0s; -webkit-animation-duration: 5s; animation-duration: 5s; } @-webkit-keyframes susliks3 { 0% { top: 70px; } 30% { top: 70px; } 60% { top: 0; } 70% { top: 0; } 90% { top: 70px; } } @keyframes susliks3 { 0% { top: 70px; } 30% { top: 70px; } 60% { top: 0; } 70% { top: 0; } 90% { top: 70px; } } .group input[type="radio"]:checked + .susliks4 { -webkit-animation-name: susliks4; animation-name: susliks4; -webkit-animation-delay: 2s; animation-delay: 2s; -webkit-animation-duration: 8s; animation-duration: 8s; } @-webkit-keyframes susliks4 { 0% { top: 70px; } 10% { top: 70px; } 15% { top: 0; } 30% { top: 70px; } } @keyframes susliks4 { 0% { top: 70px; } 10% { top: 70px; } 15% { top: 0; } 30% { top: 70px; } } .group input[type="radio"]:checked + .susliks5 { -webkit-animation-name: susliks5; animation-name: susliks5; -webkit-animation-delay: 0s; animation-delay: 0s; -webkit-animation-duration: 10s; animation-duration: 10s; } @-webkit-keyframes susliks5 { 0% { top: 70px; } 70% { top: 70px; } 80% { top: 0; } 90% { top: 70px; } } @keyframes susliks5 { 0% { top: 70px; } 70% { top: 70px; } 80% { top: 0; } 90% { top: 70px; } } .group input[type="radio"]:checked + .susliks6 { -webkit-animation-name: susliks6; animation-name: susliks6; -webkit-animation-delay: 4s; animation-delay: 4s; -webkit-animation-duration: 6s; animation-duration: 6s; } @-webkit-keyframes susliks6 { 0% { top: 70px; } 70% { top: 70px; } 90% { top: 0; } 100% { top: 70px; } } @keyframes susliks6 { 0% { top: 70px; } 70% { top: 70px; } 90% { top: 0; } 100% { top: 70px; } } .group input[type="radio"]:checked + .susliks7 { -webkit-animation-name: susliks7; animation-name: susliks7; -webkit-animation-delay: 2s; animation-delay: 2s; -webkit-animation-duration: 6s; animation-duration: 6s; } @-webkit-keyframes susliks7 { 0% { top: 70px; } 20% { top: 70px; } 25% { top: 0; } 35% { top: 70px; } } @keyframes susliks7 { 0% { top: 70px; } 20% { top: 70px; } 25% { top: 0; } 35% { top: 70px; } } .group input[type="radio"]:checked + .susliks8 { -webkit-animation-name: susliks8; animation-name: susliks8; -webkit-animation-delay: 0s; animation-delay: 0s; -webkit-animation-duration: 8s; animation-duration: 8s; } @-webkit-keyframes susliks8 { 0% { top: 70px; } 50% { top: 70px; } 60% { top: 0; } 70% { top: 70px; } } @keyframes susliks8 { 0% { top: 70px; } 50% { top: 70px; } 60% { top: 0; } 70% { top: 70px; } } .group input[type="radio"]:checked + .susliks9 { -webkit-animation-name: susliks9; animation-name: susliks9; -webkit-animation-delay: 0s; animation-delay: 0s; -webkit-animation-duration: 10s; animation-duration: 10s; } @-webkit-keyframes susliks9 { 0% { top: 70px; } 10% { top: 70px; } 20% { top: 0; } 40% { top: 70px; } } @keyframes susliks9 { 0% { top: 70px; } 10% { top: 70px; } 20% { top: 0; } 40% { top: 70px; } } .group input[type="radio"]:checked + .susliks10 { -webkit-animation-name: susliks10; animation-name: susliks10; -webkit-animation-delay: 2s; animation-delay: 2s; -webkit-animation-duration: 8s; animation-duration: 8s; } @-webkit-keyframes susliks10 { 0% { top: 70px; } 40% { top: 70px; } 55% { top: 0; } 65% { top: 70px; } } @keyframes susliks10 { 0% { top: 70px; } 40% { top: 70px; } 55% { top: 0; } 65% { top: 70px; } } .group input[type="radio"]:checked + .susliks11 { -webkit-animation-name: susliks11; animation-name: susliks11; -webkit-animation-delay: 0s; animation-delay: 0s; -webkit-animation-duration: 10s; animation-duration: 10s; } @-webkit-keyframes susliks11 { 0% { top: 70px; } 40% { top: 70px; } 50% { top: 0; } 60% { top: 70px; } } @keyframes susliks11 { 0% { top: 70px; } 40% { top: 70px; } 50% { top: 0; } 60% { top: 70px; } } .group input[type="radio"]:checked + .susliks12 { -webkit-animation-name: susliks12; animation-name: susliks12; -webkit-animation-delay: 3s; animation-delay: 3s; -webkit-animation-duration: 6s; animation-duration: 6s; } @-webkit-keyframes susliks12 { 0% { top: 70px; } 30% { top: 70px; } 50% { top: 0; } 55% { top: 70px; } } @keyframes susliks12 { 0% { top: 70px; } 30% { top: 70px; } 50% { top: 0; } 55% { top: 70px; } }
虽然用了比较绕的方法实现了游戏,但是里面的知识点是可以在实际中用上的,而且很多css的技巧也在里面了,收获颇丰。
经过测试,在safari里面有一个不小的bug,点击地鼠后,地鼠不会钻下去,而是停在原位,这严重影响了游戏的运行,我们用了一个hack技巧,在uncheck的时候我们设置地鼠透明度为0,只有在checked的时候透明度是1,这样就解决了safari中的问题,也不会影响在其他浏览器的运行情况。