Adding Infinite Scroll and Full Posts to the Homepage of a Blog in Blogger
Someone asked how I added infinite scroll to a Blogger template - one of the latest free themes shared by Google years ago.
This is the code to add before the </body> tag.
<!-- Infinite Scroll for Blogger starts -->
<b:if cond='data:view.isHomepage'>
<style>
.status-msg-wrap { display:none !important; }
#load-more-btn {
display: block;
margin: 30px auto;
padding: 12px 25px;
font-size: 14px;
font-family: inherit;
border: 1px solid #222;
background: #222;
color: #fff;
cursor: pointer;
transition: all 0.3s ease;
}
#load-more-btn:hover { background: #444; }
#infinite-loader {
text-align: center;
padding: 20px;
display: none;
}
#infinite-loader img { width: 32px; }
</style>
<script>
//<![CDATA[
(function() {
var nextPage = "";
var loading = false;
var containerSelector = "div.blog-posts";
var observer;
var button;
var loader;
var scriptStrip = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
function init() {
var pager = document.querySelector("a.blog-pager-older-link");
if (!pager) return;
nextPage = pager.href;
var blogPager = document.getElementById("blog-pager");
if (blogPager) blogPager.style.display = "none";
// Create Load More Button
button = document.createElement("button");
button.id = "load-more-btn";
button.innerText = "Load More Posts";
// Create Loader Image
loader = document.createElement("div");
loader.id = "infinite-loader";
loader.innerHTML = '<img src="https://blogger.googleusercontent.com/img/a/AVvXsEj1QlHkHewAivRf0n5S6aMiyGVzrw_9Bd0JNkynJpr3xI0J9jpRzhdsIK59OvJVtMIc9yfKZAJ6K6HWMu0Z-meBdoAnnjUd3EfK0nWXBMgaEzHnTfzu0Dj8jQVQvzFbLFFaJZbLuN_Yei3QtCVrae7ir2onLLmWErre2TpIs8q3bs9AA5JpYB3Ldq8Xgg=w640-h640" alt="Loading...">';
if (blogPager && blogPager.parentNode) {
blogPager.parentNode.insertBefore(button, blogPager);
blogPager.parentNode.insertBefore(loader, blogPager);
}
button.addEventListener("click", function() {
loadPosts();
startObserver();
});
}
function startObserver() {
observer = new IntersectionObserver(function(entries) {
if (entries[0].isIntersecting && !loading) {
loadPosts();
}
}, { rootMargin: "400px" });
observer.observe(button);
}
function loadPosts() {
if (loading || !nextPage) return;
loading = true;
button.style.display = "none";
loader.style.display = "block";
fetch(nextPage)
.then(res => res.text())
.then(function(htmlText) {
var cleanHtml = htmlText.replace(scriptStrip, "");
var parser = new DOMParser();
var doc = parser.parseFromString(cleanHtml, "text/html");
var newPosts = doc.querySelectorAll(containerSelector + " > *");
var currentContainer = document.querySelector(containerSelector);
newPosts.forEach(function(post) {
currentContainer.appendChild(post);
});
// Crucial for Soho: Tell the theme to recalculate layout
window.dispatchEvent(new Event('resize'));
var newPager = doc.querySelector("a.blog-pager-older-link");
if (newPager) {
nextPage = newPager.href;
loader.style.display = "none";
button.style.display = "block";
} else {
nextPage = "";
loader.style.display = "block";
loader.innerHTML = "<span>No more posts to show</span>";
if(observer) observer.disconnect();
}
loading = false;
})
.catch(err => {
console.error("Infinite Scroll Error:", err);
loading = false;
});
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();
//]]>
</script>
</b:if>
<!-- Infinite Scroll for Blogger ends -->
The code works fine with a Soho theme modified (strm.xml) - I didn't test the other themes.
Note that infinite scrolls can have detrimental effects for SEO. But many readers love it and that's what really matters - I don't care anymore about SEO. LOL.
Extra: Do you also want to show full posts in homepage?
This mod implies to edit the XML code of the themes. Process explained in the following links:
- For Notable.
- For Contempo.
- For Essential Light in this forum thread.
I hope this helps.