Gatsby: [gatsby-image]๋Š” ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 10์›” 16์ผ  ยท  22์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: gatsbyjs/gatsby

์‚ฌ๋ž‘ํ•˜๋Š” ๊ฐœ์ธ ๋น„์™€ [gatsby-image] ์ปดํฌ๋„ŒํŠธ!

๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€์—๋„ [gatsby-image]๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€( background-size: cover )๋กœ ํŽ˜์ด์ง€ ์„น์…˜์„ ์ž์ฃผ ์ƒ์„ฑํ•˜๋ฉฐ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด [gatsby-image]์˜ ์ž๋™ ํฌ๊ธฐ ์กฐ์ • ๋ฐ ์ตœ์ ํ™” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

([gatsby-image]๋ฅผ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ๋“  background-size: cover ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ข‹์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ–ˆ๊ณ  ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€์— gatsby-image๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํšจ๊ณผ์ ์ธ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. gatsby-image์˜ ๊ธฐ๋Šฅ์ด ์ธ๋ผ์ธ ์ด๋ฏธ์ง€์—๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ์ด๊ฒƒ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค!

๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. CSS ์Šคํƒ€์ผ ์ถ”๊ฐ€

์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— gatsby-image ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค์Œ HTML์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

<div class="gatsby-image-outer-wrapper">
  <div class="gatsby-image-wrapper">
    <div></div>
    <!-- Placeholder (hidden after main image loads) -->
    <img style="...object-fit: cover; object-position: center center;">
    <!-- Main image -->
    <img style="...object-fit: cover; object-position: center center;">
  </div>
</div>

gatsby-image์— ์ง์ ‘ ์„ค์ •๋œ ์Šคํƒ€์ผ์€ <div class="gatsby-image-wrapper> ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ž์ฒด์— ์ ์šฉํ•˜๋ ค๋Š” ์Šคํƒ€์ผ์€ <img> ํƒœ๊ทธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ž์‹ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gatsby-image๊ฐ€ CSS ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค(์—ฌ๊ธฐ์„œ gatsby-plugin-styled-components๋ฅผ ์‚ฌ์šฉ ํ–ˆ์Šต๋‹ˆ๋‹ค).

import React from 'react'
import Image from 'gatsby-image'
import styled from 'styled-components'

const BgImage = styled(Image)`
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  z-index: -1;
  height: 100vh; // or whatever

  // Adjust image positioning (if image covers area with defined height) and add font-family for polyfill
  & > img {
    object-fit: cover !important; // or whatever
    object-position: 0% 0% !important; // or whatever
    font-family: 'object-fit: cover !important; object-position: 0% 0% !important;' // needed for IE9+ polyfill
  }
`

export default BgImage

๋‹ค์Œ์€ props๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋™์ผํ•œ BgImage ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

import React from 'react'
import Image from 'gatsby-image'
import styled from 'styled-components'

const BgImage = styled(Image)`
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  z-index: -1;
  height: ${props => props.height || 'auto'};

  // Adjust image positioning (if image covers area with defined height) and add font-family for polyfill
  & > img {
    object-fit: ${props => props.fit || 'cover'} !important;
    object-position: ${props => props.position || '50% 50%'} !important;
    font-family: 'object-fit: ${props => props.fit || 'cover'} !important; object-position: ${props => props.position || '50% 50%'} !important;'
  }
`

export default BgImage

์—ฌ๊ธฐ์„œ !important ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ธ๋ผ์ธ object-fit/object-position ์Šคํƒ€์ผ์„ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

object-fit ๋ฐ object-position ์†์„ฑ์€ gatsby-image๊ฐ€ ์„ค์ •๋œ ๋†’์ด์˜ ์˜์—ญ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ํ•œ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ object-fit: cover; ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋ฉฐ object-position ๊ฐ’์„ ์กฐ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(gatsby-image๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ center center ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค).

2. ๊ฐœ์ฒด ๋งž์ถค/๊ฐœ์ฒด ์œ„์น˜์— ๋Œ€ํ•œ IE9+ Polyfill ์ถ”๊ฐ€

์œ„์˜ ์Šคํƒ€์ผ์€ IE๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค( caniuse.com: object-fit/object-position ์ฐธ์กฐ ). ๋ถˆํ–‰ํžˆ๋„ IE์—์„œ๋Š” object-fit/object-position ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋†’์ด๊ฐ€ ์„ค์ •๋œ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฑ„์šฐ๋„๋ก ๋Š˜์–ด๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ์™œ๊ณก๋ฉ๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ IE9+์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํด๋ฆฌํ•„์ด ์žˆ์Šต๋‹ˆ๋‹ค . ์žˆ์Šต๋‹ˆ๋‹ค . (์ด ์ ์„ ์ง€์ ํ•ด ์ฃผ์‹  @fk ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.)

ํด๋ฆฌํ•„์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. CSS์— ์ถ”๊ฐ€ font-family ์„ ์–ธ์„ ํฌํ•จํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค(์œ„ ์ฐธ์กฐ).
  2. ํ”„๋กœ์ ํŠธ์— ํด๋ฆฌํ•„ ์„ค์น˜: npm install โ€”save object-fit-images
  3. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— gatsby-browser.js ํŒŒ์ผ ์ƒ์„ฑ
  4. gatsby-browser.js ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
import objectFitImages from 'object-fit-images'

exports.onInitialClientRender = () => {
  objectFitImages()
}

์ฐธ๊ณ : polyfill์˜ ์ง€์นจ ์ด " </body> ๋˜๋Š” _on DOM ready_"์— ํ™œ์„ฑํ™” ํ˜ธ์ถœ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— onInitialClientRender ์—์„œ ํด๋ฆฌํ•„์„ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ, ๋‚ด๊ฐ€ ๋ณธ @KyleAMathews๋Š” polyfills๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค onClientEntry ๊ทธ๊ฒŒ ๋” ์ข‹์„ ๊ฑฐ๋ผ ๋งŒ์•ฝ ๋‚ด๊ฐ€ํ•˜์ง€ ํ™•์‹ , ๊ทธ๋ž˜์„œ ๋Œ€์‹  (๊ท€ํ•˜์˜ ์˜๊ฒฌ, ์นด์ผ?).

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

๋ชจ๋“  22 ๋Œ“๊ธ€

์ž˜ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค!

๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋Š” gatsby-image ๋ฐ๋ชจ ์‚ฌ์ดํŠธ https://using-gatsby-image.gatsbyjs.org/๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋„ˆ๊ฐ€ ์›ํ•˜๋Š”๊ฒŒ ๊ทธ๊ฑฐ์•ผ?

๋น ๋ฅธ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ฐœ์ธ ๋น„ ์ด๋ฏธ์ง€ ๋ฐ๋ชจ ์‚ฌ์ดํŠธ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด...

  1. background-image ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  gatsby-image ๋Š” ํ•ญ์ƒ <img /> ํ•˜๊ณ  ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋Š” position: absolute; ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๊นŒ?
  2. background-size/background-position ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋Œ€์‹  gatsby-image๋Š” ํ•ญ์ƒ object-fit/object-position ํ•ฉ๋‹ˆ๊นŒ?

๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜๋Š” ํ•œ ๋ชจ๋“  ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ gatsby-image๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค... Gatsby์—๋Š” IE 11 ๋ฐ Edge( ์—ฌ๊ธฐ์—์„œ ๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ฌธ์ œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค: caniuse.com )?

๊ทธ๋ ‡๋‹ค๋ฉด CSS ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ์™„์ „ํžˆ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(Gatsby์˜ ์ž๋™ํ™”๋œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด)? gatsby-image๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ object-fit/object-position ์†์„ฑ์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Gatsby์—์„œ background-size:cover ๋กœ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ถŒ์žฅ๋˜๋Š” ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ooloth ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋งค์šฐ

CSS ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋Š” ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์žฅ์น˜์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์ถ•์†ŒํŒ ํฌ๊ธฐ๋ฅผ (์‰ฝ๊ฒŒ) ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ใ…‹. ์ดํ•ดํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•  ๊ฒƒ์ด๋‹ค. ๋‹น์‹ ์˜ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋‹ค์Œ์— ๋Œ€ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. IE 11 ๋ฐ Edge์—์„œ object-fit/object-position ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•(Gatsby์—์„œ ์ด๋ฏธ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?)
  2. object-fit/object-position ๊ฐ’์„ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

1.์— ๊ด€ํ•ด์„œ๋Š” https://github.com/bfred-it/object-fit-images๋ฅผ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

@fk ํด๋ฆฌํ•„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! 10์›” 16์ผ ํ˜„์žฌ Edge๋Š” object-fit/object-position ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ IE11์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋„์›€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ฐ€์ง€ ์กฐ์–ธ ๋ถ€ํƒ๋“œ๋ ค๋„ ๋ ๊นŒ์š”? ํด๋ฆฌํ•„์„ ์„ค์น˜ํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์‹คํžˆ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค...
npm install --save object-fit-images
import objectFitImages from 'object-fit-images'

..ํ•˜์ง€๋งŒ ํ™œ์„ฑํ™” ํ˜ธ์ถœ์„ ์–ด๋””๋กœ ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
objectFitImages()

์ด ์ค„์„ ์–ด๋””์— ๋‘˜์ง€ ์ถ”์ฒœํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” React์™€ Gatsby ๋ชจ๋‘์— ์•ฝ๊ฐ„ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

(Btw, ๋‚˜๋Š” object-fit/object-position ๊ฐ’์„ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ๊ณ  ํด๋ฆฌํ•„๊ณผ CSS ์กฐ์ •์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์ •๋ ฌํ•˜๋Š” ์ฆ‰์‹œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์ข‹์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ–ˆ๊ณ  ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€์— gatsby-image๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํšจ๊ณผ์ ์ธ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. gatsby-image์˜ ๊ธฐ๋Šฅ์ด ์ธ๋ผ์ธ ์ด๋ฏธ์ง€์—๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ์ด๊ฒƒ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค!

๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. CSS ์Šคํƒ€์ผ ์ถ”๊ฐ€

์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— gatsby-image ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค์Œ HTML์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

<div class="gatsby-image-outer-wrapper">
  <div class="gatsby-image-wrapper">
    <div></div>
    <!-- Placeholder (hidden after main image loads) -->
    <img style="...object-fit: cover; object-position: center center;">
    <!-- Main image -->
    <img style="...object-fit: cover; object-position: center center;">
  </div>
</div>

gatsby-image์— ์ง์ ‘ ์„ค์ •๋œ ์Šคํƒ€์ผ์€ <div class="gatsby-image-wrapper> ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ž์ฒด์— ์ ์šฉํ•˜๋ ค๋Š” ์Šคํƒ€์ผ์€ <img> ํƒœ๊ทธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ž์‹ ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gatsby-image๊ฐ€ CSS ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์Šคํƒ€์ผ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค(์—ฌ๊ธฐ์„œ gatsby-plugin-styled-components๋ฅผ ์‚ฌ์šฉ ํ–ˆ์Šต๋‹ˆ๋‹ค).

import React from 'react'
import Image from 'gatsby-image'
import styled from 'styled-components'

const BgImage = styled(Image)`
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  z-index: -1;
  height: 100vh; // or whatever

  // Adjust image positioning (if image covers area with defined height) and add font-family for polyfill
  & > img {
    object-fit: cover !important; // or whatever
    object-position: 0% 0% !important; // or whatever
    font-family: 'object-fit: cover !important; object-position: 0% 0% !important;' // needed for IE9+ polyfill
  }
`

export default BgImage

๋‹ค์Œ์€ props๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋™์ผํ•œ BgImage ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

import React from 'react'
import Image from 'gatsby-image'
import styled from 'styled-components'

const BgImage = styled(Image)`
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  z-index: -1;
  height: ${props => props.height || 'auto'};

  // Adjust image positioning (if image covers area with defined height) and add font-family for polyfill
  & > img {
    object-fit: ${props => props.fit || 'cover'} !important;
    object-position: ${props => props.position || '50% 50%'} !important;
    font-family: 'object-fit: ${props => props.fit || 'cover'} !important; object-position: ${props => props.position || '50% 50%'} !important;'
  }
`

export default BgImage

์—ฌ๊ธฐ์„œ !important ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ธ๋ผ์ธ object-fit/object-position ์Šคํƒ€์ผ์„ ์žฌ์ •์˜ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

object-fit ๋ฐ object-position ์†์„ฑ์€ gatsby-image๊ฐ€ ์„ค์ •๋œ ๋†’์ด์˜ ์˜์—ญ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ํ•œ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ object-fit: cover; ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜๋ฉฐ object-position ๊ฐ’์„ ์กฐ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(gatsby-image๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ center center ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค).

2. ๊ฐœ์ฒด ๋งž์ถค/๊ฐœ์ฒด ์œ„์น˜์— ๋Œ€ํ•œ IE9+ Polyfill ์ถ”๊ฐ€

์œ„์˜ ์Šคํƒ€์ผ์€ IE๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค( caniuse.com: object-fit/object-position ์ฐธ์กฐ ). ๋ถˆํ–‰ํžˆ๋„ IE์—์„œ๋Š” object-fit/object-position ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋†’์ด๊ฐ€ ์„ค์ •๋œ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฑ„์šฐ๋„๋ก ๋Š˜์–ด๋‚˜ ์ด๋ฏธ์ง€๊ฐ€ ์™œ๊ณก๋ฉ๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ IE9+์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํด๋ฆฌํ•„์ด ์žˆ์Šต๋‹ˆ๋‹ค . ์žˆ์Šต๋‹ˆ๋‹ค . (์ด ์ ์„ ์ง€์ ํ•ด ์ฃผ์‹  @fk ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.)

ํด๋ฆฌํ•„์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. CSS์— ์ถ”๊ฐ€ font-family ์„ ์–ธ์„ ํฌํ•จํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค(์œ„ ์ฐธ์กฐ).
  2. ํ”„๋กœ์ ํŠธ์— ํด๋ฆฌํ•„ ์„ค์น˜: npm install โ€”save object-fit-images
  3. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— gatsby-browser.js ํŒŒ์ผ ์ƒ์„ฑ
  4. gatsby-browser.js ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
import objectFitImages from 'object-fit-images'

exports.onInitialClientRender = () => {
  objectFitImages()
}

์ฐธ๊ณ : polyfill์˜ ์ง€์นจ ์ด " </body> ๋˜๋Š” _on DOM ready_"์— ํ™œ์„ฑํ™” ํ˜ธ์ถœ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— onInitialClientRender ์—์„œ ํด๋ฆฌํ•„์„ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ, ๋‚ด๊ฐ€ ๋ณธ @KyleAMathews๋Š” polyfills๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค onClientEntry ๊ทธ๊ฒŒ ๋” ์ข‹์„ ๊ฑฐ๋ผ ๋งŒ์•ฝ ๋‚ด๊ฐ€ํ•˜์ง€ ํ™•์‹ , ๊ทธ๋ž˜์„œ ๋Œ€์‹  (๊ท€ํ•˜์˜ ์˜๊ฒฌ, ์นด์ผ?).

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

์•„ ์  ์žฅ, @ooloth ๋” ์ผ์ฐ ๋Œ์•„์˜ค์ง€ ๋ชปํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ๋‹คํ–‰์ด๊ตฐ์š”!
๋Œ์•„์™€์„œ ๊ฒฐ๊ณผ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘ โค๏ธ

์ฒœ๋งŒ์—์š”!

@stolinski ๋Š” ๊ทธ์˜ ํŠœํ† ๋ฆฌ์–ผ ์ค‘ ํ•˜๋‚˜์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ์—
https://www.youtube.com/watch?v=zhM6C0P7VO0

<Img
  sizes={dataSizes}
  style={{
    position: "absolute",
    left: 0,
    top: 0,
    width: "100%",
    height: "100%"
  }}
/>

ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค! @grod220๋‹˜ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@grod220 ์‰ฌ์› ์–ด์š” ... ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜„

@enten ๊ทธ๊ฒƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ srcset ๋ฐ sizes ๋ฅผ ํ†ตํ•ด ๊ฐ ๋ทฐํฌํŠธ ํฌ๊ธฐ์—์„œ ์ ์ ˆํ•œ ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€ ๋ฒ„์ „์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด gatsby-image ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ์„ ๋†“์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. sizes ์†์„ฑ.

์ €์—๊ฒŒ gatsby-image ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ด๋ฏธ์ง€์˜ ์ตœ์ ์˜ ์‚ฌ๋ณธ์„ ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ Gatsby์˜ ์ตœ๊ณ ์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. CSS ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์ด์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@ooloth ์ทจ์žฌํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๊ฐœ์ธ ๋น„ ์ดˆ๋ณด์ž์ž…๋‹ˆ๋‹ค. ์Šคํƒ€์ผ๋ง ์ง€์นจ์—์„œ ์‹ค์ œ ์ด๋ฏธ์ง€๊ฐ€ ์–ธ๊ธ‰๋œ ์œ„์น˜๋Š” ์–ด๋””์ธ๊ฐ€์š”?

@fucata55 ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค!

์‹ค์ œ ์ด๋ฏธ์ง€๋Š” ๋จผ์ € graphql์„ ํ†ตํ•ด ์ฟผ๋ฆฌํ•œ ๋‹ค์Œ gatsby-image ๊ตฌ์„ฑ ์š”์†Œ์˜ fluid ๋˜๋Š” fixed ์†Œํ’ˆ(๋˜๋Š” v1์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ sizes ๋˜๋Š” resolutions ์†Œํ’ˆ).

๊ทธ๋Ÿฌ๋ฉด gatsby-image ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•œ ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ณต์žกํ•œ sizes ์†์„ฑ์„ ๊ฒฐ๊ณผ HTML์˜ <img /> ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

gatsby-image ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์—ฐ์Šต์„ ๋ณด๋ ค๋ฉด ์—ฌ๊ธฐ v2์˜ ๊ฒฝ์šฐ gatsby-image ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐ ํ•˜๊ฑฐ๋‚˜ v1์˜ ๊ฒฝ์šฐ ์—ฌ๊ธฐ (ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

@ooloth ๊ท€ํ•˜์˜ ์ž‘์—…์€ ๋งค์šฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

"background-attachment: fixed;"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ •ํ™•ํžˆ ์–ด๋””์—. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌํŒŒ๋ฆฌ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘๋™์‹œํ‚ค๋ฉด ํŽ˜์ด์ง€์— ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋” ์ถ”๊ฐ€ํ•  ๋•Œ๊นŒ์ง€ ์ด๋ฏธ์ง€๊ฐ€ ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ• ์ˆ˜๋ก ๊ทธ๋ฆผ์ด ์ปค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌํŒŒ๋ฆฌ ๋ฌธ์ œ์— ๋Œ€ํ•ด ํด๋ฆฌํ•„์„ ํ–ˆ์ง€๋งŒ "background-attachment: fixed;"๋Š” ๋” ์ด์ƒ ์˜ต์…˜์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@zachgaskin ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ์•„๋งˆ๋„ CSS ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์œผ๋ฉฐ(์ฆ‰, Gatsby ๋˜๋Š” gatsby-image ์™€ ๊ด€๋ จ์ด ์—†์Œ) background-attachment: fixed ์‚ฌ์šฉํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ง€ ์•Š๊ณ  ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์žฌํ˜„ํ•œ ๋งํฌ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

caniuse.com ์— ๋”ฐ๋ฅด๋ฉด iOS Safari๋Š” background-attachment: fixed ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ macOS Safari๋Š” ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(...).

ํŠน์ • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋™์ผํ•œ CSS๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰ํ•˜๋Š” ์ด์œ ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค!

@zachgaskin @ooloth ๋‚˜๋„ ์ด๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ œ๊ฐ€ ์ƒ๊ฐํ•ด๋‚ธ ํ•ด๊ฒฐ์ฑ…์€ ์ด๋ฏธ์ง€์— position: 'fixed' ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ „์ฒด ํŽ˜์ด์ง€์˜ ๋ฐฐ๊ฒฝ์— ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ณณ์—์„œ ์ง€์ •๋œ ๋ฐฐ๊ฒฝ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. z-index: -1 ๋Š” ๋‹ค๋ฅธ ๋ฐฐ๊ฒฝ ๋’ค์— ์ˆจ๊ฒจ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

<Img
  sizes={dataSizes}
  style={{
    position: "fixed",
    left: 0,
    top: 0,
    width: "100%",
    height: "100%",
    z-index: -1
  }}
/>

๊ฐœ์ธ ๋น„ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ๋Š” ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

IE polyfill์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ gatsby-image๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์Šคํƒ€์ผ์— !important๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  objectFit ๋ฐ objectPosition์„ ์†Œํ’ˆ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import Img from 'gatsby-image/withIEPolyfill'

<Img
      fixed={heroImage.childImageSharp.fixed}
      style={{ width: '100%', height: '100%' }}
      objectFit="cover"
      objectPosition="bottom left"
   />

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, @AronBe

๋‚˜๋Š” ํ˜„์žฌ Gatsby์™€ ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ์ •๋ณด๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Gatsby Background Image(์œ„์—์„œ ์–ธ๊ธ‰ํ•จ)๋Š” ๋‚ด ๋งˆ์ง€๋ง‰ ํ”„๋กœ์ ํŠธ์—์„œ ์‹ค์ œ๋กœ ๋‚˜๋ฅผ ์œ„ํ•ด ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

benstr picture benstr  ยท  3์ฝ”๋ฉ˜ํŠธ

hobochild picture hobochild  ยท  3์ฝ”๋ฉ˜ํŠธ

ferMartz picture ferMartz  ยท  3์ฝ”๋ฉ˜ํŠธ

dustinhorton picture dustinhorton  ยท  3์ฝ”๋ฉ˜ํŠธ

3CordGuy picture 3CordGuy  ยท  3์ฝ”๋ฉ˜ํŠธ