Search code examples
reactjscss-positionnavbarabsolutehamburger-menu

React Navbar Hamburger Icon unable to be Positioned Absolutely to Right


I'm making a React navbar with a hamburger menu icon, but I cannot figure out why my icon cannot be positioned absolutely to the right. Chrome dev tools indicates that both Top and Right properties (as well as any other margin/padding properties) are invalid property values on my hamburger icon (a div element), though my nav menu itself is able to be positioned absolutely to the right.

Navbar.jsx:

import React, { useState } from 'react';
import NavIcon from './NavIcon';
import NavMenu from './NavMenu';
import './navbar.css';

const Navbar = () => {
  const [isOpen, setIsOpen] = useState('false');

  return (
    <nav>
      <NavIcon isOpen={isOpen} setIsOpen={setIsOpen} />
      <NavMenu isOpen={isOpen} setIsOpen={setIsOpen} />
    </nav>
  );
};

export default Navbar;

NavMenu.jsx:

import React from 'react';
import NavItem from './NavItem';
import './navbar.css';

const NavMenu = ({ isOpen }) => {
  const slideIn = {
    transform: () => isOpen ? 'translateX(1)' : 'translateX(0)'
  };

  return (
    <ul className='Navbar__menu' isOpen={isOpen} style={slideIn}>
      <NavItem title='Home' />
      <NavItem title='About' />
      <NavItem title='Contact' />
    </ul>
  );
};

export default NavMenu;

NavIcon.jsx:

import React from 'react';
import './navbar.css';

const NavIcon = ({ isOpen, setIsOpen }) => {
  const toXTop = {
    transform: isOpen ? 'rotate(-45deg) translate(-5.25px, 6px)' : 'none'
  };
  const toXMid = {
    opacity: isOpen ? '0' : '1'
  };
  const toXbottom = {
    transform: isOpen ? 'rotate(45deg) translate(-5.25px, -6px)' : 'none'
  };

  return (
    <div className='Navbar__icon' isOpen={isOpen} onClick={() => setIsOpen(!isOpen)}>
      <div className='Navbar__icon--bars' style={toXTop} />
      <div className='Navbar__icon--bars' style={toXMid} />
      <div className='Navbar__icon--bars' style={toXbottom} />
    </div>
  );
};

export default NavIcon;

NavItem.jsx:

import React from 'react';
import './navbar.css';

const NavItem = ({ title }) => {
  return (
    <div className='Navbar__menu--item'>
      { title }
    </div>
  );
};

export default NavItem;

navbar.css:

.Navbar__icon {
  display: block;
  position: absolute;
  top: 5;
  right: 5;
  z-index: 1;
  cursor: pointer;
}    

.Navbar__icon--bars {
    width: 25px;
    height: 4px;
    background-color: #666;
    border-radius: 5px;
    margin: 4px 0;
    transition: 0.2s;
}    

.Navbar__menu {
  position: absolute;
  width: 15em;
  height: auto;
  right: 0;
  list-style: none;
  background-color: #000;
}

.Navbar__menu--item {
  font: 1rem Arial, sans-serif;
  color: #999;
  margin: 1em;
  cursor: pointer;
}

App.js just renders the Navbar.jsx component.

Any advice is appreciated. Thanks.


Solution

  • It seems that Top/Left/Right/Bottom property values in React do not support unitless numerical values, as this issue was resolved by adding px units to my values.