Search code examples
javascripthtmlcssemotion

Position ::after arrow on element


i made this and I'm not able to position the arrow to the left of the element:

enter image description here

but i want this:

enter image description here

my css code:

export const ClosedStyled = styled.ul<DropDown>`
  ${ListItem}:hover & {
    max-width: 400px !important;
    max-height: 400px !important;
  }
  max-height: 0px !important;
  overflow: hidden;
  -webkit-transition: all 0.2s;
  -moz-transition: all 0.2s;
  -ms-transition: all 0.2s;
  -o-transition: all 0.2s;
  transition: all 0.2s;
  list-style-type: none;
  margin: 0;
  padding: 0;
  top: 0;
  left: 100%;
  font-weight: 400;
  position: absolute;
  padding: 0px;
  z-index: 2;
  background: ${shade(0.4, '#3c8dbc')};
  border-top-right-radius: 5px;
  border-bottom-right-radius: 5px;
  :before {
    content: '';
   position: absolute;
   left: 0px;
   top: 0px;
   width: 0;
   height: 0;
   border-left: 20px solid transparent;
   border-right: 20px solid transparent;
   border-top: 20px solid #000;
   clear: both;
`;

I'm using css in JS with emotion JS, but the problem is basically just CSS I used ::after and border, but I don't know how I could turn it around like in the example photo

example:

https://codesandbox.io/s/cranky-hamilton-oy47v?file=/src/styled.js


Solution

  • Ok so, I got it working but there is few things:

    • ClosedStyled, should have display property manipulated instead of width and height, once the user hover it should be display:block, otherwise it should be display:none.
    • ClosedStyled overflow is the root cause for the issue, just remove it and you will be able to see the arrow

    Here is a codesandbox

    or you can see the changed code here:

    import styled from "@emotion/styled/macro";
    import { shade } from "polished";
    import { css } from "@emotion/core";
    // Global Containers
    const Container = styled.div`
      height: 100%;
    `;
    
    const Main = styled.div`
      display: flex;
      height: calc(100% - 55px);
      position: relative;
      z-index: 0;
    `;
    // Global Containers
    export const Global = {
      Container,
      Main
    };
    // header Nav
    export const NavBar = styled.div`
      height: 55px;
      background: #3c8dbc;
      display: flex;
      box-shadow: 0 2px 2px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(0, 0, 0, 0.05);
      position: relative;
      z-index: 1;
    `;
    
    export const LogoSide = styled.div`
      display: flex;
      background: red;
      justify-content: center;
      background: #3c8dbc;
      padding: 10px;
      width: 100%;
      max-width: 250px;
      height: 55px;
      img {
        height: 35px;
        transition: all 0.2s ease;
      }
    `;
    // header Nav
    export const Header = {
      NavBar,
      LogoSide
    };
    // SideBar
    const SideBodyWrap = styled.nav`
      height: 100%;
      max-width: 250px;
      width: 100%;
      color: #009688;
      background: #3c8dbc;
      transition: all 0.2s ease;
      ::-webkit-scrollbar {
        width: 5px;
      }
    
      ::-webkit-scrollbar-track {
        -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
      }
    
      ::-webkit-scrollbar-thumb {
        background: rgba(255, 0, 0, 0.8);
        -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5);
      }
      ::-webkit-scrollbar-thumb:window-inactive {
        background: rgba(255, 0, 0, 0.4);
      }
    `;
    
    const MenuList = styled.ul`
      font-family: "Ubuntu";
      font-size: 14px;
      font-weight: 300;
      text-decoration: none;
      color: #fff;
      padding-top: 10px;
    `;
    
    export const ListItem = styled.li`
      display: flex;
      flex-direction: column;
      justify-content: center;
      cursor: pointer;
      position: relative;
    `;
    
    export const ListWrap = styled.div`
      padding: 12px 20px 12px 20px;
      display: flex;
      transition: all 0.5s cubic-bezier(0, 1, 0, 1);
      justify-content: center;
      align-items: center;
      a {
        display: flex;
        align-items: center;
        svg {
          margin-right: 15px;
          transition: all 0.5s cubic-bezier(0, 1, 0, 1);
        }
      }
      & .icon-li {
        margin-right: 10px;
      }
      & .down-up_svg,
      .li-name {
        display: none;
      }
    `;
    export const ClosedStyled = styled.ul`
      ${ListItem}:hover & {
        display: block;
      }
      display: none;
      max-height: 400px !important;
      max-width: 400px !important;
      -webkit-transition: all 0.2s;
      -moz-transition: all 0.2s;
      -ms-transition: all 0.2s;
      -o-transition: all 0.2s;
      transition: all 0.2s;
      list-style-type: none;
      margin: 0;
      padding: 0;
      top: 0;
      left: 100%;
      font-weight: 400;
      position: absolute;
      padding: 0px;
      z-index: 2;
      background: ${shade(0.4, "#3c8dbc")};
      border-top-right-radius: 5px;
      border-bottom-right-radius: 5px;
      :after {
        content: "";
        position: absolute;
        left: -15px;
        top: 8px;
        width: 0;
        overflow: hidden;
        height: 0;
        border-top: 15px solid transparent;
        border-bottom: 15px solid transparent;
        border-right: 15px solid blue;
        clear: both;
        z-index: 11;
      }
      & .li-closed {
        white-space: nowrap;
        padding: 10px 20px;
        :hover > svg {
          color: orange;
        }
        svg {
          margin-right: 10px;
        }
      }
      a {
        font-family: "Ubuntu";
        font-size: 14px;
        font-weight: 300;
        text-decoration: none;
        color: #8aa4af;
      }
    `;
    
    const DashMenu = styled.div`
      display: flex;
      flex-direction: column;
    `;
    
    export const SideBar = {
      SideBodyWrap,
      DashMenu,
      ClosedStyled,
      ListItem,
      ListWrap,
      MenuList
    };
    // SideBar
    
    export const Content = styled.div`
      height: 100%;
      width: 100%;
      background: #eee;
    `;