๐ป ํ๋ก ํธ์๋19 [CSS] aspect-ratio ์์ด ์์ ๋น์จ ์ ์งํ๊ธฐ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ์ด์๋ก ํ์ฌ์์ caniuse์์ 95%์ด์ ์ง์๋๋ css์์ฑ๋ง ์ฌ์ฉํด์ผ ํ๋๋ฐasepct-ratio๋ 95%๊ฐ ๋์ง ์์ ์ฌ์ฉํ ์ ์์์ต๋๋ค๐ฅน aspect-ratio์์ด ์ด๋ป๊ฒ ์์์ ๋น์จ์ ์ ์งํ ์ ์์๊น์?๋ฐ๋ก padding-top(๋๋ padding-bottom)์ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.โญ๏ธ๊ธฐ๋ณธ์ ์ผ๋ก padding๊ฐ์ ๋ฐฑ๋ถ์จ์ ๋ถ๋ชจ ์์์ width๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐ์ด ๋ฉ๋๋ค.โญ๏ธ-> ์ปจํ ์ด๋๋ธ๋ก์ผ๋ก๋ถํฐ_๋ฐฑ๋ถ์จ_๊ณ์ฐํ๊ธฐ(MDN๋ฌธ์ ์ฐธ๊ณ ) ์ด๋ฌํ ์ฑ์ง์ ์ด์ฉํด์ ๊ฐ๋จํ css ํธ๋ฆญ์ ๋ง๋ค ์ ์์ต๋๋ค. See the Pen without aspect-ratio by JM K (@JM-K-the-selector) on CodePen. ์ด ์.. 2024. 8. 11. [JS]๋ณ๋ ฌ์ ์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌํ๊ธฐ ๋น๋๊ธฐ๋ฅผ ๋ณ๋ ฌ์ ์ผ๋ก ์ํํ๋ ๊ฒ์๋ ํฌ๊ฒ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. 1. Promise.all ์ํ ๊ฐ๋ฅํ ๊ฐ์ฒด์ ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํํ ํ, ํน์ ํ๋ก๋ฏธ์ค๊ฐ ์ฃผ์ด์ง์ง ์์์ ๋ ์ดํํ๋ Promise๋ฅผ ๋ฐํํฉ๋๋ค. ์ฃผ์ด์ง ํ๋ก๋ฏธ์ค ์ค ํ๋๊ฐ ๊ฑฐ๋ถํ๋ ๊ฒฝ์ฐ, ์ฒซ ๋ฒ์งธ๋ก ๊ฑฐ์ ํ ํ๋ก๋ฏธ์ค์ ์ด์ ๋ฅผ ์ฌ์ฉํด ์์ ๋ ๊ฑฐ๋ถํฉ๋๋ค. ์ ๋ ฅ ๊ฐ์ผ๋ก ๋ค์ด์จ ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ๊ฑฐ๋ถ ๋นํ๋ฉด Promise.all()์ ์ฆ์ ๊ฑฐ๋ถํฉ๋๋ค. const promise1 = Promise.resolve(3); const promise2 = 42; const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([.. 2024. 4. 19. React Native - ์น๋ทฐ ํต์ ๊ตฌํ(TypeScript) ์ฐ์ React Native์์ ์น๋ทฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ react-native-webivew ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. RN Webview ๋ฉ์์ง ๋ณด๋ผ ๋ webviewRef.current.postMessage(JSON.stringify(message)); window.ReactNativeWebView?.postMessage(JSON.stringify(message)); ๋ฉ์์ง ๋ฐ์ ๋ WebView ์ปดํฌ๋ํธ์ onMessage ์์ฑ์ ์ฌ์ฉํฉ๋๋ค //์๋ document.addEventListener('message', getMessageListener); //ios window.addEventListener('message', getMessageListener); RN์์ ์ฌ์ฉํ๋ ์ ref๋ฅผ ์ฌ์ฉํด.. 2024. 1. 27. Next scss ์ ์ญ๋ณ์ ์ ์ฉํ๊ธฐ ์ ์ญ ์คํ์ผ ๋ณ์๋ค์ ํ ๋ฒ์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ฐ์ next.config.js ํ์ผ์์ sassOptions์ ์ฌ์ฉํ์ฌ Sass compiler๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. sassOptions์ sass-loader์ ์ค์ ์ ๋๋ค https://github.com/webpack-contrib/sass-loader?tab=readme-ov-file#additionaldata addtionalData๋ ์ค์ ํญ๋ชฉ ํ์ผ ์์ Sass ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ์คํ์ผ ํ์ผ์ ์ ์ญ ๋ณ์ ํ์ผ๋ค์ ์ํฌํธ ํ์ง ์์๋ scssํ์ผ ์์์ ์ ์ญ ๋ณ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. /** @type {import('next').NextConfig} */ const nextConfig = { ... sassOptio.. 2024. 1. 17. React Native ์น์์ผ ์ฑํ ๊ตฌํ ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ RN์ผ๋ก ์ฑํ ์ ๊ตฌํ ์ค์ด๋ค ์ผ๋จ ํด๋ผ์ด์ธํธ์์๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ธ ์น์์ผ ์ฐ๊ฒฐ์ ๊ตฌํํด๋ดค๋ค ์ฐ์ ์น์์ผ ์ฐ๊ฒฐ์ ์ํ WebSocketProvider๋ฅผ ๋ง๋ค์ด์ ์ฑํ ๋ฐฉ์ ๊ฐ์ธ์คฌ์ต๋๋ค. ์น์์ผ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ค์ ํจ์๋ก ๋ง๋ค๊น ํ๋ค๊ฐ ์ด์ฐจํผ ํ๋์ ์น์์ผ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋์ค๋ฅผ ์์ฑํ์ต๋๋ค. useMemo๋ฅผ ์ฌ์ฉํด์ ํ ํฐ์ด ์ ๋ฐ์ดํธ ๋์์ ๋ ์๋ก์ด ์น์์ผ์ ์์ฑํฉ๋๋ค. WebSocketContext๋ฅผ ์ฌ์ฉํด์ ์ฑํ ๋ฐฉ์์ ์น์์ผ์ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค. import {tokenState} from '@/store/loginAtom'; import React, {createContext, useMemo} from 'react'; import {useReco.. 2024. 1. 10. CSS ์์ ์์๊ฐ focus ๋ ๋ ๋ถ๋ชจ ์์ ํจ๊ณผ ์ฃผ๊ธฐ ๋ณดํต ์ธํ์ ๊ฒฝ์ฐ์๋ ํ๋์ ์ปจํ ์ด๋๊ฐ ์ธํํ๊ทธ์ ์ด๊ธฐํ ๋ฒํผ ๋ฑ์ ๋ด๊ณ ์๊ณ ์กฐ๊ฑด์ ๋ง์ง ์๋ ์ ๋ ฅ๊ฐ์ด ๋ค์ด์์ ๋ ๋ถ๋ชจ ์ปจํ ์ด๋์ border ์์์ ๋ณํ๋ฅผ ์ค์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค ์ด๋ด ๋ ๊ฐ๋จํ๊ฒ ์ธ ์ ์๋ ๋ฐฉ๋ฒ์ :focust-within ์ฌ์ฉํ๊ธฐ! MDN์ ์ ๋ง ๊ฐ๋จํ๊ฒ ์ฌ์ฉ๋ฒ์ด ๋์์์ต๋๋ค https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within :focus-within CSS:focus-within ์์ฌ ํด๋์ค๋ ํฌ์ปค์ค๋ฅผ ๋ฐ์๊ฑฐ๋, ํฌ์ปค์ค๋ฅผ ๋ฐ์ ์์๋ฅผ ํฌํจํ๋ ์์๋ฅผ ๋ํ๋ ๋๋ค. ์ฆ ์ค์ค๋ก :focus ์์ฌ ํด๋์ค์ ์ผ์นํ๊ฑฐ๋, ๊ทธ ์์ ์ค ํ๋๊ฐ :focus์ ์ผ์นํ๋ ์์๋ฅผ ๋ํ๋ ๋๋ค. Which flavor would you.. 2024. 1. 8. ์ด์ 1 2 3 4 ๋ค์