質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

CSS

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

Q&A

解決済

1回答

1416閲覧

【JS】スマホ(iPhone)画面上でフッターが出現したら、下部に固定しているアイコンをその分上にズラしたい

koki0502

総合スコア19

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

CSS

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

0グッド

0クリップ

投稿2020/08/20 06:53

#実現したいこと
スクロールしてフッターが出現したら、下部に固定しているアイコンを出現した分上にズラす処理を行いたいです。
現状PC使用時は問題なく動作するのですが、スマートフォンを使用するとアイコンがフッターに隠れてしまいます。
※最下部までしっかりスクロールするとJSが実行されアイコンがズレるが、通常の使用感でのスクロールではJSは実行されない。ツールバーの関係なのか。。?

##コード

erb

1 2<!DOCTYPE html> 3<html> 4 <head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 7 <%= csrf_meta_tags %> 8 <%= csp_meta_tag %> 9 10 <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 11 <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> 12 13 14 <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js"></script> 15 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"></script> 16 <script defer src="https://use.fontawesome.com/releases/v5.7.2/js/all.js"></script> 17 </head> 18 19 <body> 20 <div class="wrapper"> 21 <div class="mobile"><%= render 'layouts/header' %></div> 22 <div class="pc"><%= render 'layouts/pc_header' %></div> 23 <div class="main_body"><%= yield %></div> 24 <div class="chat_icon"> 25 <%= image_tag "icon_chat.png", alt: "チャット", class: "" %> 26 </div> 27 <footer style="height:100px; width:100%;"></footer> 28 </div> 29 <script> 30  // デバイス画面の高さ 31  var windowHeight = window.innerHeight; 32  // チャットアイコンの位置調整 33  // スクロールしてフッターが出現したらその高さ分チャットアイコンの位置をズラす 34   35  window.addEventListener("scroll", () => { 36   // フッターの座標を取得 37  var distanceY = document.getElementsByTagName("footer")[0].getBoundingClientRect().top; 38  var icon = document.getElementsByClassName("chat_icon")[0].getBoundingClientRect().bottom; 39 40  if (icon - distanceY > 0 ) { 41  console.log('hoge') 42  document.getElementsByClassName("chat_icon")[0].style.bottom = windowHeight - distanceY + 25 + "px"; 43 } 44  // if (windowHeight - distanceY >= 0) { 45  // document.getElementsByClassName("chat_icon")[0].style.bottom = windowHeight - distanceY + 25 + "px"; 46  // }; 47  }); 48 49 50  // ページ移行時ページ高さがデバイス画面の高さより低い場合 51  // チャットアイコンの位置をフッターの分上げる 52  function checkFooter() { 53   //getElementsByTagNameは配列で取得するため[0]が必要 54  //getBoundingClientRect().topでfooter要素topの座標を取得しdistanceYに代入 55  var distanceY = document.getElementsByTagName("footer")[0].getBoundingClientRect().top; 56  //ページ遷移時に、footerが画面に入り込めば実行 57  //1pxでもfooterのtopが表示されていれば 58  if (windowHeight - distanceY > 0) { 59   document.getElementsByClassName("chat_icon")[0].style.bottom = windowHeight - distanceY + 25 + "px"; 60  console.log('実行') 61  }; 62  }; 63   checkFooter(); 64 65   </script> 66 </body> 67</html> 68

sass

1@media (max-width: 567px) { 2 //chat icon 3 .chat_icon { 4 width: 50px; 5 position: fixed; 6 right: 10px; 7 bottom: 10px; 8 9 img { 10 width: 50px; 11 height: 50px; 12 } 13 } 14} 15 16@media (min-width: 567px) { 17 //chat icon 18 .chat_icon { 19 width: 125px; 20 margin: 0 auto; 21 position: fixed; 22 right: 0; 23 bottom: 25px; 24 text-align: left; 25 26 img { 27 width: 75px; 28 height: 75px; 29 } 30 } 31}

###行ったこと
1.デバイスの画面高さ・フッター頂点の座標を取得し、フッターが画面に出現すると関数を実行

js

1var windowHeight = window.innerHeight; 2window.addEventListener("scroll", () => { 3 // フッターの座標を取得 4 var distanceY = document.getElementsByTagName("footer")[0].getBoundingClientRect().top; 5 6 if (windowHeight - distanceY >= 0) { 7 document.getElementsByClassName("chat_icon")[0].style.bottom = windowHeight - distanceY + 25 + "px"; 8 }; 9});

2.アイコン・フッター頂点の座標を取得し、フッターが画面に出現すると関数を実行

js

1window.addEventListener("scroll", () => { 2 // フッターの座標を取得 3 var distanceY = document.getElementsByTagName("footer")[0].getBoundingClientRect().top; 4 var icon = document.getElementsByClassName("chat_icon")[0].getBoundingClientRect().bottom; 5 6 if (icon - distanceY > 0 ) { 7 document.getElementsByClassName("chat_icon")[0].style.bottom = windowHeight - distanceY + 25 + "px"; 8 } 9 10}); 11

※上記2点はerbファイルのスクリプトタグ内にも記載しています。

解決策・アドバイス等ございましたらご教示いただけると幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

var windowHeight = window.innerHeight;
window.addEventListener内に入れると実装できました

投稿2020/08/21 07:44

koki0502

総合スコア19

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問