stick top
Last updated
Was this helpful?
Last updated
Was this helpful?
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<title>4_3_1_Scroll_to_fix_js_simple</title>
<style>
.fixed {
position: fixed;
top: 0;
}
</style>
</head>
<body>
<div style="height:500px;background-color: dodgerblue;"></div>
<div id="tofix1" style="height:100px;background-color: coral;z-index:99; width:100%"></div>
<div style="height:500px;background-color: lightgrey;"></div>
<div style="height:500px;background-color: white;">
<svg id="tofix2" width="250" height="250" style="z-index:100;">
<circle cx="100" cy="100" r="100" fill="coral" />
</svg>
</div>
<div style="height:100vh;background-color: grey;"></div>
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</body></html>
<script>
var tofix1_pos = $("#tofix1").offset().top;
var tofix2_pos = $("#tofix2").offset().top;
$(window).scroll(function() {
var current_pos = $(window).scrollTop();
if (current_pos > tofix1_pos) {
$("#tofix1").addClass("fixed");
} else {
$("#tofix1").removeClass("fixed");
}
if (current_pos > tofix2_pos) {
$("#tofix2").addClass("fixed");
} else {
$("#tofix2").removeClass("fixed");
}
});
</script>
Question: 從上面的最簡範例改過來,我會把我的HTML Code會改成類似這個樣子。我要問的問題是,為何我要把#tofix1
和#tofix2
各自包在<div>
中?
Answer: 原因是,如果我用jquery把<div>
fixed下來,那她的空間就會被釋放出來,此時,底下所有的<div>都會往上跑,所以會有頁面的跳動。因此,我會把要被stick-top的<div>
包在另外一個<div>
中。這樣,我就可以用外部的<div>來保留要被fixed
的物件的空間,而避免後面的<div>
因為前面的<div>
被fixed而空間釋放之故往前彈。
<body>
<div style="height:500px;background-color: dodgerblue;"></div>
<div style="height:100px">
<div id="tofix1" style="height:100px;background-color: coral;z-index:99; width:100%"></div>
</div>
<div style="height:500px;background-color: lightgrey;"></div>
<div style="height:500px;background-color: white;">
<div class="row">
<div class="col-6 offset-6">
<svg id="tofix2" width="250" height="250" style="z-index:100;">
<circle cx="100" cy="100" r="100" fill="coral" />
</svg>
</div>
</div>
</div>
<div class="container-fluid" style="height:100vh;background-color: grey;"></div>
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</body>