原文連接感謝 comehope 大佬的 [前端每日實戰]css
github.io 瀏覽
https://github.com/shanyuhai1...html
html
結構命名規則使用了 BEM前端
<figure class="street"> <div class="market"> </div> </figure>
常規樣式初始化git
* { margin: 0; padding: 0; box-sizing: border-box; } body { height: 100vh; overflow: hidden; }
街道背景分爲兩部分github
深藍色的天空segmentfault
.street { height: 100vh; position: relative; display: flex; justify-content: center; align-items: flex-end; background-color: #0b2e4e; overflow: hidden; }
黑色的地面學習
.street::before { content: ""; position: absolute; bottom: 0; left: 0; right: 0; width: 100%; height: 25vh; background-color: #000000; }
超市, 首先建立一個長方形表明超市flex
.market { position: relative; display: flex; width: 520px; height: 270px; background-color: #fffecc; border: 4px solid #333333; }
接着給超市增長 24 HOURS 的標識, 須要在 market
下增長一個 span
標籤動畫
<div class="market"> <span class="market__name">24 hours</span> </div>
生意好的超市必然亮堂堂spa
.market { box-shadow: 0 22px 110px 12px #f5efa1; }
增大超市(正方形的上 border
), 用於存放標識
.market { border-top-width: 50px; }
將標識定位到上 border
, 並給其添加發光樣式
.market__name { position: absolute; top: -38px; left: 20px; font-family: sans-serif; font-size: 1.4em; letter-spacing: 0.4em; color: #bdf8ff; text-transform: uppercase; text-shadow: 0px 0px 9px #95cfef; }
再給該標識添加閃爍動畫
.market__name { animation: signboardFlashes 5s infinite alternate linear; } /* keyframes */ @keyframes signboardFlashes { 0% { opacity: 1; } 35% { opacity: 1; } 36% { opacity: 0; } 37% { opacity: 1; } 70% { opacity: 1; } 72% { opacity: 0; } 73% { opacity: 1; } 74% { opacity: 0; } 75% { opacity: 1; } 100% { opacity: 1; } }
接着須要給超市增長 4 扇門, 並基於基礎的樣式
<div class="market"> <span class="market__name">24 hours</span> <span class="market__fold"></span> <span class="market__fold"></span> <span class="market__fold"></span> <span class="market__fold"></span> </div>
.market__fold { position: relative; width: 25%; border: 8px solid #000000; } /* 此處沒法在 .market__fold 使用 inset 替代 */ .market__fold::before { content: ""; position: absolute; top: 0; left: 0; bottom: 0; right: 0; width: 100%; height: 100%; box-shadow: 0 0 2px 1px #f3f1d5; }
門是感應門, 當有生物靠近纔會打開, 因此打開的動畫等一下完成
在 market
中添加 moon
<div class="market"> <span class="moon"></span> </div>
經過絕對定位將其移動到超市的上方, 並添加動畫效果
.moon { position: absolute; top: -125px; left: -50px; width: 40px; height: 40px; background-color: #ffffc9; border-radius: 50%; box-shadow: 0 0 20px 1px #ffffc9; animation: moonMoves 360s infinite alternate linear; } @keyframes moonMoves { 0% { transform: translate(0, 0); } 50% { transform: translate(300px, -10px); } 100% { transform: translate(600px, 0); } }
在 market
添加 cat
<div class="market"> <section class="cat"></section> </div>
首先給予一個輪廓方便觀察
.cat { --cat-color: red; position: absolute; left: -200px; bottom: -24px; width: 46px; height: 30px; margin: auto; color: var(--cat-color); background-color: var(--cat-color); border-radius: 30px; }
修改貓的 DOM 結構, 添加頭, 尾巴, 四肢
<section class="cat"> <div class="cat__head"></div> <span class="cat__tail"></span> <span class="cat__leg"></span> <span class="cat__leg"></span> <span class="cat__leg"></span> <span class="cat__leg"></span> </section>
而後依次給予其樣式
首先是頭部, 頭部使用僞元素造成耳朵, 並添加頭部晃動效果
.cat__head { position: absolute; right: -10px; top: -8px; width: 24px; height: 24px; background-color: inherit; border-radius: 50%; animation: catMovesHead 0.3s infinite linear; } .cat__head::before, .cat__head::after { content: ""; position: absolute; top: 0; width: 10px; height: 10px; background-color: inherit; border-radius: 2px; } .cat__head::before { left: 2px; transform: rotate(16deg); } .cat__head::after { right: 2px; transform: rotate(-16deg); } @keyframes catMovesHead { 0% { transform: translateY(0); } 50% { transform: translateY(2px); } 100% { transform: translateY(0); } }
添加尾巴及動畫效果(尾巴由橢圓形的一半構成)
.cat__tail { position: absolute; left: -18px; top: -22px; width: 30px; height: 42px; border-radius: 50%; border: 7px solid var(--cat-color); border-left-color: transparent; border-bottom-color: transparent; transform-origin: right; animation: catMovesTail 0.3s infinite linear; } @keyframes catMovesTail { 0% { transform: rotate(0); } 50% { transform: rotate(-3deg); } 100% { transform: rotate(0); } }
貓咪的四肢
.cat__leg { position: absolute; bottom: -12px; width: 6px; height: 20px; background-color: inherit; border-radius: 3px; transform-origin: top; }
將四肢分開和添加動畫
<span class="cat__leg cat__leg--1"></span> <span class="cat__leg cat__leg--2"></span> <span class="cat__leg cat__leg--3"></span> <span class="cat__leg cat__leg--4"></span>
.cat__leg--1, .cat__leg--2 { left: 5px; } .cat__leg--3, .cat__leg--4 { right: 5px; } .cat__leg--1, .cat__leg--3 { transform: rotate(24deg); animation: catMovesLegs 0.6s infinite linear; } .cat__leg--2, .cat__leg--4 { transform: rotate(-24deg); animation: catMovesLegs 0.6s infinite -0.3s linear; } @keyframes catMovesLegs { 0% { transform: rotate(36deg); } 50% { transform: rotate(-36deg); } 100% { transform: rotate(36deg); } }
給予貓一個總體的動畫
.cat { animation: catRuns 20s infinite linear; } @keyframes catRuns { 0% { transform: translateX(0) rotateY(0); } 70% { transform: translateX(800px) rotateY(0); } 71% { transform: translateX(1000px) rotateY(180deg); } 100% { transform: translateX(0) rotateY(180deg); } }
修改超市門的 DOM 上的 class
<span class="market__fold"></span> <span class="market__fold market__fold--left"></span> <span class="market__fold market__fold--right"></span> <span class="market__fold"></span>
再增長開關門的效果, 根據上方貓的花費時間進行計算, 取同樣的時間更方便一些
.market__fold--left { animation: doorMovesLeft 20s infinite linear; } .market__fold--right { animation: doorMovesRight 20s infinite linear; } @keyframes doorMovesLeft { 0% { transform: translateX(0); } 28% { transform: translateX(0); } 30% { transform: translateX(-90%); } 54% { transform: translateX(-90%); } 56% { transform: translateX(0); } 83% { transform: translateX(0); } 85% { transform: translateX(-90%); } 97% { transform: translateX(-90%); } 99% { transform: translateX(0); } 100% { transform: translateX(0); } } @keyframes doorMovesRight { 0% { transform: translateX(0); } 28% { transform: translateX(0); } 30% { transform: translateX(90%); } 54% { transform: translateX(90%); } 56% { transform: translateX(0); } 83% { transform: translateX(0); } 85% { transform: translateX(90%); } 97% { transform: translateX(90%); } 99% { transform: translateX(0); } 100% { transform: translateX(0); } }
最後就這樣大功告成了
不過記得把貓的顏色改回來
/* 貓 */ .cat { --cat-color: #000000; }
最後切換爲移動端時注意到 超市會橫向佔滿, 經過 padding 設置一個空隙便可
.street { padding: 0 6vw 115px; }
最近忙着學習 Koa, 結果 CSS 感受忘得差很少了,唉