実現したいこと
transform適用要素を、スマホの時も「PCでウィンドウ幅を狭めたとき」と同じ表示にしたい
発生している問題
transform適用要素がiPhoneのSafariでのみずれる
概要
楽器を奥行きのある形で、時計の針位置2,4,6,8,10に配置しています。
押したボタンによって楽器をくるくる回すプログラムをjavascriptで作りました。
楽器のラッパー要素を
メディアクエリで「transform: scale(0.4);」とすることによって
楽器全体の比率を保ったままスマホの時のみ縮小表示させています。
試しに下記デモURLをパソコンで開き、ウィンドウ幅を414px以下にしてみてください。
比率を保ったままスマホ用に縮小表示されているはずです。
chromeなら検証ツールを右側に表示してから検証ツールの領域を左に広げると414px以下にできます。
http://iroha123.starfree.jp/musicvenue/
しかしiPhoneのsafariで開いてみると楽器が時計の針位置からずれていることが確認できます。
androidのchromeではずれていませんでした。
仕様
①楽器にはposition:absoluteを指定し
②それぞれの楽器の位置はtopとleftの値で指定し、
③奥行きはtransform:translateZの値で指定しています。
④動かすときはcssのtransitionを使っています。
①はcssファイルに記述し、
②~④はjavascriptファイルで命令しています。
④はボタンを押したときに発火しますが、ボタンを押す前からすでにずれていますので後に提示したソースでは割愛しました。
ブレークポイントは
スマホ=414pxまで
PC=415pxから
です。
ソースコード
短い方がわかりやすいと思うので関係ありそうなところだけ抜粋します。
全体像が知りたい方は
http://iroha123.starfree.jp/musicvenue/
からお願いいたします。
html
1<div class="main_back"> 2 <div class="main_back_inner"> 3 <img class="instrument instrument1 clock6" src="img/mike.png" alt="マイク"> 4 <img class="instrument instrument2 clock4" src="img/drum.png" alt="ドラム"> 5 <img class="instrument instrument3 clock2" src="img/guitar.png" alt="ギター"> 6 <img class="instrument instrument4 clock10" src="img/piano.png" alt="ピアノ"> 7 <img class="instrument instrument5 clock8" src="img/saxophone.png" alt="サックス"> 8 <img class="instrument spotlight" src="img/spotlight.png" alt="スポットライト"> 9 </div> 10</div>
css
1/*最上位要素*/ 2.main_back{ 3 background-image: url("../img/stage.gif"); 4 width: 100%; 5 position: absolute; 6 top: 0; 7 left: 0; 8 width: 100%; 9 height: 100%; 10} 11/*最上位要素の一つ下の階層*/ 12.main_back_inner{ 13 position: absolute; 14 top: 0; 15 left: 0; 16 width: 100%; 17 height: 100%; 18 z-index: 2; 19 transform-style:preserve-3d; 20 perspective:1000px; 21} 22/*楽器*/ 23.instrument{ 24 display: inline-block; 25 position: absolute; 26} 27/*スポットライト*/ 28.spotlight{ 29 transform:translateZ(-150px); 30 left: 336px; 31 bottom: -9px; 32 z-index: 9; 33} 34@media screen and (max-width: 414px) { 35 .main_back{ 36 height: 145px;/*←縮小表示したときの子要素の実際のサイズ*/ 37 position: relative; 38 background-size: 100% 145px; 39 background-repeat: no-repeat; 40 overflow: hidden;/*←縮小表示によって子要素に余白ができるので隠す*/ 41 } 42 .main_back_inner{ 43 height: 421px;/*←PCの時の表示領域と等しい*/ 44 width: 946px;/*←PCの時の表示領域と等しい*/ 45 transform-origin: top left; 46 transform: scale(0.4);/*縮小表示*/ 47 position: relative; 48 top: -22px; 49 left: calc((100% - 378px)/2); 50 } 51}
javascript
1 2var selector_name_instrument = '.instrument'; 3 4//楽器を初期位置に移動させる 5clock6($(selector_name_instrument + '1')); 6clock4($(selector_name_instrument + '2')); 7clock2($(selector_name_instrument + '3')); 8clock10($(selector_name_instrument + '4')); 9clock8($(selector_name_instrument + '5')); 10 11 12//clock直後の数字は時計の針の位置。その位置に移動させる命令。 13function clock6(selector) { 14 selector.css('z-index', '10'); 15 selector.css('transform', 'translate3d(0, 0, -147px)'); 16 selector.css('left', '301px'); 17 selector.css('bottom', '30px'); 18} 19 20function clock4(selector) { 21 selector.css('z-index', '8'); 22 selector.css('transform', 'translate3d(0, 0, -300px)'); 23 selector.css('left', '743px'); 24 selector.css('bottom', '35px'); 25} 26 27function clock2(selector) { 28 selector.css('z-index', '7'); 29 selector.css('transform', 'translate3d(0, 0, -1000px)'); 30 selector.css('left', '661px'); 31 selector.css('bottom', '60px'); 32} 33 34function clock10(selector) { 35 selector.css('z-index', '7'); 36 selector.css('transform', 'translate3d(0, 0, -1000px)'); 37 selector.css('left', '-53px'); 38 selector.css('bottom', '60px'); 39} 40 41function clock8(selector) { 42 selector.css('z-index', '8'); 43 selector.css('transform', 'translate3d(0, 0, -300px)'); 44 selector.css('left', '-140px'); 45 selector.css('bottom', '35px'); 46}
試したこと
transformとiPhoneのsafariが相性が悪いとみて、グーグルで調べてみましたが下記のような結果に。。。
https://tada-fla.com/blog/20160110/ios-transform/
https://stackoverflow.com/questions/30128587/ios-safari-transition-transform-not-working
↑transitionさせる前(楽器を動かすボタンを押す前)からずれているので非該当
https://qiita.com/ttake/items/47c710142cbf57ff2adc
↑”親要素に”CSS perspectiveを追加済みなので非該当
https://sakura.monte-verita.biz/1254
↑translateZ(@)をtranslate3d(0, 0, @)にするも変わらず
行き詰まっています。。。。
補足情報(FW/ツールのバージョンなど)
iPhone OS = 13.2
追記情報
Macのsafariでユーザーエージェントをiphoneしてレスポンシブモードを使ってもズレが再現することがわかりました。
スマホの時だけおかしいなら、スマホのメディアクエリがおかしいと思い、
スマホ時のメディアクエリ内に記述した、楽器のラッパー要素のセレクタ内の命令を検証ツールで一つ一つ無効にしてみました。
すると「transform-origin: top left;」が原因であることがわかりました。
なぜこの命令をしていたかというと、「transform: scale(0.4);」するにあたって発生する余白をなくすために「position:relative」の「left: calc((100% - 378px)/2);」の値を設定するときに、計算をわかりやすくするためです。transformもpositionも左上起点なら計算できるからです。
ラッパー要素を増やして、余白をなくせるか引き続きチャレンジしてみます。
ラッパー要素は不要でした。
縮小表示命令したセレクタに
left: calc( 284px * -1 );
とすることによって親要素の左端ぴったりに配置し、そのうえで
margin-left: calc((100% - 378px)/2);
とすることによって左右方向の中央揃えで配置できました。
上記leftの値の284pxというのは縮小前の大きさの半分から縮小後の大きさの半分を引いたものです。
上記margin-leftの値の378pxというのは縮小後の大きさです。
これによってズレも消し去り、余白も消し去り、当初抱えていた問題はなくなりました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。