Создание вертикальной адаптивной навигационной панели с использованием javascript - PullRequest
2 голосов
/ 30 апреля 2020

В настоящее время я пытаюсь создать веб-сайт с нуля, поскольку у меня есть время попрактиковаться.

Пока у меня есть работающая панель навигации (та, которая на самом деле не переводит вас в другую). страниц пока нет, но на самом деле работает).

Я решил сделать эту панель навигации отзывчивой, так как она довольно большая. Я дал вариант вертикальной черты одним нажатием кнопки. Отметим, что кнопка доступна пользователю только тогда, когда ширина браузера меньше 900 пикселей.

Моя текущая проблема заключается в том, что при нажатии кнопки ничего не отображается. Я убедился, что javascript для кнопки работает, методом проб и ошибок, но все еще не повезло.

Я новичок в этом, так что извините, если моя ошибка глупа, но любая помощь будет принята с благодарностью .

Чтобы дать представление о том, чего я пытаюсь достичь, вот ссылка, которую я использовал в качестве руководства: https://www.w3schools.com/howto/howto_js_topnav_responsive.asp

Если проблема заключается в связи с тем, что я использую тег «неупорядоченный список» для выравнивания моей навигационной панели по правому краю, а моего lo go по левому краю, тогда любой альтернативный способ также приветствуется!

Спасибо.

Ps игнорируйте названия каждого раздела в навигации, сейчас я просто заполняю пробелы ^^

body{
	background-color: grey;
	margin:0;
}

/*----------------------NAVIGATION BAR----------------------*/
.nav-container{
	background-color: white;
	float: right;
	height: 80px;
	position: absolute;
	width: 100%;
	margin-top: 0;
}
#nav-menu{
	float:right;
	padding: 13px 13px;	
}

#nav-menu li{
	display:inline-block;
	font-size: 20px;
	padding: 10px 12px;
	text-align: center;
}
#nav-menu li a:not(.nav-active){	
	color: black;	
	text-decoration: none;
}
#nav-menu li a:hover:not(#logo){
	color: #0aaaa0;	
}
.nav-active {
	color: #0aaaa0;
	text-decoration: none;
}

/* LOGO */

#logo{
	padding: 0px 13px;
	float: left;
	font-size: 27px;
}
/* Hide the link that should open and close the topnav on small screens */
#nav-menu .icon {
  display: none;
}

/* When the screen is less than 600 pixels wide, hide all links, except for the first one ("Home"). Show the link that contains should open and close the topnav (.icon) */
@media screen and (max-width: 900px) {
  #nav-menu li a:not(.icon) {display: none;}
  #nav-menu li a.icon {
    float: right;
    display: block;
  }
}

/* The "responsive" class is added to the topnav with JavaScript when the user clicks on the icon. This class makes the topnav look good on small screens (display the links vertically instead of horizontally) */
@media screen and (max-width: 900px) {
  .nav-bar.responsive {position: relative;}
  .nav-bar.responsive li a.icon{
   position: relative;
    right: 0;
    top: 0;
  }
  .nav-bar.responsive li a{
	float: none;
	display: block;
  text-align: left;
	position: relative;
  }
}
<!DOCTYPE html>

<html>

<head>
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta charset="UTF-8">
	<link rel="stylesheet" href="practice.css">
	<!-- Load an icon library to show a hamburger menu (bars) on small screens -->
	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

</head>

<body>
<!-- NAVIGATION BAR -->
<div  class="nav-container">
	<ul id="logo">Dellion</ul>
	<ul class="nav-bar" id="nav-menu">		
		<li><a class="nav-active" href="index.html">Home</a></li>
		<li><a href="cars.html">Cars</a></li>
		<li><a href="charities.html">Charities</a></li>
		<li><a href="pros.html">Pros</a></li>
		<li><a href="pros.html">Games</a></li>
		<li><a href="auctions.html">Auctions</a></li>	
		<li><a href="support.html">Support</a></li>
		<li><a href="javascript:void(0);" class="icon" onclick="myFunction()">
		<i class="fa fa-bars"></i></a></li>
	</ul>
</div>

<script>
function myFunction() {
  var x = document.getElementById("nav-menu");
  if (x.className === "nav-bar") {
    x.className += " responsive";
  } else {
    x.className = "nav-bar";
  }
}
</script>
</body>
</html>

