이동단 맞춤형rem 레이아웃 방안
19409 단어 프런트엔드
1. CSS 픽셀(논리 픽셀)
2. 장치 픽셀(물리적 픽셀)
viewport 시각적 창 설정
meta 태그 설정,
name="viewport"
1. 콘텐츠 뷰포트의 관련 설정width
뷰포트의 너비, 값은 정수 또는 문자열 device-width(장치의 실제 너비 - css 픽셀)입니다.숫자 설정이 권장되지 않음(안드로이드 장치는 일부 지원되지 않음) height
뷰포트의 높이(width에서 1까지) user-scalable
사용자가 페이지 확대/축소를 허용할지 여부initial-scale
페이지의 초기 크기 조정 값은 숫자(소수 포함)입니다.minimum-scale
페이지의 최소 크기 조정 비율은 숫자(소수 포함)입니다.maximum-scale
페이지의 최대 크기 조정 비율은 숫자(소수 포함)입니다.2. 주의사항
1、 user-scalable, , 。
2、 iphone5
3、 , bug
사용자 배율을 허용하지 않습니다. 기본 고정 배율은 1.0입니다.
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
3. 이동단 브라우저 스타일 리셋
html,body를 전체 장치의 화면을 가득 채웁니다.기본 Margin, padding 제거
html,body{
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
안드로이드와 OS의 다른 스타일
body{
font-family: helvetica;
margin: 0;
}
body *{
-webkit-user-select: none;
-webkit-touch-callout: none;
-webkit-text-size-adjust: 100%;
}
a,input,button{
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
button,input{
-webkit-appearance: none;
border-radius: 0;
}
input::-webkit-input-placeholder{
color:#000;
}
input:focus::-webkit-input-placeholder{
color:#f00;
}
이동단의 스타일 재설정
-webkit-user-select: none;
-webkit-touch-callout: none;
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-text-size-adjust: 100%;
-webkit-appearance: none; //button input
border-radius: 0; //input
input::-webkit-input-placeholder{
color:#000; //
}
input:focus::-webkit-input-placeholder{
color:#f00; //
}
4. 상대 단위em와rem
1. em는 부모 레벨에 상대적
font-size의 단위일 때 부모 요소의 글꼴 크기를 대표하고 다른 속성 단위일 때 자신의 글꼴 크기를 대표한다
.parent{
font-size:20px
}
.son{
width:1em;
/* 1em=20px */
}
문제: 1. 크롬 아래에 최소 글꼴 제한이 있고 12px가 필요하기 때문에 이 값은 122보다 작을 수 없습니다. 만약에 두 개의 같은 요소가 있지만 안의 글꼴이 다르면 통일적으로 설정할 수 없습니다.혹은 원소의 글씨체가 변하면 또 통일적으로 한 번 설정해야 한다
2.rem은 루트 요소 html에 상대적
CSS3에 추가된 상대 단위는 루트 요소 html 글꼴 크기에 대한 상대 단위입니다
html{
font-size:20px
}
/* 2rem=40px */
em와rem는 모두 상대 단위이다. 다른 점은em가 부급에 대한 font-size라는 데 있다.rem는 뿌리 노드 html에 상대적인 font-size
5.rem 구조 원리
아이폰6의 경우
브라우저 F12 콘솔을 통해 아이폰6의 css 픽셀
375px
을 볼 수 있습니다<style>
html {
font-size: 100px;
}
html,
body {
margin: 0;
padding: 0;
}
header {
width: 3.75rem;
font-size: 0.2rem;
background: #007ACC;
}
div {
width: 1.875rem;
height: 1.875rem;
font-size: 0.12rem;
background: #07C160;
}
style>
<body>
<header> header>
<div> div>
body>
html의 font-size를 100px(정상적으로 개발할 때 html 루트 노드의 글꼴 크기를 동적으로 설정) 하위 요소의 폭을 모두rem로 설정하면 모든 하위 요소의 css 폭 = 루트 노드의 글꼴 크기 *에 대응하는rem는 위의 예에서
아이폰6플러스의 경우
아이폰6플러스의 css 픽셀은
414px
입니다. 이때 루트 노드 html의 글꼴 크기는 110.4px
이고 하위 요소는 아무런 변화가 없습니다.html {
font-size: 110.4px;
/* 414 / 3.75 = 110.4 */
}
서브원소는 html에 따라 비례적으로 변화한다
rem의 레이아웃 원리는 루트 노드의 글꼴 크기를 동적으로 바꾸어 rem 단위가 설정된 모든 하위 요소의 크기에 영향을 주고 요소의 크기와 화면 크기가 비례적인 동기화 변화를 확보하는 것이다
그러면 어떻게 하위 요소를 몇rem로 설정합니까?현재 시중 은 통상 아이폰6 을 표준 으로 하고, 디자인 원고 사이즈 는 보통 750px 로 계산하기 편리하다
6, 동적 설정 루트 노드 글꼴 크기
아이폰6 기준, 디자인 아트 사이즈 750px
(function(doc, designWidth) {
const html = doc.documentElement;
const refreshRem = () => {
const clientWidth = html.clientWidth;
if (clientWidth >= designWidth) {
// , , ( )
html.style.fontSize = '100px';
} else {
// iPhone6 : 50px = 100 * (375 / 750)
html.style.fontSize = 100 * (clientWidth / designWidth) + 'px';
}
};
//dom
doc.addEventListener('DOMContentLoaded', refreshRem);
})(document, 750);
위의 즉시 실행 함수를 통해 아이폰6에서 루트 노드의 글꼴 크기를 50px로 설정합니다
그러면 화면 폭을 가득 채우려면 하위 요소의 폭을
width:7.5rem;
으로 절반을 차지하고 width:3.75rem;
으로 설정해야 한다.원래의 100px에 비해 750의 디자인 원고를 기준으로 계산할 때 나타나는 소수점을 비교적 적게 하여 계산하기 편리하게 할 수 있다.물론sass나less로
px2rem()
함수를 작성하여 px를rem로 자동으로 변환하여 코드 작성에 편리하게 할 수 있다7. vw를 통해 루트 노드의 글꼴 크기 설정
vw, vh 단위
vw
Viewport's width의 약자, 1vw는 뷰포트 너비의 1% vh
Viewport's height의 약자, 1vh는 뷰포트 높이의 1% vmin
vw와 vh 중 가장 작은 값 vmax
vw와 vh 중 가장 큰 값 ios 8 및 그 이상의 시스템 안드로이드 4.4 및 그 이상의 시스템은 현재 대부분의 모바일 기기에서 vw를 지원한다
vw+rem 어댑터
vw를 통해 루트 노드의 글꼴 크기를 설정합니다. 페이지의 크기는rem를 사용합니다
iphone6 1vw=375/100=3.75px;
iphone6Plus 1vw=414/100=4.14px;
아이폰6 디자인 원고를 예로 들면 html의 font-size는 50px, 1vw=3.75px는 vw가
50 / 3.75 = 13.333333333333334vw
으로 전환된다.<style>
html{
font-size:13.333333333333334vw
/* font-size: calc(50vw/3.75); */
}
/* */
header {
width: 7.5rem;
font-size: 0.4rem;
background: #007ACC;
}
/* */
div {
width: 3.75rem;
height: 3.75rem;
font-size: 0.2rem;
background: #07C160;
}
style>
<body>
<header> header>
<div> div>
body>