Sidebar open at the place I click?

Asked

Viewed 41 times

0

Hi, I’m trying to do a sidebar on a button, and I need this sidebar to appear where I click the button. But for some reason, this sidebar is climbing to the top of the screen.

Follows the code:

  function openSlideMenu(){
    document.getElementById('menu').style.width = '250px';
    document.getElementById('content').style.marginRight = '250px';
  }
  function closeSlideMenu(){
    document.getElementById('menu').style.width = '0';
    document.getElementById('content').style.marginRight = '0';
  }
@import url('https://fonts.googleapis.com/css?family=Alegreya+Sans:800');

body {
	font-family: 'Alegreya Sans', sans-serif;
	overflow-x: hidden;
}
.nav {
	height: 100%;
	width: 0;
	position: fixed;
	z-index: 1;
	top: 0;
	right: 0;
	background-color: #111;
	opacity: .9;
	overflow-x: hidden;
	padding-top: 60px;
	transition: 0.7s;
}
.nav a {
	display: block;
	padding: 20px 30px;
	font-size: 25px;
	text-decoration: none;
	color: #ccc;
}
.nav a:hover {
	color: #fff;
	transition: 0.4s;
}
.nav .close {
	position: absolute;
	top: 0;
	right: 22px;
	margin-left: 50px;
	font-size: 30px
}
.slide a {
	color: #000;
	font-size: 36px;
}
#content {
	padding: 20px;
	transition: margin-left 0.7s;
	overflow: hidden;
	width: 100%;
}
<!DOCTYPE html>
<html>
<head>
  <title>Responsive Animated Sidebar Menu</title>
  <script defer src="https://use.fontawesome.com/releases/v5.0.7/js/all.js"></script>
  <link rel="stylesheet" href="style.css">
