React Bootstrap docs

Offcanvas

Build hidden sidebars into your project for navigation, shopping carts, widgets etc.

Offcanvas components

import Offcanvas from 'react-bootstrap/Offcanvas'
import OffcanvasHeader from 'react-bootstrap/OffcanvasHeader'
import OffcanvasTitle from 'react-bootstrap/OffcanvasTitle'
import OffcanvasBody from 'react-bootstrap/OffcanvasBody'
import ListGroup from 'react-bootstrap/ListGroup'
import ListGroupItem from 'react-bootstrap/ListGroupItem'
import Button from 'react-bootstrap/Button'

export default function OffcanvasComponentsDemo() {
  return (
    <Offcanvas aria-labelledby="offcanvasLabel">
      <OffcanvasHeader closeButton>
        <OffcanvasTitle as="h5" id="offcanvasLabel">Menu</OffcanvasTitle>
      </OffcanvasHeader>
      <OffcanvasBody className="pt-0">
        <ListGroup as="nav" defaultActiveKey="#home" variant="borderless">
          <ListGroupItem action href="#home">
            Home
          </ListGroupItem>
          <ListGroupItem action href="#profile">
            User profile
          </ListGroupItem>
          <ListGroupItem action href="#services">
            Services
          </ListGroupItem>
          <ListGroupItem action href="#works">
            Our works
          </ListGroupItem>
          <ListGroupItem action href="#about">
            About
          </ListGroupItem>
          <ListGroupItem action href="#team">
            Our team
          </ListGroupItem>
        </ListGroup>
      </OffcanvasBody>
      <OffcanvasHeader className="border-top">
        <Button className="w-100 me-3">
          <i className="ci-log-in fs-base ms-n1 me-2"/>
          Login
        </Button>
        <Button variant="outline-primary" className="w-100">
          <i className="ci-user ms-n1 me-2"/>
          Sign up
        </Button>
      </OffcanvasHeader>
    </Offcanvas>
  )
}

Placement

'use client'

import { useOffcanvas, OffcanvasProvider } from '@/contexts/offcanvas-context'
import Offcanvas, { type OffcanvasPlacement } from 'react-bootstrap/Offcanvas'
import OffcanvasHeader from 'react-bootstrap/OffcanvasHeader'
import OffcanvasTitle from 'react-bootstrap/OffcanvasTitle'
import OffcanvasBody from 'react-bootstrap/OffcanvasBody'
import Button from 'react-bootstrap/Button'
import Stack from 'react-bootstrap/Stack'

export default function OffcanvasPlacementDemo() {

  const OffcanvasPlacement = ({ placement }: { placement: OffcanvasPlacement }) => {
    const { openOffcanvas, closeOffcanvas, isOpen } = useOffcanvas()

    return (
      <>
        <Button variant="outline-secondary me-1 mb-1" onClick={() => openOffcanvas(placement)}>
          Toggle {placement} offcanvas
        </Button>
        <Offcanvas
          show={isOpen(placement)}
          onHide={() => closeOffcanvas(placement)}
          placement={placement}
          aria-labelledby={`offcanvas-${placement}`}
        >
          <OffcanvasHeader closeButton className="border-bottom">
            <OffcanvasTitle as="h5" id={`offcanvas-${placement}`}>
              Offcanvas {placement}
            </OffcanvasTitle>
          </OffcanvasHeader>
          <OffcanvasBody>
            <p>
              Content for the offcanvas goes here. You can place just about any Bootstrap or Cartzilla component or
              custom elements here.
            </p>
          </OffcanvasBody>
        </Offcanvas>
      </>
    )
  }

  return (
    <OffcanvasProvider>
      <Stack direction="horizontal" gap={2} className="flex-wrap">
        {(['start', 'top', 'end', 'bottom'] as const).map((placement, index) => (
          <OffcanvasPlacement key={index} placement={placement} />
        ))}
      </Stack>
    </OffcanvasProvider>
  )
}

Backdrop and scrolling

'use client'

import { useOffcanvas, OffcanvasProvider } from '@/contexts/offcanvas-context'
import Offcanvas from 'react-bootstrap/Offcanvas'
import OffcanvasHeader from 'react-bootstrap/OffcanvasHeader'
import OffcanvasTitle from 'react-bootstrap/OffcanvasTitle'
import OffcanvasBody from 'react-bootstrap/OffcanvasBody'
import Button from 'react-bootstrap/Button'
import Stack from 'react-bootstrap/Stack'

