HTML / CSS - Как центрировать средний div из трех, независимо от окружающих div - PullRequest
0 голосов
/ 26 апреля 2018

Я занимаюсь разработкой небольшого сайта с выпадающими меню, используя только HTML / CSS. Само по себе это прекрасно работает. Раньше я использовал TD, но, эй, правила DIVS, так что теперь используйте DIV.

Я использую топ-меню. С левой стороны, есть несколько пунктов меню, и то же самое касается правой стороны меню. Пока все хорошо. Так как есть только два элемента div, один с плавающей левой и другой с плавающей правой, и оба имеют одинаковый CSS, применяемый внутри div-контейнера с шириной 100%, это выглядит как одна большая строка меню.

Проблема возникает, когда я хочу добавить маленький логотип точно в середине экрана, в той же строке меню. Поскольку левый и правый список параметров меню имеют разную ширину (правый список элементов меню несколько короче), логотип в середине перекошен вправо.

Что еще хуже, список пунктов меню является динамическим, в зависимости от того, на какой странице вы находитесь и вошли ли вы в систему.

То, чего я хочу достичь, это:

  • Содержит 3 части в строке меню: правое меню, средний логотип, левое меню
  • Средний логотип всегда должен быть точно в центре экрана
  • При изменении размера окна браузера размеры левой и правой частей автоматически изменяются по размеру экрана
  • средний логотип фиксированной ширины
  • При изменении размера, левое и правое меню могут изменять размер только до ширины, необходимой для самого длинного из правого или правого списка опций меню
  • Конечно, без упаковки!

Я пытался, но с треском провалился, главным образом потому, что мои знания недостаточны. Я предпочитаю использовать только HTML / CSS, а не JS / jquery

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

Это CSS для выпадающих меню (откуда-то взял его из интернета, а не из моего кода)

.navbarl {
  overflow: hidden;
  background-color: #333;
  }

.navbarl a {
  float: left;
  font-size: 12px;
  color: white;
  text-align: center;
  padding: 8px 10px;
  text-decoration: none;
  font-weight: normal;
  }

.dropdown {
  float: left;
  overflow: hidden;
  }

.dropdown .dropbtn {
  font-size: 12px;    
  border: none;
  outline: none;
  color: white;
  padding: 8px 10px;
  background-color: #333;
  font-family: inherit;
  margin: 0;
  }

.navbar a:hover, .dropdown:hover .dropbtn {
  background-color: #FFCC00;
  }

.dropdown-content {
  display: none;
  position: absolute;
  background-color: #f9f9f9;
  min-width: 160px;
  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
  z-index: 1;
  }

.dropdown-content a {
  float: none;
  color: black;
  padding: 8px 10px;
  text-decoration: none;
  display: block;
  text-align: left;
  }

.dropdown-content a:hover {
  background-color: #ddd;
  }

.dropdown:hover .dropdown-content {
  display: block;
  }

HTML обычно выглядит примерно так:

<div class="navbarl">
  <a href="#home">Home</a>
  <a href="#news">News</a>
  <div class="dropdown">
    <button class="dropbtn">Dropdown 
      <i class="fa fa-caret-down"></i>
    </button>
    <div class="dropdown-content">
      <a href="#">Link 1</a>
      <a href="#">Link 2</a>
      <a href="#">Link 3</a>
    </div>
  </div> 
</div>

Конечно, я изменил это для своего сайта и добавил второй блок для правого меню в строке меню.

Это то, что у меня сейчас есть для полной строки меню. Я знаю, что таблицы плохо подходят для форматирования, но я пробовал много разных вещей, и это копия моей последней попытки. Как я уже сказал, я все еще новичок в div и учусь избавляться от них: -)

