-webkit-transformを使用すると、固定位置が機能しない


155

-webkit-transform(および-moz-transform / -o-transform)を使用してdivを回転させています。また、divがユーザーと共にスクロールダウンするように、位置が固定されています。

Firefoxでは正常に動作しますが、Webkitベースのブラウザでは機能しません。-webkit-transformを使用すると、固定位置が機能しなくなります。そんなことがあるものか?


4
デモページは多くの場合、質問への回答に役立ちます。jsbin.comでは、サイトにリンクしたくない場合に問題を説明する一時的なページを作成できます。
リッチブラッドショー

jsfiddle.netは、一時編集ビンのもう1つの良い例です。
カイル

@Rich Bradshaw jsbin.comはとてもいいです。今まで知りませんでした。ほとんどのプロジェクトはローカルで実行しているので、次回はそれを使用します。Tnx
iSenne

7
それは動作しません、すべてのFirefoxで罰金を。
vsync 14

3
2017年にはまだ問題があります。「バグではなく機能です」に引き続き固執しているようです。引数...
Max

回答:


87

いくつかの調査の後、この問題についてChromium Webサイトにバグレポートがありました。これまでのところ、Webkitブラウザーはこれら2つの効果を同時にレンダリングできません。

WebkitのみのCSSをスタイルシートに追加し、変換されたdivを画像にして、それを背景として使用することをお勧めします。

@media screen and (-webkit-min-device-pixel-ratio:0) {
  /* Webkit-specific CSS here (Chrome and Safari) */

  #transformed_div {
    /* styles here, background image etc */
  }
}

したがって、今のところは、WebkitブラウザーがFFに追いつくまで、昔ながらの方法で行う必要があります。

編集:2012年10月24日現在、バグは解決されていません。


これはバグではないようですが、2つの影響のために別々の座標系とスタック順序が必要であるため、仕様の一部です。この回答で説明したように


34
さらに多くの年後、まだ解決されていません。かなり悲しい。
アマルゴビナス2015年

9
この回答によるとそれはバグではなく仕様の一部です。
MichaelRushton 2015年

15
じっと座って見て-私はそれがその10周年に生きるに
違いない

29
2017年8月30日、キャプテンのログ。また、他の船長がずっと前に説明した奇妙な異常にも遭遇しました。解決策はまだ実装されていません。
2017

14
これは私の父の父が私に警告した虫です。
danjones_mcr 2018年

96

CSSトランスフォーム仕様では、この動作を説明します。変換を伴う要素は、固定位置の子孫の包含ブロックとして機能するため、変換を伴う何かの下でのposition:fixedの動作は修正されなくなりました。

同じ要素に適用すると機能します。要素は固定として配置され、変換されます。


9
それが唯一の有用で正しい答えです。親要素の翻訳を停止し、固定要素がその一部である子要素を翻訳します。これが私のフィドルです:JSFIDDLE
Falk

2
固定要素も変換したい場合はどうなりますか?
Marc

7

background-attachmentと同じ問題が原因でChromeで背景画像が表示されなくなったことがわかった場合は、修正しました。-これは私の解決策でした:

// 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');

    });
}  

6

私のために働いた何か(少しハック)はposition:sticky代わりにです:

.fixed {
     position: sticky;
}

5
updates.html5rocks.com/2012/08/…ああそうですが、まだ十分にはサポートされていません
coiso

1
粘着性が違います。主な問題は、fixedではコンテナーの位置を無視したいということです(不透明アニメーションなどで非常に便利です)。このバグが数年経ってもまだ信じられません。恐ろしい。
FlorianB 16

6

2016年8月と固定位置とアニメーション/変換はまだ問題です。私にとって有効だった唯一の解決策は、より長い時間がかかる子要素のアニメーションを作成することでした。


新しい質問に答えてください。これらの質問は、2010年に質問した人よりもあなたを必要とします。彼らは今では問題を解決したに違いありませんか?また、この質問にはすでに回答が受け入れられています。
Umair Farooq 2016

5
違う!それはまだ問題です...質問した人は別の解決策を見つけたかもしれません–しかし、私は理由のためにこのスレッドを見つけました。
defligra

あなたの好きなように。人からの最初の質問を確認しながら、そのコメントを残しました。そして、あなたは今日ちょうど参加していて、それがあなたの最初の答えであり、また遅い答えだったので、私はそのコメントを残した理由です。私は反対票を投じなかった。それはあなたにとって良いチャンスです。
Umair Farooq 2016

1
@UmairFarooqは別の質問をしても、重複としてマークされる可能性があるので役に立たないかもしれません。私はグーグル検索だけでここに来ました、そして私はこの質問が有用であるとわかりました、デフリグラの答えも。
koMah 2016

3

実際、私はこの「バグ」を修正する別の方法を見つけました:

css3アニメーションでページを保持するコンテナー要素があります。ページがアニメーションを完了したとき、css3プロパティには値があります:transform:translate(0,0);。だから、私はこの行を削除しただけで、すべてが正常に機能しました-position:fixedが正しく表示されます。cssクラスを適用してページを翻訳すると、translateプロパティが追加され、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/