</head>
<body>

  <div id="content">
    <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Explicabo aut exercitationem ratione perferendis provident quaerat, vitae magni soluta molestias, saepe at pariatur inventore minima distinctio neque! Ut ab facilis tempora.
    Distinctio doloremque aperiam minima laudantium soluta alias quam quod impedit voluptatibus tenetur, voluptatum reiciendis corrupti quibusdam neque molestiae odio quae maxime perspiciatis voluptates ipsum fuga illum nulla eaque provident? Repellendus.
    Asperiores dolore saepe natus totam placeat provident est molestias nemo, perspiciatis quis! Rerum adipisci, sint, nam eaque rem nemo et, minima voluptas quas illum dolor ipsam ullam beatae atque veritatis.
    Cupiditate harum voluptate vero obcaecati iure odit aspernatur officia qui ratione quos quasi fugit minima saepe quia nulla, debitis deleniti dolorum vitae excepturi libero at dolore cumque. Nulla, quos provident.
    Minima reprehenderit ullam ea sit velit mollitia culpa iste eum consequatur corrupti est odit, at, harum aliquam eius, voluptatem ad? Nemo veritatis consectetur fugit laudantium tempore quod nobis, nihil fugiat.
    Non labore, minima quidem magni quas et architecto. Beatae asperiores ex odit quod quibusdam fugiat excepturi minus expedita cumque veniam ipsa hic velit, voluptatum dicta nobis accusamus. At, ex expedita.
    Repellat atque numquam eveniet optio, velit praesentium suscipit ut placeat enim quos, veritatis facilis soluta dolores officia dolore sapiente expedita adipisci. Eos rem accusamus aliquam odit saepe iste expedita veritatis?
    Voluptates ipsam corrupti quam assumenda natus necessitatibus inventore quasi velit maiores, iure voluptatibus, debitis quibusdam in tempora? Quis, maiores nemo iusto suscipit repudiandae eum in nesciunt asperiores molestiae eaque eius!
    Est, tempora eos tempore nihil voluptatum alias in perferendis assumenda ipsum amet odit minima. Eius totam quia atque dolor quos minima aut perspiciatis aspernatur maxime, consequuntur dolorem, tenetur accusantium unde?
    Et obcaecati expedita repellendus iste ipsum pariatur fugit assumenda tempore esse mollitia, tenetur commodi at ut provident accusamus sed vel quos rerum aliquid architecto quis. Ut exercitationem officiis temporibus error?
    Perspiciatis amet itaque minima! Fuga delectus beatae dicta. Culpa dolorum dolores in voluptatibus delectus adipisci quisquam atque eius modi blanditiis dolore quibusdam quo aliquid dignissimos qui quas, repellat temporibus soluta?
    Cum quibusdam porro debitis dolorem voluptate obcaecati ipsa cumque, voluptatum fugit culpa. Modi consequatur hic voluptatibus fuga aliquid et voluptas dolores laudantium quaerat recusandae culpa corporis, corrupti iure porro deserunt.
    Doloremque sit iusto quam perspiciatis nihil dolorum, adipisci iure illo architecto deserunt at possimus. Iusto quos delectus odio impedit quidem, sint architecto corrupti non animi, perspiciatis reprehenderit aperiam enim laborum?
    Explicabo, labore, cupiditate non dolor consequuntur deleniti similique iusto dicta, illum quas aliquam suscipit voluptates magnam provident deserunt ratione quibusdam enim mollitia porro voluptatum praesentium fuga! Minima exercitationem magni saepe.
    Fugit unde consequatur iste tenetur veritatis quas facilis corporis quisquam aspernatur. Beatae, debitis ut minus aspernatur eum similique repellendus excepturi veritatis aperiam dicta numquam velit totam officiis soluta vitae nisi?
    Veritatis reprehenderit rem, voluptate sint provident vel ullam, enim alias maxime in laborum sunt ad quam tempora perferendis? Doloribus totam deleniti aut blanditiis suscipit corporis dignissimos minima, recusandae dicta et!
    Perspiciatis excepturi a sequi reprehenderit totam officia mollitia voluptates provident obcaecati explicabo similique quas nesciunt molestiae quasi, perferendis neque repellat dolores ea sint praesentium, officiis velit cum recusandae at. Tempora.
    Corporis omnis commodi aut soluta eum provident laboriosam velit rem voluptatum aperiam suscipit eveniet libero voluptatem eos dolores ut iste amet, tempora molestiae vero. Minus laborum iure corporis. Debitis, voluptatum.
    Facilis, dolorem! Praesentium exercitationem adipisci odit quod possimus mollitia nemo consequatur ducimus minima repellendus. Doloremque laboriosam, facilis quibusdam deserunt illo mollitia, fuga aperiam repudiandae eaque quis voluptatum dolor earum cum.
    Expedita nam excepturi facere repellat tempora reprehenderit eius cupiditate, sequi dolore nostrum perspiciatis maxime iure assumenda aliquid id nisi ab reiciendis aspernatur quisquam repudiandae adipisci. Temporibus animi voluptates dolor neque.</p>

    <div style="width: 200px; height: 700px; background-color: red; margin-bottom: 20px;"></div>

    <span class="slide">
      <a href="#" onclick="openSlideMenu()">
        <i class="fas fa-bars"></i>
      </a>
    </span>

    <div id="menu" class="nav">
      <a href="#" class="close" onclick="closeSlideMenu()">
        <i class="fas fa-times"></i>
      </a>
      <a href="#">Home</a>
      <a href="#">About</a>
      <a href="#">Services</a>
      <a href="#">Portfolio</a>
      <a href="#">Contact</a>
    </div>

    

    

  </div>


</body>
</html>

You can also see what I’ve been doing on the codepen at: https://codepen.io/anon/pen/MNYNEJ

The sidebar goes up the moment I click the button below. I’d appreciate it if someone could help!

3 answers

0

on the line:

 <a href="#" onclick="openSlideMenu()">

remove: href="#"

getting:

<a onclick="openSlideMenu()">

the same in closeSlideMenu() not to go up when closing.

