요소 높이와 너비를 기준으로 X 및 Y 백분율 값을 번역 하시겠습니까?


80

요소 Y 축을 50 % 변환하면 예상대로 상위 높이의 50 %가 아니라 자체 높이의 50 % 아래로 이동합니다. 번역 요소가 상위 요소를 기준으로 번역 비율을 결정하도록하려면 어떻게해야합니까? 아니면 내가 뭔가를 이해하지 못하고 있습니까?

http://jsfiddle.net/4wqEm/2/


6
알겠습니다. 주변에 방법이없는 것 같습니다. 백분율로 CSS 번역은 이동할 거리를 계산하기 위해 번역되는 요소의 %를 사용합니다. 상위 컨테이너를 기반으로하는 top, margin-top 또는 padding-top과 같은 일반적인 CSS 선언처럼 작동하지 않습니다.
Andrew Tibbetts 2012-06-22

1
감사합니다. 백분율 값이 백분율인지 즉시 알 수 없었습니다.
Philip Walton

3
다음으로 알다시피, 백분율은 글꼴 크기의 백분율을 의미합니다! (오 ...)
Kevin Peno 2013 년

답변:


41

번역에서 백분율을 사용할 때 그것은 자신의 너비 또는 높이를 나타냅니다. https://davidwalsh.name/css-vertical-center ( 데모 )를 살펴보십시오 .

CSS 변환에 대한 한 가지 흥미로운 점은 백분율 값으로 적용 할 때 해당 값이 상단, 오른쪽, 하단, 왼쪽, 여백 및 패딩과 같은 속성과는 반대로 구현되는 요소의 크기에 기반한다는 것입니다. , 부모의 치수 만 사용합니다 (또는 가장 가까운 상대적인 부모를 사용하는 절대 위치의 경우).


2
하지만 SVG 애니메이션 transform: translate(50%)에서 부모 요소의 너비와 높이를 사용하는 것 같습니다
Atav32

27

vw 및 vh를 사용하여 뷰포트 크기에 따라 변환 할 수 있습니다.

@keyframes bubbleup {
  0% {
    transform: translateY(100vh);
  }

  100% {
    transform: translateY(0vh);
  }
}

이건 안 돼요 ... vh ~ 40은 페이지의 맨 아래 같나요?!
AturSams

그것은 ... :) 내 나쁜 ... 요소가 절대 요소에 있지이었다
AturSams

11
@AxeEffect 이것은 허용되는 대답 이 아니 어야합니다 . 이것은 부모 요소가 아니라 뷰포트에 상대적입니다. 부모 요소가 뷰포트의 전체 크기가 아닌 경우 어떻게됩니까?
trusktr

@wolfdawn 스케일링을 사용하는 경우 순서가 중요합니다. 따라서 "scale (1.5) translateY (40vw)"는 "translateY (40vw) scale (1.5)"와 동일하지 않습니다.
Kardaw jul.

1
Apple과 Google이 모바일 브라우저에서 vh 단위를 깨뜨 렸으므로이 경우 신뢰할 수 없다는 것을 알아야합니다.
Kev

17

CSS 만 사용하여 저에게 적합한 것은 다음과 같습니다.

.child {
    position: relative;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);

    /* Backward compatibility */
    -webkit-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
    -o-transform: translate(-50%, -50%);
    -ms-transform: translate(-50%, -50%);
}

작동 원리 :

  • 상단 및 왼쪽 위치는 상위 좌표에 따라 하위 위젯을 이동합니다. 자식 위젯의 왼쪽 상단 모서리는 부모의 중앙에 정확히 나타납니다 (현재 우리가 원하는 것은 아닙니다).
  • translation은 자식 위젯을 크기 (부모가 아님)에 따라 위쪽과 왼쪽으로 -50 % 이동합니다. 즉, 위젯의 중심점이 이전에 부모의 중심으로 설정되었던 왼쪽 상단 지점이 있던 위치로 정확히 이동되며 이것이 우리가 원하는 것입니다.

6

번역 속성에서 백분율을 사용하려면 Javascript를 사용해야합니다. http://jsfiddle.net/4wqEm/27/

HTML 코드 :

