\r\n \r\n\r\n フローティングの表示範囲設定\r\n\r\n\r\n\r\n\r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n\r\n\r\n\r\n```\r\n\r\n```css\r\n*{\r\n margin: 0;\r\n padding: 0;\r\n}\r\nbody{\r\n text-align: center;\r\n background-color: #EBE5ED;\r\n width: 50%;\r\n margin: 0 auto;\r\n}\r\nimg{\r\n width: 50%;\r\n vertical-align: bottom;\r\n}\r\n\r\n.fixed-cta {\r\n bottom: 0;\r\n left: 0;\r\n opacity: 0;\r\n position: fixed;\r\n text-align: center;\r\n width: 100%;\r\n z-index: 100;\r\n}\r\n\r\n\r\n.fixed-cta_button {\r\n animation: beat linear 1s 0s infinite;\r\n display: inline-block;\r\n padding: 0 ;\r\n transform-origin: bottom;\r\n}\r\n\r\n```\r\n\r\n```js\r\n\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar FixedOffer = /** @class */ (function () {\r\n function FixedOffer(element, options, labels) {\r\n var _this = this;\r\n if (element === void 0) { element = ''; }\r\n if (labels === void 0) { labels = {\r\n ended: 'fixed-offer-is-ended',\r\n initialized: 'fixed-offer-is-initialized',\r\n invisible: 'fixed-offer-is-invisible',\r\n visible: 'fixed-offer-is-visible',\r\n }; }\r\n this.labels = labels;\r\n this.isShown = false;\r\n this.isClosedOnPurpose = false;\r\n this.options = __assign({\r\n elementClass: 'fixed-offer',\r\n startSelector: '#fixed-offer-start',\r\n endSelector: '#fixed-offer-end',\r\n closeButtons: '.fixed-offer-closer',\r\n revivalMinutes: 0,\r\n startCondition: 'entered',\r\n isShownEternally: false,\r\n endCondition: 'entered'\r\n }, options);\r\n this.element = document.querySelector(element) || document.createElement('div');\r\n this.element.classList.add(this.options.elementClass);\r\n this.start = document.querySelector(this.options.startSelector);\r\n this.end = document.querySelector(this.options.endSelector);\r\n this.closeButtons = document.querySelectorAll(this.options.closeButtons);\r\n if (this.closeButtons.length) {\r\n this.closeButtons.forEach(function (item) {\r\n item.addEventListener('click', function (e) {\r\n e.preventDefault;\r\n _this.close();\r\n _this.isClosedOnPurpose = true;\r\n if (typeof _this.options.revivalMinutes === 'number' && _this.options.revivalMinutes > 0) {\r\n _this.startRevivalTimer();\r\n }\r\n });\r\n });\r\n }\r\n if (IntersectionObserver) {\r\n var observer = new IntersectionObserver(function (entries) {\r\n _this.toggleOnScroll();\r\n }, {\r\n threshold: 0\r\n });\r\n if (this.start)\r\n observer.observe(this.start);\r\n if (this.end)\r\n observer.observe(this.end);\r\n }\r\n else {\r\n var scrollTimer_1;\r\n window.addEventListener('scroll', function () {\r\n if (scrollTimer_1) {\r\n return;\r\n }\r\n scrollTimer_1 = setTimeout(function () {\r\n scrollTimer_1 = 0;\r\n _this.toggleOnScroll();\r\n }, 500);\r\n });\r\n window.addEventListener('load', function () {\r\n _this.toggleOnScroll();\r\n });\r\n window.addEventListener('resize', function () {\r\n _this.toggleOnScroll();\r\n });\r\n }\r\n this.element.addEventListener('transitionend', function () {\r\n _this.element.classList.add(_this.labels.ended);\r\n });\r\n this.element.classList.add(this.labels.initialized);\r\n this.element.classList.add(this.labels.ended);\r\n this.toggleOnScroll();\r\n }\r\n FixedOffer.prototype.show = function () {\r\n if (!this.isShown && !this.isClosedOnPurpose) {\r\n this.element.classList.remove(this.labels.ended);\r\n this.element.classList.remove(this.labels.invisible);\r\n this.element.classList.add(this.labels.visible);\r\n this.isShown = true;\r\n }\r\n };\r\n FixedOffer.prototype.close = function () {\r\n if (this.isShown) {\r\n this.element.classList.remove(this.labels.ended);\r\n this.element.classList.remove(this.labels.visible);\r\n this.element.classList.add(this.labels.invisible);\r\n this.isShown = false;\r\n }\r\n };\r\n FixedOffer.prototype.toggleOnScroll = function () {\r\n var scroll = this.testScroll();\r\n if (scroll.start && !scroll.end) {\r\n this.show();\r\n }\r\n else if (!this.options.isShownEternally || scroll.end) {\r\n this.close();\r\n }\r\n };\r\n FixedOffer.prototype.testScroll = function () {\r\n return {\r\n start: this.start !== null ? this.testScrollState(this.start, this.options.startCondition) : true,\r\n end: this.end !== null ? this.testScrollState(this.end, this.options.endCondition) : false\r\n };\r\n };\r\n FixedOffer.prototype.startRevivalTimer = function () {\r\n var _this = this;\r\n var timer = setTimeout(function () {\r\n _this.isClosedOnPurpose = false;\r\n }, this.options.revivalMinutes);\r\n };\r\n FixedOffer.prototype.getY = function (element) {\r\n return window.pageYOffset + element.getBoundingClientRect().top;\r\n };\r\n FixedOffer.prototype.testScrollState = function (element, condition) {\r\n switch (condition) {\r\n case 'arrived':\r\n return window.pageYOffset >= this.getY(element) - window.innerHeight;\r\n case 'top':\r\n return window.pageYOffset >= this.getY(element);\r\n case 'entered':\r\n return window.pageYOffset >= (this.getY(element) + element.offsetHeight - window.innerHeight);\r\n case 'left':\r\n return window.pageYOffset >= this.getY(element) + element.offsetHeight;\r\n default:\r\n return false;\r\n }\r\n };\r\n return FixedOffer;\r\n}());\r\n\r\n```\r\n\r\n\r\n## position: fixed;で追従させる要素\r\n`
\r\n \r\n
`\r\n \r\n\r\n## 何をどこで表示開始、非表示にさせるか\r\n`
\r\n \r\n
`\r\nを\r\n ``\r\nで1度表示開始\r\n``\r\nのタグ地点で上記追従要素を非表示\r\n\r\n## エラーメッセージ・具体的な不具合\r\n追従の要素が指定の範囲で表示・非表示されない(指定の範囲は上記の通り)\r\nそもそも追従要素すら表示されない\r\n\r\n\r\n詳しい方ご教授いただけますと幸いです。","answerCount":1,"upvoteCount":0,"datePublished":"2020-07-08T09:26:09.683Z","dateModified":"2022-01-12T10:55:45.698Z","suggestedAnswer":[{"@type":"Answer","text":"以下のようにすると、当方の環境では動作しました。\r\n\r\nCSSを追加。\r\n\r\n```css\r\n .fixed-offer-is-visible{\r\n opacity: 1;\r\n }\r\n```\r\n\r\nJavaScriptを追加。(ロードイベントの中か、bodyの末尾で)\r\n\r\n```js\r\nconst fixedOffer = new FixedOffer('#fixed-cta');\r\n```","dateModified":"2020-07-10T10:22:29.658Z","datePublished":"2020-07-10T10:22:29.658Z","upvoteCount":0,"url":"https://teratail.com/questions/276077#reply-394218","comment":[{"@type":"Comment","text":"早速実践しましたが何も反応せずでした。もう少し粘ります。\r\nお時間いただき大変恐縮です。ありがとうございます。","datePublished":"2020-07-10T12:19:17.593Z","dateModified":"2020-07-10T12:19:17.593Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/JavaScript","name":"JavaScriptに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/276077","name":"スクロールで要素を表示範囲を設定したい"}}]}}}
質問するログイン新規登録

Q&A

1回答

1192閲覧

スクロールで要素を表示範囲を設定したい

bakio

総合スコア21

JavaScript

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

HTML

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

CSS

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

0グッド

0クリップ

投稿2020/07/08 09:26

編集2020/07/10 01:32

0

0

html

1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta charset="utf-8"> 6 <link rel="stylesheet" href="css/style.css"> 7 <script src="js/jquery-3.4.1.min.js"></script> 8 <script type="text/javascript" src="js/fixed_offer.js"></script> 9 10 <title>フローティングの表示範囲設定</title> 11 12</head> 13 14<body> 15 16 <div><img src="img/fv.jpg"></div> 17 <div><img src="img/view.jpg"></div> 18 <a id="fixed-offer-start" href="#fixed-offer-start"></a> 19 <div><img src="img/img01.jpg"></div> 20 <div><img src="img/img02.jpg"></div> 21 <div><img src="img/img03.jpg"></div> 22 <div><img src="img/img04.jpg"></div> 23 <div><img src="img/img05.jpg"></div> 24 <div><img src="img/img06.jpg"></div> 25 <div><img src="img/img07.jpg"></div> 26 <div><img src="img/img08.jpg"></div> 27</div><a id="fixed-offer-end" href="#fixed-offer-end"></a> 28<div><img src="img/not_view.jpg"></div> 29 30 <div class="fixed-cta" id="fixed-cta"> 31 <a class="fixed-cta_button"><img src="img/float.png"></a> 32 </div> 33</body> 34 35</html> 36

css

1*{ 2 margin: 0; 3 padding: 0; 4} 5body{ 6 text-align: center; 7 background-color: #EBE5ED; 8 width: 50%; 9 margin: 0 auto; 10} 11img{ 12 width: 50%; 13 vertical-align: bottom; 14} 15 16.fixed-cta { 17 bottom: 0; 18 left: 0; 19 opacity: 0; 20 position: fixed; 21 text-align: center; 22 width: 100%; 23 z-index: 100; 24} 25 26 27.fixed-cta_button { 28 animation: beat linear 1s 0s infinite; 29 display: inline-block; 30 padding: 0 ; 31 transform-origin: bottom; 32} 33

js

1 2var __assign = (this && this.__assign) || function () { 3 __assign = Object.assign || function(t) { 4 for (var s, i = 1, n = arguments.length; i < n; i++) { 5 s = arguments[i]; 6 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) 7 t[p] = s[p]; 8 } 9 return t; 10 }; 11 return __assign.apply(this, arguments); 12}; 13var FixedOffer = /** @class */ (function () { 14 function FixedOffer(element, options, labels) { 15 var _this = this; 16 if (element === void 0) { element = ''; } 17 if (labels === void 0) { labels = { 18 ended: 'fixed-offer-is-ended', 19 initialized: 'fixed-offer-is-initialized', 20 invisible: 'fixed-offer-is-invisible', 21 visible: 'fixed-offer-is-visible', 22 }; } 23 this.labels = labels; 24 this.isShown = false; 25 this.isClosedOnPurpose = false; 26 this.options = __assign({ 27 elementClass: 'fixed-offer', 28 startSelector: '#fixed-offer-start', 29 endSelector: '#fixed-offer-end', 30 closeButtons: '.fixed-offer-closer', 31 revivalMinutes: 0, 32 startCondition: 'entered', 33 isShownEternally: false, 34 endCondition: 'entered' 35 }, options); 36 this.element = document.querySelector(element) || document.createElement('div'); 37 this.element.classList.add(this.options.elementClass); 38 this.start = document.querySelector(this.options.startSelector); 39 this.end = document.querySelector(this.options.endSelector); 40 this.closeButtons = document.querySelectorAll(this.options.closeButtons); 41 if (this.closeButtons.length) { 42 this.closeButtons.forEach(function (item) { 43 item.addEventListener('click', function (e) { 44 e.preventDefault; 45 _this.close(); 46 _this.isClosedOnPurpose = true; 47 if (typeof _this.options.revivalMinutes === 'number' && _this.options.revivalMinutes > 0) { 48 _this.startRevivalTimer(); 49 } 50 }); 51 }); 52 } 53 if (IntersectionObserver) { 54 var observer = new IntersectionObserver(function (entries) { 55 _this.toggleOnScroll(); 56 }, { 57 threshold: 0 58 }); 59 if (this.start) 60 observer.observe(this.start); 61 if (this.end) 62 observer.observe(this.end); 63 } 64 else { 65 var scrollTimer_1; 66 window.addEventListener('scroll', function () { 67 if (scrollTimer_1) { 68 return; 69 } 70 scrollTimer_1 = setTimeout(function () { 71 scrollTimer_1 = 0; 72 _this.toggleOnScroll(); 73 }, 500); 74 }); 75 window.addEventListener('load', function () { 76 _this.toggleOnScroll(); 77 }); 78 window.addEventListener('resize', function () { 79 _this.toggleOnScroll(); 80 }); 81 } 82 this.element.addEventListener('transitionend', function () { 83 _this.element.classList.add(_this.labels.ended); 84 }); 85 this.element.classList.add(this.labels.initialized); 86 this.element.classList.add(this.labels.ended); 87 this.toggleOnScroll(); 88 } 89 FixedOffer.prototype.show = function () { 90 if (!this.isShown && !this.isClosedOnPurpose) { 91 this.element.classList.remove(this.labels.ended); 92 this.element.classList.remove(this.labels.invisible); 93 this.element.classList.add(this.labels.visible); 94 this.isShown = true; 95 } 96 }; 97 FixedOffer.prototype.close = function () { 98 if (this.isShown) { 99 this.element.classList.remove(this.labels.ended); 100 this.element.classList.remove(this.labels.visible); 101 this.element.classList.add(this.labels.invisible); 102 this.isShown = false; 103 } 104 }; 105 FixedOffer.prototype.toggleOnScroll = function () { 106 var scroll = this.testScroll(); 107 if (scroll.start && !scroll.end) { 108 this.show(); 109 } 110 else if (!this.options.isShownEternally || scroll.end) { 111 this.close(); 112 } 113 }; 114 FixedOffer.prototype.testScroll = function () { 115 return { 116 start: this.start !== null ? this.testScrollState(this.start, this.options.startCondition) : true, 117 end: this.end !== null ? this.testScrollState(this.end, this.options.endCondition) : false 118 }; 119 }; 120 FixedOffer.prototype.startRevivalTimer = function () { 121 var _this = this; 122 var timer = setTimeout(function () { 123 _this.isClosedOnPurpose = false; 124 }, this.options.revivalMinutes); 125 }; 126 FixedOffer.prototype.getY = function (element) { 127 return window.pageYOffset + element.getBoundingClientRect().top; 128 }; 129 FixedOffer.prototype.testScrollState = function (element, condition) { 130 switch (condition) { 131 case 'arrived': 132 return window.pageYOffset >= this.getY(element) - window.innerHeight; 133 case 'top': 134 return window.pageYOffset >= this.getY(element); 135 case 'entered': 136 return window.pageYOffset >= (this.getY(element) + element.offsetHeight - window.innerHeight); 137 case 'left': 138 return window.pageYOffset >= this.getY(element) + element.offsetHeight; 139 default: 140 return false; 141 } 142 }; 143 return FixedOffer; 144}()); 145

position: fixed;で追従させる要素

`<div class="fixed-cta" id="fixed-cta">
<a class="fixed-cta_button"><img src="img/float.png"></a>

</div>`

何をどこで表示開始、非表示にさせるか

`<div class="fixed-cta" id="fixed-cta">
<a class="fixed-cta_button"><img src="img/float.png"></a>

</div>` を `<a id="fixed-offer-start" href="#fixed-offer-start"></a>` で1度表示開始 `</div><a id="fixed-offer-end" href="#fixed-offer-end"></a>` のタグ地点で上記追従要素を非表示

## エラーメッセージ・具体的な不具合
追従の要素が指定の範囲で表示・非表示されない(指定の範囲は上記の通り)
そもそも追従要素すら表示されない

詳しい方ご教授いただけますと幸いです。

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

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

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

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

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

Lhankor_Mhy

2020/07/09 01:29

こんにちは。 補足願います。 ・「表示開始」とは何を表示するのですか? ・「フローティングさせる要素」とはどれですか? ・「フローティング」とはなんですか? ・「動作せず」とは具体的には何が起きていますか? エラーメッセージなどをご提示ください。(エラーメッセージの確認の仕方がわからないようでしたら、その旨をお知らせください)
bakio

2020/07/10 01:24

Lhankor_Mhy さん 不備のご指摘ありがとうございます。 質問本文に上記詳細追記いたします。
Lhankor_Mhy

2020/07/10 01:37

補足ありがとうございます。 #fixed-offer-start がスクロールによってスクリーンに表示されたら、.fixed-ctaを表示。 #fixed-offer-end がスクロールによってスクリーンに表示されたら、.fixed-ctaを非表示。 という理解で合っていますか? その場合、両方がスクリーンに入っているときには、どのような動作を想定されていますか?
Lhankor_Mhy

2020/07/10 01:39

すみません、もうひとつ。 FixedOffer 関数の呼び出しは、どこで行われていますか? ご提示のコードで見つけられませんでした。
bakio

2020/07/10 02:34

#fixed-offer-start がスクロールによってスクリーンに表示されたら、.fixed-ctaを表示。 #fixed-offer-end がスクロールによってスクリーンに表示されたら、.fixed-ctaを非表示。 という理解で合っていますか? その場合、両方がスクリーンに入っているときには、どのような動作を想定されていますか? >>>>>認識あっております。 【目標の動作】 .fixed-cta が最初は非表示の状態で、#fixed-offer-start  で表示 その間は表示、追従をしていて、 #fixed-offer-end がスクロールでスクリーンに表示されたら非表示 という動作を想定しております。 FixedOffer 関数の呼び出しは、どこで行われていますか? ご提示のコードで見つけられませんでした。 >>>>>>>>上記のjavascriptで動作できるものだと思っていました。 もしかすると何か書き加えないといけないということかもしれません。 初心者ゆえに色々とご指導いただきありがとうございます。 こちらのコード探してみます。
bakio

2020/07/10 02:47

【関数の呼び出し】 こちらでしょうか?間違っていたらすみません。 const fixedOffer = new FixedOffer('#fixed-cta') const voiceSwitch = document.getElementById('voice_switch') const voiceContent = document.getElementById('voice_content') if (voiceSwitch && voiceContent) { voiceSwitch.classList.add('is-hidden') voiceContent.classList.add('is-hidden') voiceSwitch.addEventListener('click', function(e){ e.preventDefault() voiceSwitch.classList.toggle('is-hidden') voiceContent.classList.toggle('is-hidden') }) }
Lhankor_Mhy

2020/07/10 03:27

1行目がそれっぽいですね。 動作しましたか?
bakio

2020/07/10 07:05

動作せずでした.... たくさんお時間割いていただいて申し訳ございません
guest

回答1

0

以下のようにすると、当方の環境では動作しました。

CSSを追加。

css

1 .fixed-offer-is-visible{ 2 opacity: 1; 3 }

JavaScriptを追加。(ロードイベントの中か、bodyの末尾で)

js

1const fixedOffer = new FixedOffer('#fixed-cta');

投稿2020/07/10 10:22

Lhankor_Mhy

総合スコア37634

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

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

bakio

2020/07/10 12:19

早速実践しましたが何も反応せずでした。もう少し粘ります。 お時間いただき大変恐縮です。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問