# 判斷 Div 在 ScrollBar 移動後,是否還在可見的範圍內 ? 若不在範圍內顯示浮動視窗 ###### tags: `實作 Style` ## 20231116更新 ### HTML ``` <div class="mb-3" id="divBtnGroup"> <button type="button" id="btnExp" class="btn btn-primary ms-3" disabled><span class="@CommonConfig.Icon.Mdi.ExpandAll"></span> 展開細項</button> <button type="button" id="btnAdd" class="btn btn-primary ms-3" disabled><i class="@CommonConfig.Icon.FontAwesome.AddItem"></i> 新增</button> <button type="button" id="btnDel" class="btn btn-primary ms-3" disabled><i class="@CommonConfig.Icon.FontAwesome.DeleteItem"></i> 刪除</button> <button type="button" id="btnCopy" class="btn btn-primary ms-3" disabled><i class="@CommonConfig.Icon.FontAwesome.Copy"></i> 複製</button> <button type="button" id="btnMod" class="btn btn-primary ms-3" disabled><i class="@CommonConfig.Icon.FontAwesome.EditItem"></i> 修改</button> <button type="button" id="btnSave" class="btn btn-primary ms-3"><i class="@CommonConfig.Icon.FontAwesome.Save"></i> 儲存</button> <button type="button" id="btnPrint" class="btn btn-primary ms-3"><span class="@CommonConfig.Icon.Mdi.PreView"></span> 預覽</button> <button type="button" id="btnClose" class="btn btn-primary ms-3"><i class="@CommonConfig.Icon.FontAwesome.Cancel"></i> 關閉</button> </div> @* 基準點元素,必須給內容,空的話好像不會存在網頁上 ? 不太確定 *@ <span id="forFloatDatumPoint" class="text-center"> </span> @* 這個是 bootstrap-table 套件 *@ <table class="table table-bordered no-margin" id="tblItem" data-locale="zh-TW" data-loading-template="@CommonConfig.Icon.BootstarpTableLoading" data-single-select="true" data-unique-id="ItemId" data-click-to-select="true"> <thead> <tr> <th data-checkbox="true"></th> <th data-field="" data-formatter="idFormatter" data-align="center" data-width="50">編號</th> <th data-field="Item">項目</th> <th data-field="ItemDesc">項目描述</th> <th data-field="SpecMax" data-formatter="specFormatter">規格</th> <th data-field="EqNames">適用機台</th> <th data-field="Remark">註解</th> <th data-field="IsExpand" data-formatter="isExpandFormatter" data-align="center" data-width="80">是否展開</th> </tr> </thead> </table> ``` ### JS ``` $(window).scroll(function () { let eleForFloatDatumPoint = $('#forFloatDatumPoint'); // 基準點 let scroll = $(window).scrollTop(); // scroll 位置 let elementHeight = eleForFloatDatumPoint.outerHeight(); // 基準點元素高度 let eleForFloatDatumPointOffset = eleForFloatDatumPoint.offset().top; // 基準點元素最上方的位置 if (scroll > eleForFloatDatumPointOffset + elementHeight) { $('#divBtnGroup').css({ 'position': 'fixed', 'top': '110px', // 設置固定位置的頂部邊距 => 也可用百分比 'z-index': 101 }); } else { $('#divBtnGroup').css({ 'position': 'static', // 恢復原來的位置 'z-index': 10 }); } }); ``` ---------------------------------------------- ## 結果  ## 實作概念 1. 準備一個浮動的 div 區塊 2. JS 判斷那個活動資訊是不是已經沒有在現在的畫面上,沒有的話 把浮動的 div 區塊 show 出來 ## 解決過程 一開始我想讓原本的 div 區塊浮動起來,但是不太懂怎麼弄,就換個方法試試看 於是我開始從網路找怎麼判斷原本的 div 區塊是否正在當前可見畫面上,因為沒概念,找到之後就開始看 Function 是怎麼做的,理解他並自己模擬是否可行 [參考-滚动后如何检查元素是否可见?](https://blog.csdn.net/asdfgh0077/article/details/103504864)  模擬後發現不太對,改成對的之後並加上註解,期望之後不要忘記怎麼用XD ## Script ``` <script> $(function () { SetFloatEventInfoVisiable(); $(window).scroll(function () { SetFloatEventInfoVisiable(); }); }) // 設定浮動活動資訊的可見度 function SetFloatEventInfoVisiable() { //console.log("isInView ? " + isScrolledIntoView($('.EventInfo'))); if (isScrolledIntoView($('.EventInfo'))) { $(".floatEventInfo").css("display", "none"); } else { $(".floatEventInfo").css("display", "block"); } } // 判斷元素是否在畫面中 function isScrolledIntoView(elem) { // 現在的頁面 ( 顯示body(content)的部分 ) 的最上方 ( 最上方 + header navbar 的高 ) var docViewTop = $(window).scrollTop() + $("#main_header > .navbar").height(); // 現在的頁面 ( 顯示body(content)的部分 ) 的最下方 ( 最上方 + 一個畫面能顯示多少 - Footer 的高 ) var docViewBottom = docViewTop + $(window).height() - $("#main_footer").height(); // 元素頂部的位置 var elemTop = $(elem).offset().top; // 元素底部的位置 var elemBottom = elemTop + $(elem).height(); // 若 elemTop 或是 eleBottom 在 docTop ~ dovBottom 的範圍中,就算存在於畫面中 return (docViewTop <= elemTop && elemTop <= docViewBottom) || (docViewTop <= elemBottom && elemBottom <= docViewBottom) } </script> ``` ## Html 準備一個 Float 用的區塊,先隱藏起來 ``` <!-- 浮動活動資訊 --> <div class="bg-white p-2 floatEventInfo" style="display:none"> 一些資訊 .... </div> <!-- 非浮動活動資訊 ( 原本就在畫面上的 ) --> <div class="bg-white p-2 EventInfo"> 一些資訊 .... </div> ``` ## Style 為 Float 區塊加上陰影 ``` <style> .floatEventInfo { // 設為浮動在最上方 ( navbar 選單下 ) position: fixed; top: 56px; // 顯示在最上層 ( 但不能比 navbar 還高 ) z-index: 50; // 寬度自定 ( 此為和原本區塊盡量一致 ) width: calc(100vw - 30px); //為 Float 區塊加上陰影 box-shadow: rgb(204, 204, 204) 3px 3px 6px 3px; } </style> ```
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.