🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

10097閲覧

transform適用要素がiPhoneのSafariでずれる

退会済みユーザー

退会済みユーザー

総合スコア0

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2019/11/02 09:18

編集2019/11/03 01:10

実現したいこと

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というのは縮小後の大きさです。
これによってズレも消し去り、余白も消し去り、当初抱えていた問題はなくなりました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「transform: scale(@);」で拡大縮小率を設定したときに、transform-originの値を初期値(50% 50% 0)以外にすると、iPhoneのsafariで他ブラウザと違う表示になるようです。

今回はtransform-origin設定個所をcssから削除することによって、transform-originの値を初期値のままにして対処しました。

ページデザインによってはtransform-originを左上にしたり右下にしたりしたいときもあると思うのですが、そういうときどうすればいいのかはわかりませんでしたが、今回はtransform-originは中央基点で対応できましたので追求しません。

投稿2019/11/03 01:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問