<div id="parent">
    <div id="children"></div>
</div>​​​​​​​​​​​​​

CSS 코드 :

#parent {
    width: 200px;
    height: 200px;
    background: #ff0;
}
#children {
    width: 10%;
    height: 10%;
    background: #f00;
}

자바 스크립트 코드 :

parent = document.getElementById('parent');
children = document.getElementById('children');

parent_height = parent.clientHeight;
​children_translate = parent_height * 50/100;
children.style.webkitTransform = "translateY("+children_translate+"px)";​​​​​​​​​​​​​​​​​​​​​​​​​​

다른 문제가 있으면 제가 당신을 도울 수 있기를 바랍니다.


1
CSS3로만 할 수 없습니까?
Dchris

3
이것은 지연됩니다 (당신의 대답이 아니라 사양 작성자가 CSS에서 이것을 수행하는 방법을 만들지 않았고 우리가 JS를 사용해야한다는 사실).
trusktr

3

귀하의 진술은 바로 번역 된 요소에서 나오는 백분율에 대해 절대적으로 옳습니다. 귀하의 경우에 translate 속성을 사용하는 대신 절대 위치를 사용하여 상위 div에 상대적으로 유지해야합니다. 여기에 빨간색 div를 수직으로 배치했습니다. (부모 div에 상대적인 위치를 추가하는 것을 잊지 마십시오. 정적 기본값이 아닌 다른 위치에 있어야 함) :

여기 js 바이올린 펜

 body {
    margin: 0;
    width: 100%;
    height: 100%;
    }
 body > div {
    width: 200px;
    height: 200px;
    background: #ff0;
    position: relative;
    }
 body > div > div {
    width: 10%;
    height: 10%;
    -webkit-transform: translateY(-50%);
    background: #f00;
    position: absolute;
    top: 50%;
    }

1
하지만 상하 좌우 애니메이션은 하드웨어 가속이 아니죠?
trusktr

1

하나의 추가 블록을 사용하고 하위 노드를 제외하고 전환을 사용할 수도 있습니다.

HTML 코드 :

<div id="parent">
    <div id="childrenWrapper">    
        <div id="children"></div>
    </div>
</div>​​​​​​​​​​​​​

CSS는 다음과 같아야합니다.

#parent {
    position: relative;
    width: 200px;
    height: 200px;
    background: #ff0;
}
#childrenWrapper{
    width: 100%;
    height: 100%;
}
#children {
    width: 10%;
    height: 10%;
    background: #f00;
}

1

요소를 절대 위치로 만들고 left 및 top 속성을 사용하여 백분율 값을 부모로 사용할 수 있습니다.


1

다음 URL 작업 샘플 에 필요한 위치 지정으로 분기됩니다.

body {
margin: 0;
width: 100%;
height: 100%;
}

body>div {
position: relative;
width: 200px;
height: 200px;
background: #ff0;
}

body>div>div {
position: absolute;
left: 50%;
top: 50%;
width: 10%;
height: 10%;
background: #f00;
transform: translate(-50%, -50%);
}

메모 :

  1. 부모 요소를 상대 위치로 변경하여 빨간색 사각형의 절대 위치를 지정할 수 있습니다.
  2. 그런 다음 50 % 상단 및 50 % 왼쪽을 사용하면 왼쪽 상단 모서리에 따라 빨간색 사각형이 배치됩니다.
  3. transform : translate (-50 %,-50 %)를 사용하면 중앙에 따라 빨간색 사각형이 배치됩니다.

0

이 문제에 대한 해결책은 번역을 전혀 사용하지 않는 것입니다. 요소를 변환 할 때 선택한 백분율은 해당 높이를 기반으로합니다.

부모의 높이를 기준으로 요소를 배치하려면 top : 50 %;

따라서 코드는 다음과 같습니다.

body {
    margin: 0;
    width: 100%;
    height: 100%;
}
body > div {
    width: 200px;
    height: 200px;
    background: #ff0;
    position: relative;
}
body > div > div {
    position: absolute;
    top: 50%;
    width: 10%;
    height: 10%;
/*     -webkit-transform: translateY(50%); */
    background: #f00;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.