-webkit-transform을 사용하면 위치가 고정되지 않습니다.
div를 회전시키기 위해 -webkit-transform (및 -moz-transform / -o-transform)을 사용하고 있습니다.또한 사용자와 함께 div를 아래로 스크롤할 수 있도록 위치를 고정하였습니다.
파이어폭스에서는 잘 작동하지만 웹킷 기반 브라우저에서는 고장이 납니다.-webkit-transform을 사용하면 고정된 위치가 더 이상 작동하지 않습니다!어떻게 그것이 가능한가요?
CSS Transforms 사양은 이 동작을 설명합니다.변환이 있는 요소는 고정된 위치 하위 요소를 포함하는 블록으로 작동하므로 위치: 변환이 있는 항목 아래에 고정된 요소는 더 이상 고정된 동작을 갖지 않습니다.
이들은 동일한 요소에 적용되면 작동합니다. 요소는 고정된 상태로 배치된 다음 변형됩니다.
몇 가지 연구 끝에 크롬 웹사이트에서 이 문제에 대한 버그 보고가 있어 지금까지 웹킷 브라우저는 이 두 가지 효과를 동시에 렌더링할 수 없습니다.
저는 당신의 스타일시트에 CSS만 웹킷을 추가하고 변형된 디바 이미지를 만들어서 배경으로 사용하는 것을 제안합니다.
@media screen and (-webkit-min-device-pixel-ratio:0) {
/* Webkit-specific CSS here (Chrome and Safari) */
#transformed_div {
/* styles here, background image etc */
}
}
따라서 지금은 웹킷 브라우저가 FF를 따라잡을 때까지 기존 방식으로 해야 합니다.
편집: 2012년 10월 24일 현재 버그가 해결되지 않았습니다.
이것은 버그가 아니라 별도의 좌표계와 적층 순서가 필요한 두 가지 효과 때문에 본 명세서의 한 측면으로 보입니다.이 답변에서 설명한 바와 같이.
position:sticky
대신:
.fixed {
position: sticky;
}
배경 첨부 파일과 같은 문제로 인해 크롬에서 배경 이미지가 사라지는 것을 발견한 사람은 누구나 가능합니다. 수정됨; - 이것이 제 해결책이었습니다.
// run js if Chrome is being used
if(navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
// set background-attachment back to the default of 'scroll'
$('.imagebg').css('background-attachment', 'scroll');
// move the background-position according to the div's y position
$(window).scroll(function(){
scrollTop = $(window).scrollTop();
photoTop = $('.imagebg').offset().top;
distance = (photoTop - scrollTop);
$('.imagebg').css('background-position', 'center ' + (distance*-1) + 'px');
});
}
2016년 8월, 고정 위치 및 애니메이션/변신은 여전히 문제입니다.저에게 효과적인 유일한 해결책은 시간이 더 오래 걸리는 어린이용 애니메이션을 만드는 것이었습니다.
사실 저는 이 "버그"를 고칠 다른 방법을 찾았습니다.
저는 css3 애니메이션으로 페이지를 유지하는 컨테이너 요소를 가지고 있습니다.페이지가 애니메이션을 완료하면 css3 속성은 transform: translate(0,0); 값을 가집니다.그래서 방금 이 줄을 제거했는데 모든 것이 정상적으로 작동했습니다. 위치: 고정이 올바르게 표시됩니다.페이지 번역을 위해 css 클래스를 적용하면 번역 속성이 추가되고 css3 애니메이션도 작동합니다.
예:
.page {
top: 50px;
position: absolute;
transition: ease 0.6s all;
/* -webkit-transform: translate(0, 0); */
/* transform: translate(0,0); */
}
.page.hide {
-webkit-transform: translate(100%, 0);
transform: translate(-100%, 0);
}
데모: http://jsfiddle.net/ZWcD9/
react-reactable-view(rsw) 구현하려다가 react-color 이 발생했습니다 문제가 를 로 swipe 발생했습니다 문제가 react 구현하려다가 이 - 를 -는rswaps이었습니다를 적용하는 였습니다.translate(-100%, 0)
클릭하면 색상 선택기 모델이 닫히는 전체 화면 위에 추가된 기본 고정 위치 div를 깨는 탭 패널로 이동합니다.
이 경우 을 하는 이었습니다 에 이었습니다 하는 )에 반대 변환을 적용하는 것이었습니다.translate(100%, 0)
하려고 생각했습니다이것이 다른 경우에 유용한지는 모르겠지만 어쨌든 공유하려고 생각했습니다.
위에서 설명한 내용을 보여주는 예는 다음과 같습니다.
https://codepen.io/relativemc/pen/VwweEez
내 폰갭 프로젝트에서 웹킷 변형 - 웹킷 변형 : 번역 Z(0); 매력적으로 작동했습니다.모바일 브라우저가 아닌 크롬과 사파리에서도 이미 작동하고 있었습니다.WRAPPER DIV가 완료되지 않은 경우도 있습니다.유동 DIV의 경우 클리어 클래스를 적용합니다.
<div class="Clear"></div> .Clear, .Clearfix{clear:both;}
사파리나 파이어폭스에서 복제할 수 없기 때문에 Chrome의 버그 때문일 수도 있지만 이것은 Chrome 40.0.2214.111 http://jsbin.com/hacame/1/edit?html,css,output 에서 작동합니다.
그것은 매우 특정한 구조이므로 보편적으로 적용 가능한 한 줄짜리 CSS 수정은 결코 아닙니다. 하지만 아마도 누군가가 사파리와 파이어폭스에서 작동하도록 수정할 수 있을 것입니다.
그냥 덧붙였어요.transform: unset;
내 머리에 고정된 머리말을 해주었는데, 그게 나한테 효과가 있었어요!
저도 넥스트.js로 framer motion을 사용하고 있는데 제 고정 헤더에도 같은 문제가 있어서 쉽게 고칠 수 있을 것 같습니다.
.header {
position: fixed;
transform: unset;
}
를 를 으로 으로 설정transform:unset;
저를 위해 일하고 있습니다.
React로 작업하면 Portal에서 요소를 고정된 위치로 감쌀 수 있습니다. 이렇게 하면 잘 작동합니다.
하기 추가하기-webkit-transform
고정된 요소로 문제를 해결해 주었습니다.
.fixed_element {
-webkit-transform: translateZ(0);
position: fixed;
....
}
테스트된 모든 브라우저 및 모바일 장치(Chrome, IE, Firefox, Safari, iPad, iPhone 5 및 6, Android)에서 작동하는 기능은 다음과 같습니다.
img.ui-li-thumb {
position: absolute;
left: 1px;
top: 50%;
-ms-transform: translateY(-50%);
-webkit-transform: translateY(-50%);
-moz-transform: translateY(-50%);
-o-transform: translateY(-50%);
transform: translateY(-50%);
}
변환을 모든 조상에 적용하면 요소의 고정 위치가 끊어집니다.
<div style='position:fixed;-.*-transform:scale(2)'>...</div> //ok
<div style='-.*-transform:scale(2)'>
<div style='position:fixed'>...</div> // broken
</div>
javascript를 옵션으로 사용할 수 있다면 변환된 요소 안에 있을 때 창과 관련된 위치 고정 요소를 배치하는 방법이 될 수 있습니다.
let fixedEl // some node that you is position
// fixed inside of an element that has a transform
const rect = fixedEl.getBoundingClientRect()
const distanceFromWindowTop = rect.top
const distanceFromWindwoLeft = rect.left
let top = fixedEl.offsetTop
let left = fixedEl.offsetLeft
if(distanceFromWindowTop !== relativeTop) {
top = -distanceFromWindowTop
fixedEl.style.top = `${top}px`
}
if(distanceFromWindowLeft !== relativeLeft) {
left = -distanceFromWindowLeft
fixedEl.style.left = `${left}px`
}
물론 높이와 폭도 조절해야 할 것입니다.fixedEl
컨테이너를 기준으로 계산할 겁니다이는 사용 사례에 따라 다르지만 컨테이너에 관계없이 고정된 위치를 예측 가능하게 설정할 수 있습니다.
요소가 변환되는 동안 동적 클래스를 추가합니다.$('#elementId').addClass('transformed')
. 그럼 CSS에서 선언하고,
.translatX(@x) {
-webkit-transform: translateX(@X);
transform: translateX(@x);
//All other subsidaries as -moz-transform, -o-transform and -ms-transform
}
그리고나서
#elementId {
-webkit-transform: none;
transform: none;
}
그리고나서
.transformed {
#elementId {
.translateX(@neededValue);
}
}
이제 위치: 자식 요소에 상위 및 z 인덱스 속성 값이 제공되면 고정됩니다. 부모 요소가 변환될 때까지 고정된 상태로 잘 작동합니다.변환을 되돌리면 하위 요소가 다시 고정된 상태로 팝업됩니다.클릭 시 열기 및 닫기를 전환하는 탐색 사이드바를 실제로 사용하고 있고 페이지를 스크롤할 때 끈적임이 유지되는 탭 세트가 있다면 상황을 완화할 수 있습니다.
제 경우에는 transform:translateX()를 transform:translateY() 전에 translateX()를 사용할 수 없다는 것을 알았습니다. 둘 다 사용하려면 transform:translate(, )를 사용해야 합니다.
모든 번역이 원래 위치로 돌아가는 경우0
, 당신이 설정한 곳에서 이 솔루션을 사용할 수 있습니다.transform: unset;
:
100% {
opacity: 1;
visibility: visible;
/* Use unset to allow fixed elements instead of translate3d(0, 0, 0) */
transform: unset;
}
React를 사용하는 경우 ReactDOM.createPortal을 사용할 수 있습니다.
팁은 돈코펙이 주는데 이게 뭔지 알아내는데 시간이 좀 걸렸습니다.제가 발견한 것은 이렇습니다.
ReactDOM.createPortal로 래핑된 구성 요소를 반환하면 두 번째 인수로 상위 요소를 설정할 수 있으며, React는 해당 구성 요소를 해당 주어진 요소에 추가하므로 예제position: fixed
변형된 구성 요소의 자식으로서도 괜찮을 겁니다
import ReactDOM from "react-dom";
const MyModal = () => {
return ReactDOM.createPortal(
<div style={{position: "fixed", top: "0", left: "0",
background: "white", color: "black",
padding: "3rem", zIndex: "50000"}}>
Modal Element
</div>,
document.body
)
}
이 경우 React는 이 구성 요소를 상위 구성 요소의 하위 구성 요소가 아닌 본문의 하위 구성 요소로 렌더링합니다.
이것은 정확한 답이 아니라 단지 변신을 끄는 빠른 방법이기 때문에 누군가에게 도움이 될 수도 있기 때문에 투표하지 말아주세요.부모에 대한 변환이 정말로 필요하지 않고 고정된 위치가 다시 작동하기를 원하는 경우:
#element_with_transform {
-webkit-transform: none;
transform: none;
}
언급URL : https://stackoverflow.com/questions/2637058/position-fixed-doesnt-work-when-using-webkit-transform
'programing' 카테고리의 다른 글
핵심 데이터를 미리 채울 방법이 있습니까? (0) | 2023.09.14 |
---|---|
워드프레스의 이미지에 카테고리 할당 (0) | 2023.09.14 |
iOS: Using UIView's 'drawRect:' vs. its layer's delegate 'drawLayer:inContext:' (0) | 2023.09.14 |
템플릿 디렉터리 Timber/Twig 가져오기 (0) | 2023.09.14 |
동적 데이터를 표시하기 위한 for loop 만들기 (0) | 2023.09.14 |