๐Ÿ“Œ ๋ฏธ์…˜

  • Link ์—ญํ• ๋กœ์จ spanํƒœ๊ทธ, imgํƒœ๊ทธ ํ™•์ธ
  • tabindex=โ€0โ€๋ฅผ ํฌํ•จ
  • imgํƒœ๊ทธ๋Š” alt ์†์„ฑ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ด๋ฆ„ ์ •์˜

๐Ÿ’ ๋ฌธ์ œ

๐Ÿคฟ ์ปดํฌ๋„ŒํŠธ props โ€œasโ€๋ฅผ img๋กœ ์ฃผ๋ฉด, img ํƒœ๊ทธ๋กœ ๋ Œ๋”๋ง ํ•ด์ฃผ๊ธฐ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import styled from "styled-components";
import { goToLink } from "../../utils";

export function Link({ as = ComponentName, href, children }) {
const StyledLink = styled(`${as}`)`
... styles
`;
return (
<>
<StyledLink
tabIndex="0"
role="link"
onClick={(e) => goToLink(e, href)}
onKeyDown={(e) => goToLink(e, href)}
>
{children}
</StyledLink>
</>
);
}

Link.defaultProps = {
as: "span",
};
  • Link ์ปดํฌ๋„ŒํŠธ ์•ˆ์—๋‹ค๊ฐ€ styled-component๋ฅผ ์ƒ์„ฑํ•˜๊ณ  as props๋ฅผ ์ „๋‹ฌํ•ด์ฃผ์—ˆ๋‹ค.

  • ์œ„์™€ ๊ฐ™์ด ํ•  ๊ฒฝ์šฐ, as props์— img ํƒœ๊ทธ๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ ๋ช…๋ช… ๊ทœ์น™์— ์–ด๊ธ‹๋‚œ๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค.

    ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ํ•ด์ฃผ์—ˆ๋‹ค.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import styled from "styled-components";
    import { goToLink } from "../../utils";

    export function Link({ as = ComponentName, href, children }) {
    const StyledLink = styled(`${as}`)`
    ... styles
    `;
    return (
    <>
    {as === "img" ? (
    <img
    tabIndex="0"
    role="link"
    onClick={(e) => goToLink(e, href)}
    onKeyDown={(e) => goToLink(e, href)}
    src="./gitprofile.jpeg"
    alt="W3C Website"
    />
    ) : (
    <StyledLink
    tabIndex="0"
    role="link"
    onClick={(e) => goToLink(e, href)}
    onKeyDown={(e) => goToLink(e, href)}
    >
    {children}
    </StyledLink>
    )}
    </>
    );
    }

    Link.defaultProps = {
    as: "span",
    };

    ๐Ÿฅ img๊ฐ€ ์—…๋กœ๋“œ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

    • img ์—…๋กœ๋“œ ๋ฌธ์ œ ํ•ด๊ฒฐ

    ๋ฌธ์ œ์˜ ์›์ธ์€ npm ๋ช…๋ น์–ด๋กœ webpack server๋งŒ ์‹คํ–‰์‹œ์ผฐ๋Š”๋ฐ, webpack config.js ํŒŒ์ผ์— static ์†์„ฑ๊ฐ’์„ [build]๋กœ ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •์  ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” build ํด๋”์—์„œ assets์„ ์ฐพ๋Š”๋‹ค.

    ๊ทธ๋Ÿฌ๋ฏ€๋กœ npm run build ๋ช…๋ น์–ด๋กœ build ํด๋”๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๊ทธ ์•ˆ์—๋‹ค๊ฐ€ img๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

    1
    2
    3
    4
    5
    6
    <Link
    as="img"
    alt="test์ด๋ฏธ์ง€"
    src="./assets/img/gitprofile.jpeg"
    href="https://www.w3.org/WAI/ARIA/apg/example-index/link/link.html"
    />

    ๐Ÿฅ aria-label ์†์„ฑ ์žˆ์„ ๋•Œ, ์กฐ๊ฑด๋ถ€๋กœ css ์ถ”๊ฐ€ (์‚ญ์ œ)

    ์ด ์†์„ฑ์„ ์‚ญ์ œํ•œ ์ด์œ ๋Š” span ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์„ ๋•Œ, role="link"๋กœ ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— aria-label ์†์„ฑ์„ ๊ตณ์ด ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ์‚ญ์ œํ•˜์˜€๋‹ค.

๐Ÿ“ ํšŒ๊ณ 

  • styled-component๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒ props๋ฅผ ๋ฐ›์•„์„œ App์—์„œ ๋ Œ๋”๋ง ์‹œ์ผœ์•ผํ• ์ง€ ํ—ท๊ฐˆ๋ ธ์—ˆ๋Š”๋ฐ ์ง์ ‘ ํ•ด๋ณด๋‹ˆ ์ดํ•ด๊ฐ€ ์ž˜๋˜์—ˆ๋‹ค.
  • ์ˆ˜์—… ์‹œ๊ฐ„์— ๋ฐฐ์› ๋˜ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ตํžˆ๋‹ˆ ๋”์šฑ ์ดํ•ด๊ฐ€ ์ž˜๋˜์—ˆ๋‹ค. ์—ญ์‹œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ํž˜๋“ค์ง€๋งŒ ๋” ๋„์›€๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.