惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
A
About on SuperTechFans
T
Tailwind CSS Blog
I
InfoQ
S
Securelist
云风的 BLOG
云风的 BLOG
罗磊的独立博客
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
腾讯CDC
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
S
Secure Thoughts
博客园 - 司徒正美
J
Java Code Geeks
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
Help Net Security
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tor Project blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
小众软件
小众软件
K
Kaspersky official blog

The Tracks of mulder21c

고정된 참조 위치 정보 선형 이미지의 최소 명도 대비 요구사항은 몇 대~ 몇? 단일 문자 단축키 (Character Key Shortcuts) 입력 방식(Input Modalities) 적응성(Adaptable) KWCAG 2.2 변경 사항 개요 Git hook으로 브랜치 이름 규칙 강제하기 댓글 시스템 remark42로 변경기 새 테마로 갈아입힘 Atomic Design + Storybook 적용 후기 json-server에 사용자 인증 구현하기 개발환경 WSL2 + zsh로 갈아타기 Pass function as props in vue 2020년 회고 colum flexbox에서 padding bottom 문제 해결 Nuxt를 통해 보는 프론트엔드 개발자가 하는 일 Nuxt Router kebab-case 처리 JS to SCSS 변환 Nuxt + Storybook 통합 하기 2020 이직 이야기 2020 이직 이야기 2020 이직 이야기 2020 이직 이야기 Windows에서 PM2 실행 오류 해결 오픈톡 정지에 대한 카카오톡 고객센터 후기 배려에 대한 단상 학습이 잘 되지 않는 이유 웹팩 4 마이그레이션 삽질기 babel 7 업데이트 후 node_modules 패키지가 변환되지 않는다면? 2020년 시간 관리를 위해서 도입 한 툴들 Codility Lesson 5 — PassingCars 2019년 회고 Codility Lesson 4 — MissingInteger Codility Lesson 4 — MaxCounters Codility Lesson 4 — FrogRiverOne Codility Lesson — PermCheck 착각은 자유가 아닌각 세미나 진행 후기 Codility Lesson 3 — tapeEquilibrium Codility Lesson 3 — PermMissingElm Codility Lesson 3 — FrogJump 알고리즘 연습을 다시 시작했다. Codility Lesson 2 — CyclicRotation Codility Lesson 2 — OddOccurrencesInArray Codility Lesson 1 — BinaryGap 아이패드 구매 하고 3주 써 본 기록 세미나 어떻게 준비해야 할까? HTML은 웹이다 접근성 향상을 위한 이름 짓기 접근성 교육에서 자주 나오는 상위 5가지 질문
white space는 4px이다? 정말?
멀더끙 · 2020-01-27 · via The Tracks of mulder21c

묵혀있던 글 감 하나를 꺼냈다.
"요소(element) 간 공백, 즉 white space를 제거하려면 어떻게 해야 하는가?" 에 대한 해결 방법에서 흔히 발견 할 수 있는 네거티브 마진을 주는 방식에서 소개 되는 것이

<nav>
  <a href="#">list 1</a>  
  <a href="#">list 2</a>  
  <a href="#">list 3</a>
</nav>
nav {
  > a {
    display: inline-block;
    margin-right: -4px;
  }
}

과 같은 해결책이다. (이 외에도 여러 가지 방법들이 알려져있지만 그것들은 모두 차치하도록 하자.)

실제로 negative margin을 사용하여 요소 간 공백을 제거하는 방법을 찾아보면 -4px을 제시하는 곳을 꽤 많이 볼 수 있고, 인라인·인라인 블럭 요소 사이의 빈 공백 제거 방법을 소개한 국내 블로그나 카페 등을 둘러 보아도 -4px을 제시하는 곳을 쉽게 발견 할 수 있다.

정말 4px이 맞을까?

그런데 정말 4px이 맞을까? 개인적으로 이건 틀렸다라는 가정을 이미 가지고 있었다.
이것을 적용하기 이전에 margin-left: -4px로는 올바르게 제거되지 않는 상황을 이미 경험했기 때문이다.

일단 결론부터 이야기 하면 4px이 아니라 0.2em ~ 0.5em 사이의 값을 가지고, 적어도 IE에서는 기본 폰트 사용 하에 0.25em가 적절하다.

실험을 해보자

실험에 사용 된 코드

<nav>
  <a href="#"> list 1 </a>
  <a href="#"> list 2 </a>
  <a href="#"> list 3 </a>  
</nav>
nav {
  > a {
    display: inline-block;
    width: 50px; // a 요소의 너비가 소수점으로 발생되는 것을 방지
  }
}
(function(list){
  for(var i = -1, a = list[++i], b; b = list[++i]; ) {
    console.log(
      b.getBoundingClientRect().left 
      - a.getBoundingClientRect().right
    )
    a = b;
  }
})(document.querySelectorAll('li'));