<table class=menu>
  <tr>
    <td class="menu_left">
      <div class="navbarl">
        <a href="/index.php">Home</a>
        <a href="/somesubfolder/index.php">Menu option 2 wih a long name</a>
        <div class="dropdown">
          <button class="dropbtn">Cursus&#9660;</button>
          <div class="dropdown-content">
            <a href="/somesubfolder/a.php">Be</a>
            <a href="/somesubfolder/b.php">One</a>
          </div>[![enter image description here][1]][1]
        </div>
        <a href="/misc/login.php">Login</a>
      </div>
    </td>
    <td class="menu_middle">
      <a href="http://www.budgetbytes.nl"><img class="menu_sponsor" src="/images/sponsor.png" alt=""/></a>
    </td>
    <td class="menu_right">
      <div class="navbarl">
        <a href="/misc/nieuws.php">Nieuws</a>
      </div>
    </td>
  </tr>
</table>

Это пример (логотип, который я сделал невидимым, здесь нет необходимости быть коммерческим, это логотип наших спонсоров). Вы можете увидеть его перекос

enter image description here

1 Ответ

0 голосов
/ 26 апреля 2018

Здесь flexbox очень удобно. Я бы посоветовал вам не использовать table для макетов, поскольку он будет использоваться неправильно, так же как float предназначен только для размещения изображений на стороне текста.

Я сделал быстрый простой пример того, как с помощью flexbox можно создать меню навигации. Естественно, вы захотите создать мобильное меню с меньшей шириной области просмотра.

HTML

<header role="navigation">
    <div class="nav menu nav1">
        <a href="#" tabindex="0" class="menu-item">Home</a>
        <a href="#" tabindex="0" class="menu-item">News</a>
        <div class="menu-dropdown menu-item">
            <p tabindex="0">Dropdown</p>
            <a href="#" tabindex="0">Link 1</a>
            <a href="#" tabindex="0">Link 2</a>
            <a href="#" tabindex="0">Link 3</a>
        </div>
    </div>
    <div class="menu logo">
        <a href="#" tabindex="0" title="Click to go to homepage">
            <img src="http://media.gettyimages.com/photos/blue-eyed-husky-puppy-picture-id178375154?s=170x170&w=1007" alt="Husky puppy">
        </a>
    </div>
    <div class="nav menu nav2">
        <a href="#" tabindex="0" class="menu-item">About</a>
        <a href="#" tabindex="0" class="menu-item">Contact</a>
    </div>
</header>

CSS (scss)

header {
    align-items: center;
    display: flex;
    flex-wrap: nowrap;
    justify-content: center;

    .nav {
        width: 42.5%;
    }

    .logo {
        width: 15%;
    }

    .menu {
        align-items: center;
        display: flex;
        flex-wrap: wrap;
        justify-content: space-around;

        .menu-dropdown {
            height: 20px;
            margin-bottom: -5px;

            p {
                cursor: pointer;
                margin: 0;

                &:focus, &:hover {
                    ~ a {
                        display: block;
                    }
                }
            }

            a {
                display: none;
            }

            &:focus, &:hover {
                height: 70px;
                margin-bottom: -55px;

                a {
                    display: block;
                }
            }
        }

        img {
            width: 100px;
        }
    }
}

Пример * * тысяча двадцать-один

https://codepen.io/anon/pen/vjXaVW

Объяснение

Flexbox - это техника макета CSS, которая использует движок CSS браузера для динамического размещения элементов. Вместо того, чтобы назначать ширину вручную, flexbox делает тяжелую работу за нас.

Подробнее о Flexbox

.some-random-class {
    align-items: center; // I'm telling the element to arrange its children to be vertically centered
    display: flex; // Declaring that this element will be using flexbox; it's like flipping the "Flexbox Switch" to on.
    flex-wrap: nowrap; // I'm telling the element to never allow its children to wrap (i.e. fold over). Using "wrap" instead of "nowrap" tells the element to definitely allow its children to wrap (i.e. fold over)
    justify-content: center; // I'm telling the element to horizontally center its children. There are more options than just "center"
}

При justify-content: center; меню и логотип всегда будут центрированы на странице. Обратите внимание, что элемент <div class='menu logo'></div> находится между двумя другими элементами div, а эти два других элемента div содержат пункты меню.

...