Introducing streamlit-scroll-navigation: flexible scroll-based navigation for Streamlit
Hey everyone, I’m excited to introduce streamlit-scroll-navigation, a customizable scroll-based navigation component for Streamlit apps.
I love the aesthetic of scrollable single-page applications (SPA). They elegantly present multiple sections of content without requiring users to navigate across different pages. With streamlit-scroll-navigation
, you can easily create SPA pages in Streamlit. This component enables smooth scroll-based navigation for portfolios, data stories, or other apps that present multiple sections on the same page.
Demo:
Features
- Smooth Animations: Scrolling to anchors on the page feels fluid and seamless.
- Anchor tracking: As the user scrolls, the active anchor automatically updates to the nearest visible anchor.
- Configurable Icons: Customize Bootstrap icons for each navigation option and the menu title to give your app a personal touch.
- Configurable Styles: Edit CSS attributes with the
override_styles
parameter for additional customization. - Styled with Bootstrap: The component comes styled with Bootstrap for a sleek and responsive design.
Installation
To install, simply run:
pip install streamlit-scroll-navigation
Parameters
scroll_navbar() accepts the following parameters:
anchor_ids
(required): The list of anchor IDs representing the sections or points to navigate.menu_title
(optional, default='Menu'
): The title of the scroll navigation menu.icons
(optional, default=[]
): A list of Bootstrap icon names corresponding to each navigation option.default_index
(optional, default=0
): The index of the initially selected item.orientation
(optional, default='vertical'
): The orientation of the navigation (either'vertical'
or'horizontal'
).
The function returns the currently selected anchor’s ID.
Example
This examples contains 2 scroll navigation bars with different orientations. Explore example.py for more use cases.
# Create a dummy streamlit page
import streamlit as st
from streamlit_scroll_navigation import scroll_navbar
# Anchor IDs and icons
anchor_ids = ["About", "Features", "Settings", "Pricing", "Contact"]
anchor_icons = ["info-circle", "lightbulb", "gear", "tag", "envelope"]
# 1. as sidebar menu
with st.sidebar:
st.subheader("Example 1")
scroll_navbar(
anchor_ids,
anchor_labels=None, # Use anchor_ids as labels
anchor_icons=anchor_icons)
# 2. horizontal menu
st.subheader("Example 2")
scroll_navbar(
anchor_ids,
key = "navbar2",
anchor_icons=anchor_icons,
orientation="horizontal")
# Dummy page setup
for anchor_id in anchor_ids:
st.subheader(anchor_id,anchor=anchor_id)
st.write("content " * 100)
Give it a try and let me know your feedback, questions, or if you want to contribute!