조건 1.

body {
  font-size: 100%;
}

FireFox 결과

1번째 간격:  5.633331298828125
2번째 간격:  5.633331298828125

Chrome 결과

1번째 간격:  5.625
2번째 간격:  5.625

IE 11 결과

1번째 간격:  4
2번째 간격:  4

조건 2.

body {
  font-size: 32px;
}

FireFox 결과

1번째 간격:  11.25
2번째 간격:  11.25

Chrome 결과

1번째 간격:  11.25
2번째 간격:  11.25

IE 11 결과

1번째 간격:  8
2번째 간격:  8

조건 3.

body {
  font-size: 40px;
}

FireFox 결과

1번째 간격:  14.066665649414062
2번째 간격:  14.066665649414062

Chrome 결과

1번째 간격:  14.0625
2번째 간격:  14.0625

IE 11 결과

1번째 간격:  10
2번째 간격:  10

조건 4.

body {
  font-family: serif;
  font-size: 16px;
}

FireFox 결과

1번째 간격:  5
2번째 간격:  5

Chrome 결과

1번째 간격:  5
2번째 간격:  5

IE 11 결과

1번째 간격:  5.329998016357422
2번째 간격:  5.3300018310546875

조건 5.

body {
  font-family: serif;
  font-size: 32px;
}

FireFox 결과

1번째 간격:  10.649993896484375
2번째 간격:  10.650009155273438

Chrome 결과

1번째 간격:  10.65625
2번째 간격:  10.65625

IE 11 결과

1번째 간격:  10.659996032714843
2번째 간격:  10.659996032714843

대체 왜 이런 결과가 나온걸까?

일단 font-family를 설정하지 않으면 IE는 원하던 4px을 뱉어(?)주었다.
그런데 조건 1과 조건 2 , 조건 3의 IE 값을 비교해보면, 각각 4px, 8px, 10px로 바뀌는 것을 볼 수 있다.

font-size: 100%은 사실 font-size: 16px과 동일하다 (root에서 font-size를 변경하지 않는 한).

즉, 16 × ¼, 32 × ¼, 40 × ¼ 만큼으로 계산이 되는 것을 알 수 있다.
그리고 이것을 단위로 표현하자면 0.25em이 된다.

그럼 대체 이 4px, ¼(0.25em)는 어디서 온건가?

구글링을 하던 중에 마이크로소프트의 문자 디자인 표준이라는 문서를 발견했다.

이 문서에 따르면, 일반적으로 쓰이는 U+0020에 해당하는 공백 문자는 최소 1/5 em ~ 최대 1/2 em까지를 너비로 가질 수 있음이 기술되어 있고, 평균 너비로 약 ¼ em이 good value라고 기술 되어 있는 것을 확인 할 수 있었다.

결국 font-size를 설정하지 않은 상태 즉 16px을 기준으로 ¼의 값인 4px인 것이고, 이를 사전 조건없이 그저 4px을 네거티브 마진을 주면 된다고만 받아들인 것으로 추측해 볼 수 있을 것 같다.

하지만, font-family에 다른 값을 주기라도 하면 이 공식마저 깨진다.
그냥 IE 전성시대(?)의 유물 같은 느낌이다.

그럼 나머지 브라우저는 또 왜?

그러면 또 나머지 브라우저들은 또 왜 ¼이 아닌걸까?

앞서 언급한 내용을 다시 보자.

평균 너비로 ¼ em이 good value라고 기술 되어 있는 것

여기서 "약"이라는 것을 봐야 할 듯 하다.
딱 짚어서 ¼이 아니라 대략 ¼

결국 브라우저 제조사의 재량(?)에 따라서 대략 ¼이다. 더구나 폰트 마다 "M"의 너비가 다를 터이니 폰트명이 바뀔 때 마다 간격이 바뀌는 것도 이해가 된다.

-4px 혹은 -0.25em은 버리자…

결국 -4px, -0.25em은 요소 간 공백, 인라인·인라인 블럭 요소 사이의 빈 공백 제거 방법으로는 적합하지 않다는 것을 볼 수 있다.

정확하게 빈 공백을 0으로 만들어야 한다면 이 방법 보다는 다른 방법을 쓰자.
나 역시도 -0.25em을 종종 사용해오기는 했는데 정확도가 떨어져도 괜찮은 정도에 사용 하는 정도로 만족하고, 정확히 0으로 만들어야 한다면 차라리 flex를…

Hero image from wallpaperflare