0


The point is that you click on a link, which itself already has an implicit navigation, in the case to #, so the page goes up to the top.

What you need to do is cancel this navigation, one of several possible ways to do it. I will show you two of them.

Returning false in the event Handler

One solution is to return the false value in the onclick, to prevent navigation from taking place.

Example:

function openSlideMenu(){
  document.getElementById('menu').style.width = '250px';
  document.getElementById('content').style.marginRight = '250px';
  return false; // <-- falso aqui
}

function closeSlideMenu(){
  document.getElementById('menu').style.width = '0';
  document.getElementById('content').style.marginRight = '0';
  return false; // <-- falso aqui
}
@import url('https://fonts.googleapis.com/css?family=Alegreya+Sans:800');

body {
	font-family: 'Alegreya Sans', sans-serif;
	overflow-x: hidden;
}
.nav {
	height: 100%;
	width: 0;
	position: fixed;
	z-index: 1;
	top: 0;
	right: 0;
	background-color: #111;
	opacity: .9;
	overflow-x: hidden;
	padding-top: 60px;
	transition: 0.7s;
}
.nav a {
	display: block;
	padding: 20px 30px;
	font-size: 25px;
	text-decoration: none;
	color: #ccc;
}
.nav a:hover {
	color: #fff;
	transition: 0.4s;
}
.nav .close {
	position: absolute;
	top: 0;
	right: 22px;
	margin-left: 50px;
	font-size: 30px
}
.slide a {
	color: #000;
	font-size: 36px;
}
#content {
	padding: 20px;
	transition: margin-left 0.7s;
	overflow: hidden;
	width: 100%;
}
<!DOCTYPE html>
<html>
<head>
  <title>Responsive Animated Sidebar Menu</title>
  <script defer src="https://use.fontawesome.com/releases/v5.0.7/js/all.js"></script>
  <link rel="stylesheet" href="style.css">