Ответы [ 4 ]

2 голосов
/ 30 апреля 2020

Существует очень простой способ:

.nav-container{
    background-color: white;
    /* float: right; */
    height: 80px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    width: 100%;
    margin-top: 0;
}
#nav-menu{
    /* float:right; */
    /* padding: 13px 13px;   */
}

#nav-menu li{
    display:inline-block;
    font-size: 20px;
    padding: 10px 12px;
    text-align: center;
}
#nav-menu li a:not(.nav-active){    
    color: black;   
    text-decoration: none;
}
#nav-menu li a:hover:not(#logo){
    color: #0aaaa0; 
}
.nav-active {
    color: #0aaaa0;
    text-decoration: none;
}

/* LOGO */

#logo{
    padding: 0px 13px;
    /* float: left; */
    font-size: 27px;
}
/* Hide the link that should open and close the topnav on small screens */
#nav-menu .icon {
  display: none;
}

И я рекомендовал вам прочитать эту полезную статью о css Flexbox.

2 голосов
/ 30 апреля 2020

Упростите макет, используя flexbox

function myFunction() {
  var x = document.getElementById("nav-menu");
  if (x.className === "nav-bar") {
    x.className += " responsive";
  } else {
    x.className = "nav-bar";
  }
}
body {
  background-color: grey;
  margin: 0;
}

.nav-container {
  display: flex;
  background-color: white;
  min-height: 80px;
  width: 100%;
  align-items: center;
  flex-wrap: wrap;
}

#logo {
  font-size: 27px;
  padding: 0 13px;
  height: 80px;
  line-height: 80px;
}

.nav-bar {
  flex-direction: row;
}

.nav-bar li {
  list-style: none;
}

.nav-bar a {
  color: #000;
  font-size: 20px;
  padding: 10px 12px;
  text-decoration: none;
}

.nav-links {
  margin-left: auto;
  padding-right: 20px;
  display: flex;
  flex: 1;
  justify-content: flex-end;
}

.hamburger .icon {
  /* remove the styling, this code is for illustration purpose only*/
  height: 40px;
  width: 40px;
  background: grey;
  border: 1px solid #000;
}

.nav-bar,
.hamburger .icon {
  display: none;
}

.hamburger {
  position: absolute;
  right: 20px;
  top: 20px;
}

@media screen and (min-width: 901px) {
  .nav-bar,
  .nav-bar.responsive {
    display: flex;
    align-items: center;
  }
}

@media screen and (max-width: 900px) {
  .hamburger .icon {
    display: block
  }
  .nav-bar.responsive {
    display: flex;
    flex-direction: column;
    width: 100%;
    margin: 0;
    padding: 0;
  }
  .nav-links {
    flex-basis: 100%;
    margin: 0;
    padding: 0;
  }
  .nav-bar li {
    padding: 10px 0;
  }
}
<div class="nav-container">
  <div id="logo">Dellion</div>
  <div class="nav-links">
    <ul class="nav-bar" id="nav-menu">
      <li><a class="nav-active" href="index.html">Home</a></li>
      <li><a href="cars.html">Cars</a></li>
      <li><a href="charities.html">Charities</a></li>
      <li><a href="pros.html">Pros</a></li>
      <li><a href="pros.html">Games</a></li>
      <li><a href="auctions.html">Auctions</a></li>
      <li><a href="support.html">Support</a></li>
    </ul>
    <div class="hamburger">
      <a href="javascript:void(0);" class="icon" onclick="myFunction()">
        <i class="fa fa-bars"></i></a>
    </div>
  </div>
</div>
0 голосов
/ 30 апреля 2020

Вы можете просто сделать это с css

flex-direction: column;
0 голосов
/ 30 апреля 2020

Я думаю, что часть вашей проблемы:

Javascript:

 if (x.className === "nav-bar") {
    x.className += " responsive"; //add space after quotation mark, otherwise class is added adjacent
  } else {
    x.className = "nav-bar";
  }

Css:

.nav-bar.responsive li a{
    float: none;
    display: block !important; /* I think this needs to be crushed with important */
  text-align: left;
    /* position: relative; you don't need it */
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...