[css] 고정 위치이지만 컨테이너와 관련

나는 div항상 다음을 사용하여 화면 상단에 붙어 있도록 수정하려고합니다 .

position: fixed;
top: 0px;
right: 0px;

그러나 div중앙 컨테이너 안에 있습니다. 내가 그것을 사용할 때 브라우저의 오른쪽에있는 것과 같이 브라우저 창에 상대적인 position:fixed것을 수정 div합니다. 대신, 컨테이너를 기준으로 고정해야합니다.

position:absolute기준으로 요소를 수정하는 데 사용할 수 div있지만 페이지를 아래로 스크롤하면 요소가 사라지고에서와 같이 맨 위에 고정되지 않습니다 position:fixed.

이것을 달성하기위한 해킹이나 해결 방법이 있습니까?



답변

짧은 대답 : 아닙니다. (이제 CSS 변환으로 가능합니다. 아래 편집 참조)

긴 대답 : “고정 된”위치 지정 사용시 문제는 요소 가 흐름에서 빠져 나간다는 것입니다 . 따라서 부모가없는 것처럼 재배치 할 수 없습니다. 그러나 컨테이너의 너비가 고정 된 알려진 경우 다음과 같은 것을 사용할 수 있습니다.

#fixedContainer {
  position: fixed;
  width: 600px;
  height: 200px;
  left: 50%;
  top: 0%;
  margin-left: -300px; /*half the width*/
}

http://jsfiddle.net/HFjU6/1/

편집 (03/2015) :

오래된 정보입니다. CSS3 변환의 마법을 사용하여 동적 크기 (가로 및 세로)의 내용을 가운데에 배치 할 수 있습니다. 동일한 원칙이 적용되지만 마진을 사용하여 컨테이너를 오프셋하는 대신을 사용할 수 있습니다 translateX(-50%). 너비가 고정되어 있지 않은 한 오프셋을 얼마나 많이 알지 못하고 상대적 요소 (예 50%:)를 부모 요소와 관련이 있기 때문에 상대 값을 사용할 수 없기 때문에 위의 마진 트릭으로는 작동하지 않습니다. 에 적용됩니다. transform다르게 행동합니다. 그 값은 적용되는 요소와 관련이 있습니다. 따라서 는 요소의 너비의 절반 50%transform의미 50%하고 여백은 부모 너비의 절반을 의미합니다. 이것은 IE9 + 솔루션입니다

위 예제와 유사한 코드를 사용하여 완전히 동적 너비와 높이를 사용하여 동일한 시나리오를 다시 만들었습니다.

.fixedContainer {
    background-color:#ddd;
    position: fixed;
    padding: 2em;
    left: 50%;
    top: 0%;
    transform: translateX(-50%);
}

중앙에 배치하려면 다음을 수행하십시오.

.fixedContainer {
    background-color:#ddd;
    position: fixed;
    padding: 2em;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}

시민:

jsFiddle : 가로로만
중앙
정렬 jsFiddle : 가로와 세로로 중앙 맞춤 이 답변 에서 나에게 지적 해
사용자 신용은 사용자 aaronk6 에게 전달됩니다.


답변

실제로 이것은 가능하며 허용되는 답변은 중앙 집중화만을 다루며, 이는 간단합니다. 또한 JavaScript를 사용할 필요가 없습니다.

이를 통해 모든 시나리오를 처리 할 수 ​​있습니다.

position : relative container in position : relative container를 배치하려는 경우 모든 것을 원하는대로 설정 한 다음을 사용하여 div 안에 새 고정 위치 div를 만들되 상단 및 왼쪽 속성을 설정 position: absolute하지 마십시오 . 그런 다음 컨테이너와 관련하여 원하는 곳에서 고정됩니다.

예를 들면 다음과 같습니다.

/* Main site body */
.wrapper {
    width: 940px;
    margin: 0 auto;
    position: relative; /* Ensure absolute positioned child elements are relative to this*/
}

/* Absolute positioned wrapper for the element you want to fix position */
.fixed-wrapper {
    width: 220px;
    position: absolute;
    top: 0;
    left: -240px; /* Move this out to the left of the site body, leaving a 20px gutter */
}

/* The element you want to fix the position of */
.fixed {
    width: 220px;
    position: fixed;
    /* Do not set top / left! */
}
<div class="wrapper">
    <div class="fixed-wrapper">
        <div class="fixed">
            Content in here will be fixed position, but 240px to the left of the site body.
        </div>
    </div>
</div>

슬프게도,이 스레드가 Android의 WebKit 렌더링 상자 그림자 블러 픽셀에서 고정 위치 요소의 여백으로 문제를 해결할 수 있기를 바랐 지만 버그 인 것 같습니다.
어쨌든, 이것이 도움이되기를 바랍니다!


답변

예, 사양에 따르면 방법이 있습니다.