1
私にとって、fixed要素を含むラッパーにこれらのスタイルがあるため、fixed要素がスティッキーになるのを妨げていました。-webkit-perspective:1000; -webkit-transform-style:preserve-3d; これらを外すと、すべてが正常に動作します。とにかく、それらは最適化に疑問の余地がありました!
アマルゴビナス2015年

何らかの方法で変換を削除することは、おそらくこれまでのところ最善の回避策です。フェードインのようなものが完了したら、要素の外観に影響を与えずに取り外し可能にする必要があります。実際、transformX(0)がぶら下がっていると、レンダリングパフォーマンスがどうなるかはわかりません。無視されるか、パフォーマンスを低下させるか、何らかの3Dアクセラレーションを強制することでパフォーマンスを向上させることができます。知るか。いずれにせよ、アニメーションが完了したら、または固定要素がアニメーションに追加される直前でも、変換用のCSSクラスを削除するだけで済みます。
Triynko

1

私の電話ギャッププロジェクトでは、webkit変換-webkit-transform:translateZ(0); 魅力のように働いた。これは、モバイルブラウザではなく、ChromeとSafariですでに機能していました。また、場合によってはWRAPPER DIVが完了しないというもう1つの問題が発生する可能性があります。フローティングDIVの場合は、明確なクラスを適用します。

<div class="Clear"></div> .Clear, .Clearfix{clear:both;}

1

SafariでもFirefoxでも複製できないため、おそらくChromeのバグが原因ですが、これはChrome 40.0.2214.111で機能しますhttp://jsbin.com/hacame/1/edit?html,css,output

これは非常に特殊な構造であるため、普遍的に適用可能な一行のcss修正ではありませんが、SafariやFirefoxで動作させるために誰かがいじることができます。


1

react-swipeable-views(rsw)でreact-colorを実装しようとしているときにこの問題が発生しました。私にとっての問題は、rswがタブパネルに適用さtranslate(-100%, 0)れ、クリックするとカラーピッカーモデルを閉じるフルスクリーン上に追加されたデフォルトの固定位置divに違反することでした。

私にとっての解決策は、反対の変換を固定要素に適用することでした(この場合translate(100%, 0)、私の問題は修正されました。これが他の場合に役立つかどうかはわかりませんが、とにかく共有すると思います。

これは私が上で説明したことを示す例です:

https://codepen.io/relativemc/pen/VwweEez


0

-webkit-transform固定要素に追加すると、問題が解決しました。

.fixed_element {
   -webkit-transform: translateZ(0);
   position: fixed;
   ....
} 

20
それは私にはうまくいきませんでした。動作するデモを作成できますか?
アレックス

4
これにより、Chrome、FWIWでの問題が修正されました。ロン、ありがとう。
クリス

3
ありがとう、これで問題が解決しました。私を助けた!
スタイク2013年

1
@Neil Monroe、Android 2.3はまったく新しい話です。それは固定された位置付けをまったくサポートしません:)
Wiseman '22

8
以下は、使用しtranslateZ(0) ない場合のフィドルです。それが時々機能することは事実です、私はそれが機能した時を見てきました。しかし、まだそれを絞り込むことはできません。
Zequez 2014年

0

テスト済みのすべてのブラウザーとモバイルデバイス(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%);
}

2
なぜ反対票?なぜ私の回答に反対票を投じたのかについてコメントを提供していただければ幸いです。
マーフ

0

祖先に変換を適用すると、要素の固定位置が壊れます。

<div style='position:fixed;-.*-transform:scale(2)'>...</div> //ok

<div style='-.*-transform:scale(2)'>
      <div style='position:fixed'>...</div> // broken
</div>

0

オプションとして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ながら、コンテナに基づいて計算されるため、高さと幅を調整する必要があります。これはユースケースによって異なりますが、これにより、コンテナーに関係なく、何かの位置を固定して予測どおりに設定できます。


0

要素の変換中に動的クラスを追加します。$('#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);
    }
}

現在の位置:子要素にtopとz-indexのプロパティ値が指定されている場合は修正され、親要素が変換されるまで修正されたままになります。変換が元に戻されると、子要素は再び固定された状態でポップします。これにより、実際にクリックで開閉するナビゲーションサイドバーを使用していて、ページを下にスクロールしても粘着性を維持するタブセットがある場合は、状況が緩和されます。


0

私の場合、transform:translateY()の前にtransform:translateX()を使用できないことがわかりました。両方を使用する場合は、transform:translate(、)を使用する必要があります。


-1

賛成票を投じないでください。これは正確な答えではありませんが、変換をオフにするだけの速い方法であるため、誰かを助けることができます。親の変換が本当に必要なく、固定位置を再び機能させたい場合:

#element_with_transform {
  -webkit-transform: none;
  transform: none;
}

1
これは、本当に質問のタイトルのようです
ユージーンパンコフ2018年

@EugenePankovタイトルに「なし」が表示されないようにします。それが私の問題を修正したものであり、一般にそれをオフにすることを提案する人はいません。これはその質問に対する正確な答えではありませんが、変換を使用したくない人に役立ち、変換は他のライブラリからもたらされます。だから私は賛成票は欲しくないが、反対票はしないでください。質問を編集して、賛成票を投じないようにします。
makkasi 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.