export default function OffcanvasBackdropScrollingDemo() {

  const options = [
    {
      id: 'enabled-backdrop',
      buttonLabel: 'Enable backdrop (default)',
      scroll: false,
      backdrop: true,
    },
    {
      id: 'disabled-backdrop',
      buttonLabel: 'Disable backdrop',
      scroll: false,
      backdrop: false,
    },
    {
      id: 'enabled-scrolling',
      buttonLabel: 'Enable body scrolling',
      scroll: true,
      backdrop: false,
    },
    {
      id: 'enabled-backdrop-scrolling',
      buttonLabel: 'Enable both scrolling & backdrop',
      scroll: true,
      backdrop: true,
    },
    {
      id: 'static-backdrop',
      buttonLabel: 'Static backdrop',
      scroll: false,
      backdrop: 'static',
    },
  ]

  const OffcanvasBackdrop = ({ id, buttonLabel, ...props }: { id: string; buttonLabel: string }) => {
    const { openOffcanvas, closeOffcanvas, isOpen } = useOffcanvas()

    return (
      <>
        <Button variant="outline-secondary me-1 mb-1" onClick={() => openOffcanvas(id)}>
          {buttonLabel}
        </Button>
        <Offcanvas show={isOpen(id)} onHide={() => closeOffcanvas(id)} aria-labelledby={`offcanvas-${id}`} {...props}>
          <OffcanvasHeader closeButton className="border-bottom">
            <OffcanvasTitle as="h5" id={`offcanvas-${id}`}>
              Offcanvas
            </OffcanvasTitle>
          </OffcanvasHeader>
          <OffcanvasBody>
            <p>
              Content for the offcanvas goes here. You can place just about any Bootstrap or Cartzilla component or
              custom elements here.
            </p>
          </OffcanvasBody>
        </Offcanvas>
      </>
    )
  }

  return (
    <OffcanvasProvider>
      <Stack direction="horizontal" gap={2} className="flex-wrap">
        {options.map((props, index) => (
          <OffcanvasBackdrop key={index} {...props} />
        ))}
      </Stack>
    </OffcanvasProvider>
  )
}

Mobile menu (responsive)

import Link from 'next/link'
import Logo from '@/components/logo'
import Container from 'react-bootstrap/Container'
import Navbar from 'react-bootstrap/Navbar'
import NavbarToggle from 'react-bootstrap/NavbarToggle'
import NavbarOffcanvas from 'react-bootstrap/NavbarOffcanvas'
import OffcanvasHeader from 'react-bootstrap/OffcanvasHeader'
import OffcanvasTitle from 'react-bootstrap/OffcanvasTitle'
import OffcanvasBody from 'react-bootstrap/OffcanvasBody'
import Nav from 'react-bootstrap/Nav'
import NavItem from 'react-bootstrap/NavItem'
import NavLink from 'react-bootstrap/NavLink'

export default function NavbarOffcanvasDemo() {
  return (
    <Navbar as="header" expand="lg" className="bg-body sticky-top p-0">
      <Container className="py-3 px-4">
        <Logo href="#" className="fs-2">
          Cartzilla
        </Logo>
        <NavbarToggle aria-controls="navbarOffcanvas" />
        <NavbarOffcanvas id="navbarOffcanvas" placement="end" aria-labelledby="navbarOffcanvasLabel">
          <OffcanvasHeader closeButton className="w-100">
            <OffcanvasTitle id="navbarOffcanvasLabel">Menu</OffcanvasTitle>
          </OffcanvasHeader>
          <OffcanvasBody className="navbar align-items-start w-100 pt-0">
            <Nav as="ul" defaultActiveKey="#home" className="w-100 ms-lg-4">
              <NavItem as="li">
                <NavLink as={Link} href="#home">
                  Home
                </NavLink>
              </NavItem>
              <NavItem as="li">
                <NavLink as={Link} href="#services">
                  Services
                </NavLink>
              </NavItem>
              <NavItem as="li">
                <NavLink as={Link} href="#works">
                  Our works
                </NavLink>
              </NavItem>
              <NavItem as="li">
                <NavLink as={Link} href="#about">
                  About us
                </NavLink>
              </NavItem>
              <NavItem as="li">
                <NavLink as={Link} href="#contact">
                  Contact
                </NavLink>
              </NavItem>
            </Nav>
          </OffcanvasBody>
        </NavbarOffcanvas>
      </Container>
    </Navbar>
  )
}
Top