【CSS】iPhone で iframe の横幅がハミ出してしまう問題の解決法

【CSS】iPhone で iframe の横幅がハミ出してしまう問題の解決法

こんにちはLatinです。みなさん夏休みの予定はもう決まりましたか?
LCC全盛という事で、沖縄などの国内のリゾート地にも随分と安い金額で行けるようになりましたよね。沖縄行きて~!

さて、今回はスマホサイト制作のTipsです。
スマホサイトの制作時、 Facebook や Twitter のウィジェットを埋め込む事も多いかと思います。

フレームの横幅が固定であれば事はそれほど重大ではないのですが、レスポンシブ対応や Landscape 時に横幅を引き延ばす必要がある場合、iPhone だと iframe の幅指定「width: 100% !important;」が効かず、「横幅がはみ出てしまう」という事態によく陥ります。この時の対処法をまとめていきます。

まずは最初のHTMLとCSS

HTML

<div class="box">

<h1>Twitter ウィジェット</h1>

<div class="twitter"><a class="twitter-timeline" href="https://twitter.com/search?q=%E3%83%90%E3%82%B7%E3%83%A3%E3%83%AD%E3%82%B0%E3%80%82" data-widget-id="00000000000000000">バシャログ。 に関するツイート</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
<!-- /.twitter --></div>

<!-- /.box --></div>

HTMLはこんな感じです。
オーソドックスな Twitter の検索ウィジェットを読み込んでいます。
同じ iframe でも Facebook ウィジェットは問題なかったので、今回は問題のあった Twitter ウィジェットのみにしてあります。

CSS

.box {
  padding: 10px 10px;
  margin: 20px auto;
  background-color: red;
}

.twitter iframe {
  width: 100% !important;
  height: 200px;
}

CSSはこんな感じ。
iframe の幅を「width: 100% !important;」とする事で、端末ごとの横幅サイズにフィットさせます。
Android なんかはこれでOK。

問題のiPhoneの表示

iPhoneでの表示はどうでしょうか。問題の表示を確認してみます。

Portrait

いやん。
なぜか12pxはみ出してしまいます。

Landscape

ばかん。
Landscapeもダメ。
同じ処理でも、Facebook のウィジェットはきちんと横幅100%でフィットされるのですが、なぜか Twitter ウィジェットだけはフィットしてくれず、はみ出して描画されます。

なんでも iPad も含めた iOS 端末では、「iframe をきちんと描画してくれない」という癖があるようで、特に「%(パーセンテージ)指定」とかだとこのようなおかしな事になってしまうようです。

考え抜いた末、横幅は「px指定」で対応する事にしました。

Media Queries を使って iPhone をハックする

今回の件で問題となったのは iPhone のみでしたので、ひとまず Media Queries を使って、「縦・横」時の幅を固定値で記述する対応にしました。

Retina 以外の端末や iPad にも対応させる必要がある場合は、さらに追記する必要がありそう。

/* For iPhone Retina 4, 4S, 5, 5s, 5c, iPod touch 4, 5 */
/* Portrait */
@media only screen and (device-width: 320px) and (-webkit-min-device-pixel-ratio: 2) {
  .twitter iframe  {
   width: 538px !important;
  }
}

/* Landscape */
@media only screen and (min-device-width: 480px) and (max-device-width: 568px) and (-webkit-min-device-pixel-ratio: 2) {
  .twitter iframe  {
    width: 290px !important;
  }
}

Portrait

Landscape

ようやくフィットしてくれました・・・。
正直、「固定値で指定する」のは、苦肉の策という感じが否めない気も。
「謎の12px」さえなんとかできれば、この為だけに「Media Queries」を書く必要もないので、それが一番ベストなんでしょうけど・・・。

追々、この謎についても迫っていきたいと思います。

参考記事

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