</head>
<body>

  <div id="content">
    <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Explicabo aut exercitationem ratione perferendis provident quaerat, vitae magni soluta molestias, saepe at pariatur inventore minima distinctio neque! Ut ab facilis tempora.
    Distinctio doloremque aperiam minima laudantium soluta alias quam quod impedit voluptatibus tenetur, voluptatum reiciendis corrupti quibusdam neque molestiae odio quae maxime perspiciatis voluptates ipsum fuga illum nulla eaque provident? Repellendus.
    Asperiores dolore saepe natus totam placeat provident est molestias nemo, perspiciatis quis! Rerum adipisci, sint, nam eaque rem nemo et, minima voluptas quas illum dolor ipsam ullam beatae atque veritatis.
    Cupiditate harum voluptate vero obcaecati iure odit aspernatur officia qui ratione quos quasi fugit minima saepe quia nulla, debitis deleniti dolorum vitae excepturi libero at dolore cumque. Nulla, quos provident.
    Minima reprehenderit ullam ea sit velit mollitia culpa iste eum consequatur corrupti est odit, at, harum aliquam eius, voluptatem ad? Nemo veritatis consectetur fugit laudantium tempore quod nobis, nihil fugiat.
    Non labore, minima quidem magni quas et architecto. Beatae asperiores ex odit quod quibusdam fugiat excepturi minus expedita cumque veniam ipsa hic velit, voluptatum dicta nobis accusamus. At, ex expedita.
    Repellat atque numquam eveniet optio, velit praesentium suscipit ut placeat enim quos, veritatis facilis soluta dolores officia dolore sapiente expedita adipisci. Eos rem accusamus aliquam odit saepe iste expedita veritatis?
    Voluptates ipsam corrupti quam assumenda natus necessitatibus inventore quasi velit maiores, iure voluptatibus, debitis quibusdam in tempora? Quis, maiores nemo iusto suscipit repudiandae eum in nesciunt asperiores molestiae eaque eius!
    Est, tempora eos tempore nihil voluptatum alias in perferendis assumenda ipsum amet odit minima. Eius totam quia atque dolor quos minima aut perspiciatis aspernatur maxime, consequuntur dolorem, tenetur accusantium unde?
    Et obcaecati expedita repellendus iste ipsum pariatur fugit assumenda tempore esse mollitia, tenetur commodi at ut provident accusamus sed vel quos rerum aliquid architecto quis. Ut exercitationem officiis temporibus error?
    Perspiciatis amet itaque minima! Fuga delectus beatae dicta. Culpa dolorum dolores in voluptatibus delectus adipisci quisquam atque eius modi blanditiis dolore quibusdam quo aliquid dignissimos qui quas, repellat temporibus soluta?
    Cum quibusdam porro debitis dolorem voluptate obcaecati ipsa cumque, voluptatum fugit culpa. Modi consequatur hic voluptatibus fuga aliquid et voluptas dolores laudantium quaerat recusandae culpa corporis, corrupti iure porro deserunt.
    Doloremque sit iusto quam perspiciatis nihil dolorum, adipisci iure illo architecto deserunt at possimus. Iusto quos delectus odio impedit quidem, sint architecto corrupti non animi, perspiciatis reprehenderit aperiam enim laborum?
    Explicabo, labore, cupiditate non dolor consequuntur deleniti similique iusto dicta, illum quas aliquam suscipit voluptates magnam provident deserunt ratione quibusdam enim mollitia porro voluptatum praesentium fuga! Minima exercitationem magni saepe.
    Fugit unde consequatur iste tenetur veritatis quas facilis corporis quisquam aspernatur. Beatae, debitis ut minus aspernatur eum similique repellendus excepturi veritatis aperiam dicta numquam velit totam officiis soluta vitae nisi?
    Veritatis reprehenderit rem, voluptate sint provident vel ullam, enim alias maxime in laborum sunt ad quam tempora perferendis? Doloribus totam deleniti aut blanditiis suscipit corporis dignissimos minima, recusandae dicta et!
    Perspiciatis excepturi a sequi reprehenderit totam officia mollitia voluptates provident obcaecati explicabo similique quas nesciunt molestiae quasi, perferendis neque repellat dolores ea sint praesentium, officiis velit cum recusandae at. Tempora.
    Corporis omnis commodi aut soluta eum provident laboriosam velit rem voluptatum aperiam suscipit eveniet libero voluptatem eos dolores ut iste amet, tempora molestiae vero. Minus laborum iure corporis. Debitis, voluptatum.
    Facilis, dolorem! Praesentium exercitationem adipisci odit quod possimus mollitia nemo consequatur ducimus minima repellendus. Doloremque laboriosam, facilis quibusdam deserunt illo mollitia, fuga aperiam repudiandae eaque quis voluptatum dolor earum cum.
    Expedita nam excepturi facere repellat tempora reprehenderit eius cupiditate, sequi dolore nostrum perspiciatis maxime iure assumenda aliquid id nisi ab reiciendis aspernatur quisquam repudiandae adipisci. Temporibus animi voluptates dolor neque.</p>

    <div style="width: 200px; height: 700px; background-color: red; margin-bottom: 20px;"></div>

    <span class="slide">
      <a href="#" onclick="return openSlideMenu()">
        <i class="fas fa-bars"></i>
      </a>
    </span>

    <div id="menu" class="nav">
      <a href="#" class="close" onclick="return closeSlideMenu()">
        <i class="fas fa-times"></i>
      </a>
      <a href="#">Home</a>
      <a href="#">About</a>
      <a href="#">Services</a>
      <a href="#">Portfolio</a>
      <a href="#">Contact</a>
    </div>
  </div>
</body>
</html>

I also had to change the onclick in html, with onclick="return openSlideMenu()".

Event.preventDefault

Another alternative to cancel the event is to use the method preventDefault about the object that represents the event, which boils down to something like:

event.preventDefault()

Example:

document.querySelector(".slide a").addEventListener("click", function(event){ //abrir
    event.preventDefault(); // <-- cancelar navegação
    document.getElementById('menu').style.width = '250px';
    document.getElementById('content').style.marginRight = '250px';
});

document.querySelector("#menu a").addEventListener("click", function(event){ //fechar
    event.preventDefault(); // <-- cancelar navegação
    document.getElementById('menu').style.width = '0';
    document.getElementById('content').style.marginRight = '0';
});
@import url('https://fonts.googleapis.com/css?family=Alegreya+Sans:800');

body {
	font-family: 'Alegreya Sans', sans-serif;
	overflow-x: hidden;
}
.nav {
	height: 100%;
	width: 0;
	position: fixed;
	z-index: 1;
	top: 0;
	right: 0;
	background-color: #111;
	opacity: .9;
	overflow-x: hidden;
	padding-top: 60px;
	transition: 0.7s;
}
.nav a {
	display: block;
	padding: 20px 30px;
	font-size: 25px;
	text-decoration: none;
	color: #ccc;
}
.nav a:hover {
	color: #fff;
	transition: 0.4s;
}
.nav .close {
	position: absolute;
	top: 0;
	right: 22px;
	margin-left: 50px;
	font-size: 30px
}
.slide a {
	color: #000;
	font-size: 36px;
}
#content {
	padding: 20px;
	transition: margin-left 0.7s;
	overflow: hidden;
	width: 100%;
}
<!DOCTYPE html>
<html>
<head>
  <title>Responsive Animated Sidebar Menu</title>
  <script defer src="https://use.fontawesome.com/releases/v5.0.7/js/all.js"></script>
  <link rel="stylesheet" href="style.css">
