<img> 태그 이해하기
1. 크기 다루기
이미지 태그는 기본적으로 불러오는 **이미지의 크기(intrinsic size)**를 기본으로 합니다. 그렇기 때문에 이미지 태그만 가지고 사용하기보다는 컨테이너를 만들어 크기를 정해주는게 좋습니다.
이처럼 컨테이너를 만들어 이미지 태그를 넣은 후에 CSS를 통해 사이즈를 관리합니다.
width: 100%만 넣게되면 이미지는 최대 크기를 가지지 못합니다. 우리는 컨테이너 크기에 맞추고 싶기 때문에 max-width: 100% 를 통해 사이즈를 원본 이미지 크기 이상으로 키울 수 있습니다.
2. 이미지 비율
이미지 태그는 일반적으로 폭을 기준으로 사이즈를 다룹니다. 이때 비율이 깨지는 경우가 발생할 수 있는데, height값을 의도적으로 넣어줄 때입니다. height: auto; 를 해주게 되면 폭에 따라 이미지의 높이가 조절되어 원본 비율을 유지할 수 있습니다.
3. 특별한 비율
가장 널리 알려진 UI 컴포넌트를 꼽자면 카드가 있을 겁니다. 유튜브, 페이스북, 인스타그램 등 모든 웹서비스에는 카드를 통해 컨텐츠를 표기하는 방법이 쓰이고 있습니다. 이때 카드는 항상 일정한 비율로 이미지를 보여줍니다. 인스타그램은 1:1, 유튜브는 1.78:1(16대 9) 비율을 사용합니다.
사용자가 업로드 하는 이미지나 내가 업로드한 이미지의 크기와 비율이 동일하지 않을 때 어떻게 비율을 똑같이 만들 수 있을까요?
마찬가지로 컨테이너로 이미지를 감싸줍니다. 그 다음 아래의 CSS를 사용해봅시다.
컨테이너의 기본 높이를 0으로 제한하고, padding-bottom만으로 높이를 조정합니다. 컨테이너 안에 있는 이미지 태그는 항상 컨테이너를 꽉 채우도록 CSS를 넣습니다. 이렇게 되면 컨테이너에서 설정한 padding-bottom에 따라 자신이 원하는 비율의 이미지를 만들 수 있습니다.
CSS를 읽을 줄 아신다면 모든 부분이 이해되겠지만 **56.25%**는 어떤 의미일까요? 이 값은 16:9 비율을 말하는 것인데요, width를 100%라 할 때 높이가 56.25%일 때 16:9비율이 나오게 됩니다. 계산 방법은 9/16을 하면 됩니다. 마찬가지로 4:3 비율, 1:1 비율은 어떻게 할 수 있을까요? 각각 75%, 100%의 padding-bottom 값을 주면 만들 수 있습니다.
4. 이미지 최적화
CSS 뿐 아니라 프론트엔드 코딩까지 하실 수 있다면 상황에 따라 다른 이미지를 불러오는 것도 로딩 속도 개선에 큰 도움을 줍니다. 첫번째 방법은 프론트엔드 코딩을 필요로 합니다. 이미지 에셋을 x2, x3 와 같이 여러 사이즈로 저장해두고 디바이스의 폭에 따라 가장 최적화된 이미지를 불러옵니다. 두번째 방법은 웹에 최적화된 이미지 파일을 가져오는 것입니다. source 태그 등은 webp와 같은 웹 최적화 이미지를 불러올 때 사용합니다. 그래서 최적화가 잘된 사이트의 경우 picture 태그와 source, img 태그가 함께 묶여 상황에 따라 적절한 이미지를 가져오는 것을 확인할 수 있습니다.
5. 텍스트를 병기해야할 때
어떤 경우 이미지 위에 텍스트가 올라가야할 수 있습니다. 이때는 이미지 태그를 쓰는 것보단 div와 같은 태그에 background-image 속성을 넣어 이미지를 다루는게 더 나을 수 있습니다. 만약 이미지 태그를 사용하면서 그 위에 텍스트를 올린다면 해당 텍스트를 구성하는 엘리먼트는 position: absolute 또는 relative 등을 통해 위치를 정해줄텐데, absolute의 경우 좌우 폭이 바뀌는 등의 환경에 다루기 까다롭고, relative는 다른 엘리먼트에 영향을 받아 이상한 위치로 갈 수도 있습니다.
6. 미디어 쿼리
이미지 태그가 미디어 쿼리에 영향을 받게 짜는건 현명하지 않습니다. 이미지 태그는 컨테이너에 반응하도록 CSS를 짜고, 컨테이너가 미디어 쿼리에 반응하는게 좋습니다.
7. lazy load와 CDN
큰 사이즈의 이미지를 캐싱 없이 빠르게 가져오는건 힘듭니다. 그래서 lazy load를 많이 사용합니다. 인라인 형태로는 로 구현할 수 있으나 모든 브라우저에서 호환되진 않습니다. 그래서 자바스크립트 코드를 활용해서 의도적으로 구현하기도 합니다.
큰 사이즈의 이미지를 캐싱 없이 빠르게 가져오는건 힘듭니다. 그래서 lazy load를 많이 사용합니다. 인라인 형태로는 로 구현할 수 있으나 모든 브라우저에서 호환되진 않습니다. 그래서 자바스크립트 코드를 활용해서 의도적으로 구현하기도 합니다.
[Lazy Loading Css to drastically Improve Page Speed
Loading big CSS file at the end of the document makes sense because some times CSS takes up a lot of time to load. Learn how to defer CSS loading which makes your website super-fast. PageSpeed is a tool by Google where you can find the website speed.
https://blog.webjeda.com/lazy-load-css/](https://blog.webjeda.com/lazy-load-css/)
Lazy load를 사용하는것은 언제나 괜찮은 방법이지만, 개인적으로는 CDN을 사용해 이미지를 캐싱해서 사용하길 권하고 싶습니다. AWS 사용하시는 분들은 Cloud Front를 S3와 연결해서 쉽게 사용하실수도 있고, 그 밖에도 CDN을 직접 연결할 방법은 많으니 느리게 로딩하는 것 뿐 아니라 이미지를 준비시켜두는 것도 좋습니다.
More from Howdy의 블로그
See all posts특별한 법칙은 아니지만 자주 생각하려는 법칙이 있다. 향기의 법칙이라고 명명한 이 법칙은 무척이나 간단하다. 어떠한 상황에서든 상대를 유혹하라는 것이다. 원하는 것이 있다면 상대방이 원하도록 유혹하는 것이다. 이는 아주 간단한 원칙인데 동시에 매우 달성하기 어려운 법칙이기도 하다. 향…
향기의 법칙
하루가 멀다하고 사고가 터지는 것이 인간사. 인간이 만든 것 중 무엇이 대단하다 말할 수 있을까. 무엇이 완전하다 말할 수 있을까. 무엇이 영원하다 말할 수 있을까. 영원한 것은 단 하나도 없고 먼지가 쌓이지 않는 것도 단 하나도 없다. 기회 역시 영원하지 않아서 영원할 것 같은 젊음…
영원하지 않다
이카루스는 태양에 가까이 가면 안된다는 것을 알았으나 높게 날았다. 깃을 붙인 밀납이 녹아 깃이 떨어져 나가고 나서야 그는 자신의 미래를 보았다. 자유로 향하는 날개를 얻었을 때 태양을 향해서도 바다를 향해서도 안됐다. 고도를 유지하며, 섬세하게 바람을 타지 않는다면 어디로든 날아갈…
자유의 날개
인간이 보편적으로 누리는 권리는 대부분 거래를 통해 획득했다. 참정권은 군복무, 참전으로 얻었고, 링컨의 노예제 해방을 위해선 산업화된 사회에서의 흑인 인권이 필요했다. 반면 노예를 사용하는 것이 경제적 이득이 되는 남부군의 입장에서는 당시 기준으로 재산권 침해에 해당한다고 보았기에…
Comments