Graeme Blackwood가 문제를 실질적으로 해결하기 때문에 받아 들일만한 대답이어야한다는 데 동의하지만 고정 요소 컨테이너에 상대적으로 배치 할 수 있습니다.

우연히 신청할 때

-webkit-transform: translateZ(0);

몸에 (뷰포트 대신) 고정 된 자식을 만들었습니다. 그래서 내 고정 요소lefttop 속성은 컨테이너와 관련이 있습니다.

그래서 몇 가지 조사를 한 결과 문제가 이미 Eric Meyer 에서 다루고 있음을 발견했습니다. 있고 그것이 “속임수”인 것처럼 느껴지더라도 이것이 사양의 일부라는 것이 밝혀졌습니다.

CSS 상자 모델에 의해 레이아웃이 제어되는 요소의 경우 변환에 대한 값 이외의 값은 스택 컨텍스트와 포함 블록을 모두 생성합니다. 객체는 고정 위치 자손의 포함 블록 역할을합니다.

http://www.w3.org/TR/css3-transforms/

따라서 부모 요소에 변환을 적용하면 포함 요소가됩니다.

그러나…

문제는 요소가 고정 된 것처럼 작동하지 않기 때문에 구현이 버그가 많거나 독창적이라는 것입니다 (이 비트가 사양의 일부가 아닌 것처럼 보이더라도).

Safari, Chrome 및 Firefox에서도 동일한 동작이 발견되지만 IE11에서는 고정 요소가 여전히 고정되어 있습니다.

또 다른 흥미로운 (언급되지 않은) 것은 고정 요소가 변환 된 요소 안에 포함되어 있으면 속성과 관련하여 컨테이너의 속성 topleft속성이 컨테이너와 관련이 box-sizing있으며 스크롤 컨텍스트가 상자처럼 요소의 테두리 위로 확장된다는 것입니다 크기가로 설정되었습니다 border-box. 어떤 창조적 인 경우, 이것은 아마도 장난감이 될 수 있습니다 🙂

테스트


답변

대답은 당신이 설정되어 있지 않는 한, ‘예’ left: 0또는right: 0 div 위치를 고정으로 설정 한 후에는 가능합니다.

http://jsfiddle.net/T2PL5/85/

사이드 바 사업부를 확인하십시오. 고정되어 있지만 창 뷰 포인트가 아닌 부모와 관련되어 있습니다.

body { background: #ccc; }

.wrapper {
    margin: 0 auto;
    height: 1400px;
    width: 650px;
    background: green;
}

.sidebar {
    background-color: #ddd;
    float: left;
    width: 300px;
    height: 100px;
    position: fixed;
}

.main {
    float: right;
    background-color: yellow;
    width: 300px;
    height: 1400px;
}

<div class="wrapper">wrapper
    <div class="sidebar">sidebar</div>
    <div class="main">main</div>
</div>


답변

position: sticky이는 개념적으로 유사한 요소를 배치하는 새로운 방법 position: fixed입니다. 차이점은 주어진 오프셋 임계 값이 뷰포트에서 충족 될 때까지 요소가 부모 내 position: sticky에서처럼 작동 한다는 것 position: relative입니다.

Chrome 56 (현재 2016 년 12 월 현재 베타, 2017 년 1 월 안정)에서 position : sticky가 돌아 왔습니다.

https://developers.google.com/web/updates/2016/12/position-sticky

자세한 내용은 착륙 스틱에 있습니다! position : WebKit의 끈적 끈적한 땅 .


답변

2019 솔루션 : position: sticky속성 을 사용할 수 있습니다 .

다음은 사용법을 보여주는 CODEPEN 예제와 사용법과 다른 점입니다 position: fixed.

작동 방식은 다음과 같습니다.

  1. 고정 위치를 가진 요소는 사용자의 스크롤 위치를 기준으로 배치됩니다. 기본적으로 position: relative요소가 특정 오프셋 이상으로 스크롤 될 때까지 작동하며 ,이 경우 위치가 고정됩니다. 다시 스크롤하면 이전 (상대) 위치로 돌아갑니다.

  2. 페이지의 다른 요소의 흐름에 영향을 미칩니다. 즉 페이지에서 특정 공간을 차지합니다 (예 🙂 position: relative.

  3. 컨테이너 내부에 정의되어 있으면 해당 컨테이너와 관련하여 배치됩니다. 컨테이너에 오버플로 (스크롤)가 있으면 스크롤 오프셋에 따라 위치가 고정됩니다.

따라서 컨테이너 내부에서 고정 기능을 달성하려면 스티커를 사용하십시오.


답변

고정 위치 div에서 상단 및 왼쪽 스타일을 가져 가십시오. 여기에 예가 있습니다

<div id='body' style='height:200%; position: absolute; width: 100%; '>
    <div id='parent' style='display: block; margin: 0px auto; width: 200px;'>
        <div id='content' style='position: fixed;'>content</div>
    </div>
</div> 

#content div는 상위 div가있는 곳에 앉아 있지만 고정되어 있습니다.