</head>
<body>

  <div id="content">
    <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Explicabo aut exercitationem ratione perferendis provident quaerat, vitae magni soluta molestias, saepe at pariatur inventore minima distinctio neque! Ut ab facilis tempora.
    Distinctio doloremque aperiam minima laudantium soluta alias quam quod impedit voluptatibus tenetur, voluptatum reiciendis corrupti quibusdam neque molestiae odio quae maxime perspiciatis voluptates ipsum fuga illum nulla eaque provident? Repellendus.
    Asperiores dolore saepe natus totam placeat provident est molestias nemo, perspiciatis quis! Rerum adipisci, sint, nam eaque rem nemo et, minima voluptas quas illum dolor ipsam ullam beatae atque veritatis.
    Cupiditate harum voluptate vero obcaecati iure odit aspernatur officia qui ratione quos quasi fugit minima saepe quia nulla, debitis deleniti dolorum vitae excepturi libero at dolore cumque. Nulla, quos provident.
    Minima reprehenderit ullam ea sit velit mollitia culpa iste eum consequatur corrupti est odit, at, harum aliquam eius, voluptatem ad? Nemo veritatis consectetur fugit laudantium tempore quod nobis, nihil fugiat.
    Non labore, minima quidem magni quas et architecto. Beatae asperiores ex odit quod quibusdam fugiat excepturi minus expedita cumque veniam ipsa hic velit, voluptatum dicta nobis accusamus. At, ex expedita.
    Repellat atque numquam eveniet optio, velit praesentium suscipit ut placeat enim quos, veritatis facilis soluta dolores officia dolore sapiente expedita adipisci. Eos rem accusamus aliquam odit saepe iste expedita veritatis?
    Voluptates ipsam corrupti quam assumenda natus necessitatibus inventore quasi velit maiores, iure voluptatibus, debitis quibusdam in tempora? Quis, maiores nemo iusto suscipit repudiandae eum in nesciunt asperiores molestiae eaque eius!
    Est, tempora eos tempore nihil voluptatum alias in perferendis assumenda ipsum amet odit minima. Eius totam quia atque dolor quos minima aut perspiciatis aspernatur maxime, consequuntur dolorem, tenetur accusantium unde?
    Et obcaecati expedita repellendus iste ipsum pariatur fugit assumenda tempore esse mollitia, tenetur commodi at ut provident accusamus sed vel quos rerum aliquid architecto quis. Ut exercitationem officiis temporibus error?
    Perspiciatis amet itaque minima! Fuga delectus beatae dicta. Culpa dolorum dolores in voluptatibus delectus adipisci quisquam atque eius modi blanditiis dolore quibusdam quo aliquid dignissimos qui quas, repellat temporibus soluta?
    Cum quibusdam porro debitis dolorem voluptate obcaecati ipsa cumque, voluptatum fugit culpa. Modi consequatur hic voluptatibus fuga aliquid et voluptas dolores laudantium quaerat recusandae culpa corporis, corrupti iure porro deserunt.
    Doloremque sit iusto quam perspiciatis nihil dolorum, adipisci iure illo architecto deserunt at possimus. Iusto quos delectus odio impedit quidem, sint architecto corrupti non animi, perspiciatis reprehenderit aperiam enim laborum?
    Explicabo, labore, cupiditate non dolor consequuntur deleniti similique iusto dicta, illum quas aliquam suscipit voluptates magnam provident deserunt ratione quibusdam enim mollitia porro voluptatum praesentium fuga! Minima exercitationem magni saepe.
    Fugit unde consequatur iste tenetur veritatis quas facilis corporis quisquam aspernatur. Beatae, debitis ut minus aspernatur eum similique repellendus excepturi veritatis aperiam dicta numquam velit totam officiis soluta vitae nisi?
    Veritatis reprehenderit rem, voluptate sint provident vel ullam, enim alias maxime in laborum sunt ad quam tempora perferendis? Doloribus totam deleniti aut blanditiis suscipit corporis dignissimos minima, recusandae dicta et!
    Perspiciatis excepturi a sequi reprehenderit totam officia mollitia voluptates provident obcaecati explicabo similique quas nesciunt molestiae quasi, perferendis neque repellat dolores ea sint praesentium, officiis velit cum recusandae at. Tempora.
    Corporis omnis commodi aut soluta eum provident laboriosam velit rem voluptatum aperiam suscipit eveniet libero voluptatem eos dolores ut iste amet, tempora molestiae vero. Minus laborum iure corporis. Debitis, voluptatum.
    Facilis, dolorem! Praesentium exercitationem adipisci odit quod possimus mollitia nemo consequatur ducimus minima repellendus. Doloremque laboriosam, facilis quibusdam deserunt illo mollitia, fuga aperiam repudiandae eaque quis voluptatum dolor earum cum.
    Expedita nam excepturi facere repellat tempora reprehenderit eius cupiditate, sequi dolore nostrum perspiciatis maxime iure assumenda aliquid id nisi ab reiciendis aspernatur quisquam repudiandae adipisci. Temporibus animi voluptates dolor neque.</p>

    <div style="width: 200px; height: 700px; background-color: red; margin-bottom: 20px;"></div>

    <span class="slide">
      <a href="#">
        <i class="fas fa-bars"></i>
      </a>
    </span>

    <div id="menu" class="nav">
      <a href="#" class="close">
        <i class="fas fa-times"></i>
      </a>
      <a href="#">Home</a>
      <a href="#">About</a>
      <a href="#">Services</a>
      <a href="#">Portfolio</a>
      <a href="#">Contact</a>
    </div>
  </div>
</body>
</html>

In this last way, I registered the click events with the function addEventListener, and in function I captured the event as parameter:

document.querySelector("#menu a").addEventListener("click", function(event){
//                                   ^^^^^^                      ^^^^^

And as the registration was all done from javascript, I removed the onclicks from html.

0

Just enter "javascript:void(0)" in the href of your link that fires the event to open the side menu.

<a href="javascript:void(0)" onclick="openSlideMenu()">...

Browser other questions tagged

You are not signed in. Login or sign up in order to post.