๊ณ์ฐ๊ธฐ ๋ชฉ์
๋ง๋ค๊ธฐ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ค.
์ค๋ ฅ์๋ ๋ถ๋ค์ด ๋ง์ผ์
์ ์ด๋ป๊ฒ ํ๋ฉด ๋ด ๊ณ์ฐ๊ธฐ์ ์ฐจ๋ณ์ ์ ์ค ์ ์์๊น?๋ผ๊ณ ์๊ฐํ๋ฉฐ ์์
์ ๋ง๋ฌด๋ฆฌํ ๊ฑฐ ๊ฐ๋ค.
์ ๋๋ฉ์ด์
ํจ๊ณผ
์ ๋ฐ์ํ
์ ์ถ๊ฐํด ์ ์ถํ๋ค.
๐ป HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>๊ณ์ฐ๊ธฐ ๋ชฉ์ </title> <link rel="stylesheet" href="./style.css"> </head> <body> <section id="container"> <div class="calculator"> <!--๊ฒฐ๊ณผ ํ๋ฉด--> <div class="result-display"> <span class="procedure">500 + 50</span> <p class="result">500 </p> </div> <!--buttons--> <div class="buttons"> <div class="btn-row"> <button class="operator sm-font">AC</button> <button class="operator">ยฑ</button> <button class="operator sm-font">%</button> <button class="operator">รท</button> </div> <div class="btn-row"> <button class="num">7</button> <button class="num">8</button> <button class="num">9</button> <button class="operator">ร</button> </div> <div class="btn-row"> <button class="num">4</button> <button class="num">5</button> <button class="num">6</button> <button class="operator">-</button> </div> <div class="btn-row"> <button class="num">1</button> <button class="num">2</button> <button class="num">3</button> <button class="operator">+</button> </div> <div class="btn-row"> <button class="num">0</button> <button class="num">.</button> <button class="btn-result">=</button> </div> </div> </div> </section> </body> </html>
โ๏ธ ์ข ์ด์ ๊ทธ๋ฆฌ๋ฉด์ ์ปจํ ์ธ ๋ฅผ ์ด๋ป๊ฒ ๋๋์ง ๊ตฌ์ํ๋ค.
โ๏ธid
,class
์ด๋ฆ ์ค์ ์ ์ํด์ผํ๋ค๊ณ ์๊ฐํ๋ค.
โ๏ธdiv
๋ฅผ ๋ง์ด ์ฐ๊ณ ์ถ์ง ์์์ ์ํฉ์ ๋ง๋ ํ๊ทธ๋ฅผ ์์ฑํ๋ค.(์๋ฉํฑ์ ์๊ฐ ๋ณด๋ค ์ด๋ ต๋ค..)
๐ป CSS
@font-face { font-family: 'GmarketSans'; font-weight: 300; font-style: normal; src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.eot'); src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.eot?#iefix') format('embedded-opentype'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.woff2') format('woff2'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.woff') format('woff'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansLight.ttf') format("truetype"); font-display: swap; } @font-face { font-family: 'GmarketSans'; font-weight: 500; font-style: normal; src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.eot'); src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.eot?#iefix') format('embedded-opentype'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.woff2') format('woff2'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.woff') format('woff'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansMedium.ttf') format("truetype"); font-display: swap; } @font-face { font-family: 'GmarketSans'; font-weight: 700; font-style: normal; src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.eot'); src: url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.eot?#iefix') format('embedded-opentype'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.woff2') format('woff2'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.woff') format('woff'), url('https://cdn.jsdelivr.net/gh/webfontworld/gmarket/GmarketSansBold.ttf') format("truetype"); font-display: swap; } * { box-sizing: border-box; margin: 0; padding: 0; border: 0px; font-family: 'GmarketSans',sans-serif; font-size: 16px; } body { margin: 0; padding: 0; background-image: linear-gradient(315deg, #060047, #3A328C); } button { cursor: pointer; } #container { display: flex; display: flex; justify-content: center; align-items: center; height: 100vh; } .calculator { position: relative; display: flex; flex-direction: column; align-items: center; width: 393px; height: 698px; background-color: #150E60 ; border-radius: 30px; padding: 40px; box-shadow: 8px 8px 50px 0 rgba(5, 0, 69, 0.8),inset 2px 2px 0 0 #3A328C, inset -2px -2px 0 0 #120c57; transition: 0.3s; animation-play-state: paused; } .calculator:hover { animation: line-st ease-in 3s infinite; } @keyframes line-st { 0%{ box-shadow: 5px 5px 40px 0 rgba(5, 0, 69, 0.8),inset 2px 2px 0 0 #3A328C, inset -2px -2px 0 0 #0e0752; } 25%{ box-shadow: 5px 5px 40px 0 rgba(5, 0, 69, 0.8),inset -2px 2px 0 0 #3A328C, inset -2px 2px 0 0 #0e0752; } 65%{ box-shadow: 5px 5px 40px 0 rgba(5, 0, 69, 0.8),inset 2px -2px 0 0 #3A328C, inset 2px -2px 0 0 #0e0752; } 100%{ box-shadow: 5px 5px 40px 0 rgba(5, 0, 69, 0.8),inset 2px 2px 0 0 #3A328C, inset -2px -2px 0 0 #0e0752; } } .result-display, .buttons { width: 100%; } .result-display { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; flex-grow: 1; padding-bottom: 30px; margin-bottom: 30px; border-bottom: 2px solid #3A328C; } .result-display .procedure { color: #3A328C; font-size: 1.15rem; padding-bottom: 10px; } .result-display .result { color: #fff; font-size: 2.5rem; font-weight: 700; } .buttons { flex-grow: 3; display: flex; flex-direction: column; } .buttons .btn-row { display: flex; flex-grow: 1; align-items: center; gap: 8px; } .buttons .btn-row button { position: relative; flex: 1 70px; height: 75px; line-height: 50px; border-radius: 50%; display: flex; justify-content: center; align-items: center; color: #fff; font-size: 1.5rem; transition: 0.3s; z-index: 1; overflow: hidden; } .buttons .btn-row button::after{ content: ''; position: absolute; width: 100%; height: 100%; left: 0; top: 0; border-radius: 100px; transition: 0.3s; z-index: -1; transform: scale(0); } .buttons .btn-row button:hover { box-shadow: 0px 10px 20px 0 rgba(5, 0, 69, 0.8); transform: translateY(-3px); } .buttons .btn-row button:hover::after { background-color: rgba(0, 0, 0, 0.11); transform: scale(1); } .buttons .btn-row button:active { border: 2px solid #ffffff08; box-shadow: inset 3px 3px 0 0 rgba(0,0,0, 0.3); box-shadow: none; transform: translateY(0); } .buttons .btn-row .operator { background-color: #3A328C; } .buttons .btn-row .num { background-color: #060147; } .buttons .btn-row .sm-font { font-size: 1rem; } .buttons .btn-row:last-child .btn-result { flex-grow: 100; border-radius: 50px; background-color: #DC005E; } @media (max-width:768px) { .calculator { width: 100%; height: 100vh; border-radius: 0; box-shadow: none; } .calculator:hover { animation-play-state: paused; animation: none; box-shadow: none; } .result-display { border-bottom: 0; margin-bottom: 0; } .result-display .result { font-size: 3.1rem; } .buttons .btn-row button { flex: 1; height: 100%; border-radius: 0%; } .buttons .btn-row { gap: 0; } .buttons .btn-row:last-child .btn-result { border-radius: 0; flex-grow: 0.665; } .buttons .btn-row button:hover { box-shadow: 0; transform: translateY(0); box-shadow: 0 0 0 0; } .buttons .btn-row button:hover::after { transform: scale(1); border-radius: 0; } .buttons .btn-row button:active { transform: translateY(1px); border: 0; box-shadow: inset 3px 3px 5px 0 rgba(0,0,0, 0.1),inset -3px -3px 5px 0 rgba(0,0,0, 0.1); } }
โ๏ธ ๋จ์ ๋ฐฐ๊ฒฝ ๋์ ๊ทธ๋ผ๋ฐ์ด์ ์ ๋ฃ์ด์ฃผ์๋ค.
โ๏ธ ๊ณ์ฐ๊ธฐ ํ ๋๋ฆฌ๋ฅผ ๊ทธ๋ผ๋ฐ์ด์ ์ผ๋ก ์ฃผ๊ณ ์ถ์๋๋ฐ ์ดํpadding
์์ ์ถ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ดbox-shadow
๋ก ๋ณ๊ฒฝํด ์ฃผ์๋ค.
โ๏ธ ๊ณ์ฐ๊ธฐ์ ๋ง์ฐ์คhover
๋ ๊ฒฝ์ฐ ํ ๋๋ฆฌ์animation
์์๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
โ๏ธ@media์ฟผ๋ฆฌ
๋ฅผ ์ด์ฉํด ๋ฐ์ํ์ผ๋ก ์์ ํ๋ค.โ๏ธ ๋ฐ์ํ ์์ ํ๋ฉด์ ๋ฒํผ์ ๋ฅ๊ธ๊ฒ ํํํ๊ณ ์ถ์๋๋ฐ ์๊ฐ๋ณด๋ค ์ด๋ ค์ ๋ค๋ชจ๋๊ฒ ์์ ํ๋ค. (๋ค์์ ๋ค์ ์์ ํด ๋ณด์.)
gif๋ก ๋ณํํ๋๋ฐ ๋ฒ๋ฒ
๊ฑฐ๋ ค์ ์์ฝ๋ค.ใ
์ด๋ฒ ์ฒซ ํ์ด ํ๋์ ํตํด ๊ฐ์ ๋ง๋ ๊ณ์ฐ๊ธฐ์ ๋ํด ์ค๋ช ํ๋ ์๊ฐ์ ๊ฐ์ก๋ค. ๋ํ ์๋ก ๊ถ๊ธํ๊ฒ ์์ผ๋ฉด ์ด๋ป๊ฒ ์์ ํ๋์ง๋ ์ค๋ช ํ๋ฉด์ ์๋ก ์ ๋ณด๋ฅผ ๊ณต์ ํ ์ ์์๋ค.
๋คํ์ด๋ ํ์ด๋ถ๋ ์น์ ํ์
จ๊ณ ์นญ์ฐฌ์ ์๋์์ด ์ฃผ์
์ ๊ฐ์ฌํ ๋ฐ๋ฆ์ด์๋ค.
ํ์ด๋ถ๊ป ๋์์ด ๋๊ณ ์ ๋์๋๋ฆด๊ฑฐ ์๋์ง ๋ฌผ์ด๋ณด๊ธฐ๋ ํ๊ณ ์๋ฃ๋ ๊ณต์ ํ๋๊ฑฐ ๊ฐ๋ค. ํ์ด๋ถ๊ป์ ๊ธ์ ์ ์ผ๋ก ๋ด์ฃผ์๊ธฐ๋ ํ๊ณ ๋์์ด ๋์ ๋คํ์ด๋ค.
์ดํ ํ์ด ํ๋์ ํตํด์๋ ์ข์ ์ํฅ์ ๋ฐ์ ์ ์์๊ฑธ๋ก ์์๋๋ค.
๊ณ์ฐ๊ธฐ ๋ชฉ์ ์ ๋ง๋๋ฉด์ ๋ค๋ฅธ ์๊ฐ์๋ถ๋ค์ ๊ณผ์ ๋ฌผ์ ๋นํด ๋ด๊ฐ ๋ง๋ ๊ฑด ๋ญ๊ฐ ํ์ ๋ฐํ ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค.๋ค์์ ๋์ ๊ฐ์ฑ์ ์ด๋ ค ๋ง๋ค์ด ๋ณด์.
CSS์์ ๋ณ์๋ฅผ ์ด์ฉํด ๋คํฌ๋ชจ๋ ์์ ์ ํ ์ ์๋ค. ์ดํ ๊ณผ์ ๋ฌผ์ ํด๋น ์์๋ฅผ ์ ์ฉํด ๋ด์ผ๊ฒ ๋ค.
๐ https://velog.io/@rmaomina/darkmode-toggle-button
๐ https://inpa.tistory.com/entry/CSS-%F0%9F%92%8D-%EB%B2%84%ED%8A%BC-%EB%94%94%EC%9E%90%EC%9D%B8-%EB%AA%A8%EC%9D%8C
๐ https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Animations/Using_CSS_animations