마지막으로 문제의 원인을 살펴 보자
확인란은 이미지를 사용하여 렌더링됩니다 (CSS를 통해 사용자 지정 확인란을 설정할 수 있음). 다음은 FireFox의 (확인되지 않은) 확인란이며 DOM 관리자로 강조 표시되어 있습니다.
다음은 Chrome의 스타일이 지정되지 않은 동일한 확인란입니다.
여백 (주황색)을 볼 수 있습니다. 패딩이 없습니다 (녹색으로 표시됨). 이 의사 마진은 확인란의 오른쪽과 아래쪽에 무엇입니까? 이것은 확인란에 사용 된 이미지의 일부입니다 . 그렇기 때문에 사용하는 것만으로 vertical-align: middle
는 충분하지 않으며 브라우저 간 문제의 원인입니다.
그래서 우리는 이것에 대해 무엇을 할 수 있습니까?
한 가지 확실한 옵션은 이미지를 교체하는 것입니다. 운 좋게도 CSS를 통해이 작업을 수행 할 수 있으며 외부 이미지, base64 (CSS 내) 이미지, CSS 내 svg 또는 유사 요소로 대체 할 수 있습니다. 강력한 (브라우저 간) 접근 방식 이며이 질문 에서 도난당한 조정의 예는 다음과 같습니다.
.checkbox-custom {
opacity: 0;
position: absolute;
}
.checkbox-custom,
.checkbox-custom-label {
display: inline-block;
vertical-align: middle;
margin: 5px;
cursor: pointer;
}
.checkbox-custom + .checkbox-custom-label:before {
content: '';
display: inline-block;
background: #fff;
border-radius: 5px;
border: 2px solid #ddd;
vertical-align: middle;
width: 10px;
height: 10px;
padding: 2px;
margin-right: 10px;
text-align: center;
}
.checkbox-custom:checked + .checkbox-custom-label:before {
width: 1px;
height: 5px;
border: solid blue;
border-width: 0 3px 3px 0;
transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
border-radius: 0px;
margin: 0px 15px 5px 5px;
}
<div>
<input id="checkbox-1" class="checkbox-custom" name="checkbox-1" type="checkbox">
<label for="checkbox-1" class="checkbox-custom-label">First Choice</label>
</div>
<div>
<input id="checkbox-2" class="checkbox-custom" name="checkbox-2" type="checkbox">
<label for="checkbox-2" class="checkbox-custom-label">Second Choice</label>
</div>
여기에 나열된 것과 같은 스타일링에 대한 더 자세한 기사를 읽으 십시오 . 이 답변의 범위를 벗어납니다.
좋아, 여전히 커스텀 이미지 또는 의사 요소 솔루션은 어떻습니까?
TL; DR : 작동하지 않는 것 같습니다. 대신 맞춤 확인란을 사용하십시오.
먼저, 다른 브라우저에서 확인란 아이콘 안에있는 의사 마진이 임의적이라면 일관된 솔루션이 없었습니다. 하나를 구축하려면 기존 브라우저에서 이러한 이미지의 구조를 탐색해야합니다.
그렇다면 어떤 브라우저에서 의사 마진이 확인란에 있습니까? Chrome 75, Vivaldi 2.5 (Chromium 기반), FireFox 54 (이러한 오래된 이유는 묻지 않음), IE 11, Edge 42, Safari를 확인했습니다 ?? (1 분 동안 빌려 왔으며, 버전을 확인하는 것을 잊었습니다). Chrome과 Vivaldi에만 의사 마진이 있습니다 (오페라와 같은 모든 Chromium 기반 브라우저도 의심됩니다).
그 의사 마진의 크기는 얼마입니까? 이것을 알아 내기 위해 확대 확인란을 사용할 수 있습니다.
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
내 결과는 너비 / 높이의 ~ 7 %이므로 절대 단위로 0.9-1.0px입니다. 그러나 정확성에 의문이 생길 수 있습니다 zoom
. 확인란에 다른 값을 사용해보십시오 . Chrome과 Vivaldi에서의 테스트에서 의사 마진의 상대 크기는 zoom
값 10, 20과 값 11-19 (??)에서 매우 다릅니다 .
scale
더 일관된 것으로 보입니다.
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
~ 14 %와 2px가 올바른 값일 것입니다.
이제 의사 마진의 크기를 알고 있습니까 (?), 이것만으로는 충분하지 않습니다. 확인란 브라우저의 크기가 모든 브라우저에서 동일합니까? 아아! 스타일이 지정되지 않은 확인란에 대해 DOM 관리자가 표시하는 내용은 다음과 같습니다.
- FireFox : 13.3 픽셀
- 크롬 기반 : 전체적으로 12.8px , 확인란으로 시각적으로 인식되는 것의 경우 12.8 (100 %-14 %) = 11px
- IE 11, Edge : 13 픽셀
- 사파리 : 해당 없음 (동일한 화면에서 비교해야합니다.)
이제 해결책이나 요령을 논의하기 전에 다음과 같이 물어보십시오. 올바른 정렬이 무엇입니까? 우리는 무엇을 달성하려고 노력하고 있습니까? 어느 정도까지는 맛의 문제이지만 기본적으로 다음과 같은 "좋은"정렬의 측면을 생각할 수 있습니다.
동일한 기준에 텍스트와 확인란을 선택합니다 (고의적으로 확인란 크기를 조정하지 않음).
또는 소문자로 같은 중간 줄을 갖습니다.
또는 대문자로 같은 중간 줄 (다른 글꼴 크기의 차이점을 쉽게 볼 수 있음) :
또한 확인란의 크기가 소문자, 대문자 또는 다른 것 (더 크거나 작거나 소문자와 대문자 사이)의 높이와 같아야하는지 여부를 결정해야합니다.
이 토론을 위해 확인란이 텍스트와 동일한 기준선에 있고 대문자 크기를 갖는 경우 (논쟁의 여지가있는 선택) 정렬을 멋지게 호출합시다.
이제 어떤 도구를 사용해야합니까?
- 확인란 크기 조정
- 의사 마진 체크 박스로 Chromium을 인식하고 특정 스타일 설정
- 확인란 / 레이블 수직 정렬 조정
?
에 관한 체크 박스 크기 조정 :가 width
, height
, size
, zoom
, scale
(내가 뭔가를 놓친?). zoom
그리고 scale
(우리는 브라우저 별 규칙을 작성할 수 있습니다하지 않는 한) 그들은 단지 텍스트 크기, 설정되지 크로스 브라우저 크기 조절에 도움이 될 수 있도록, 절대 크기를 설정하는 것을 허용하지 않습니다. size
Chrome에서는 작동하지 않습니다 (이전 IE에서는 작동 했습니까? 어쨌든 흥미롭지 않습니다). width
및 height
작업 크롬과 다른 브라우저에서, 그래서 우리는 크롬에 전체 이미지의 크기가 아니라 체크 박스 자체를 설정하고, 다시 공통의 크기를 설정할 수 있지만. 참고 : 확인란의 크기를 정의하는 최소값 (너비, 높이)입니다 (너비 ≠ 높이 인 경우 확인란 사각형 외부 영역이 "의사 마진"에 추가됨).
불행히도 Chrome의 의사 여백 확인란은 내가 볼 수있는 한 너비와 높이에 대해 0으로 설정되어 있지 않습니다.
요즘 신뢰할 수있는 CSS 전용 방법 이 없다는 것이 두려워요 .
수직 정렬을 고려해 봅시다. Chrome의 의사 마진으로 vertical-align
설정 middle
하거나 baseline
Chrome 의사 마진으로 인해 일관된 결과를 제공 할 수없는 경우 , 모든 브라우저에 대해 동일한 "좌표계"를 얻는 유일한 방법은 레이블과 입력을 다음에 맞추는 것입니다 top
.
(그림에서 : 수직 정렬 : 상자 그림자없이 위쪽, 아래쪽 및 아래쪽)
그래서 우리는 이것으로부터 어떤 결과를 얻습니까?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
위의 스 니펫은 Chrome (Chromium 기반 브라우저)에서 작동하지만 다른 브라우저에서는 더 작은 크기의 확인란이 필요합니다. Chromium의 확인란 이미지 문제를 해결하는 방식으로 크기와 세로 정렬을 모두 조정하는 것은 불가능한 것 같습니다. 마지막 제안은 사용자 정의 확인란을 대신 사용하면 좌절을 피할 수 있습니다. :)