Горизонтальное меню по вертикали и горизонтали с эффектом наведения мыши, как создать кроссбраузерное решение? - PullRequest
1 голос
/ 26 февраля 2012

Я пытаюсь создать горизонтальное меню, выровненное по вертикали и горизонтали.

Я на самом деле использую теги

  • В Internet Explorer 9 фон, который появляется при наведении курсора мыши на элемент, перемещается на 1 пиксель выше, поверх черной линии.
  • В Chrome элемент li имеет высоту 20 пикселей вместо 16, как в Firefox, перемещая меню немного ниже
  • В сафари и опере у меня та же проблема с хромом.

Обратите внимание, что у Opera, Safari и Chrome также есть проблема, когда мой разделитель имеет высоту 3px и 1px большой, в то время как в Firefox я могу правильно его визуализировать.

Я не знаю, почему, а потомуЯ потерял 2 ночи из-за этой проблемы. Думаю, мне определенно нужна помощь.

Вот ситуация с Firefox (вы можете нажать на картинку для увеличения):

Firefox situation

Здесь вы можете увидеть ситуацию с Chrome (веб-набор в целом):

Webkit situation

css для меню это:

#menu
{
  bottom: 111px;
  height:  54px;
  width:   100%;
  top:     auto;
}

#menu-bar-top, #menu nav
{
  background-repeat: repeat-x;
  width:              inherit;
}

#menu-bar-top
{
  background-image:  url(../../img/Layouts/default/Hr-bottom.png);
  background-color:                                   transparent;
  border-style:                                              none;
  height:                                                    18px;
}

#menu nav
{
  background-image:  url(../../img/Layouts/default/Menu-background.png);
  height:                                                          36px;

}

#menu nav div
{
  text-align:  center;
  height:     inherit;
  margin:           0;
}

#menu nav ul
{
  list-style-type:         none;
  font-family:     Ethnocentric;
  font-size:              1.2em;
  padding:                    0;
  height:               inherit;
  margin:                     0;
  color:                  white;
}

#menu nav ul li
{
  position: relative;
  top: 10px;
  display:     inline;
  padding:          0;
  margin:           0;
}

#menu nav ul li.menu-separator
{
  background-position:                                     center center;
  background-repeat:                                           no-repeat;
  background-image:    url(../../img/Layouts/default/Menu-separator.png);
  font-size:                                                         1px;
}

#menu nav ul li a
{
  text-decoration:  none;
  padding:          10px 10px 8px 10px;
  margin:         0 -5px;
  color:           white;
}

#menu nav ul li a:hover
{
  background-position:                                                  0px 0px;
  background-repeat:                                                   repeat-x;
  background-image:    url(../../img/Layouts/default/Menu-background-hover-2.png);
}

В то время как html может бытьнашел здесь:

<section id="menu">
    <hr id="menu-bar-top" />
    <nav>
        <div>
            <ul>
                <li><a href="#">Home</a></li>
                <li class="menu-separator">&nbsp;</li>
                <li><a href="#">Lavori svolti</a></li>
                <li class="menu-separator">&nbsp;</li>
                <li><a href="#">Balbo e consorzi</a></li>
                <li class="menu-separator">&nbsp;</li>
                <li><a href="#">Ciao</a></li>
                <li class="menu-separator">&nbsp;</li>
                <li><a href="#">Etc...</a></li>
                <li class="menu-separator">&nbsp;</li>
                <li><a href="#">Etc...</a></li>
                <li class="menu-separator">&nbsp;</li>
                <li><a href="#">Etc...</a></li>
                <!-- ... other Etcs ...-->
            </ul>
        </div>
    </nav>
</section>

Поскольку я думаю, что ul создает мне больше проблем, чем следовало бы, я в порядке с изменением разметки html (обратите внимание, что html5), не имеет значенияесли он кажется немного неправильным (например, используя только div и span).Что мне действительно нужно, так это перекрестное решение, и любые предложения приветствуются.Мне не нужна поддержка Ie6, я в порядке с IE9 и последней версией Chrome, Opera, Safari, Firefox.

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

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

Редактировать 1: Я не понимаю, почему я не могу сделать высоту разделителя, какой я хочу, я помещаю текст внутрь, но определенно не соответствует нужному мне размеру, это встроенный элемент, ноЯ не могу поместить элемент блока внутрь встроенного элемента: \

Редактировать 2: Хорошо. Я загрузил всю веб-страницу с графикой, в данный момент я не создавал JSFiddle, ноВы можете просмотреть веб-страницу и загрузить ее в виде ZIP-файла:

Просмотреть веб-страницу Загрузить веб-страницу (если вы не доверяетемне просто скачать другой из браузера) JSFiddle

Редактировать 3: Добавлена ​​JS Fiddle, однако я не могу заставить шрифт работать там

Ответы [ 4 ]

2 голосов
/ 28 февраля 2012

Используйте display:block на вашем A -tag. Переместите разделитель меню на тег «A».

Измените свой LI на «встроенный блок»:

#menu nav ul li {
  position: relative;
  top: 10px;
  display: inline-block;
  padding:0;
  margin:0;
}

Возможно, есть еще несколько вещей, которые можно настроить. Без полного URL-адреса к вашим изображениям это трудно сделать удаленно.

1 голос
/ 28 февраля 2012

Я сделал небольшую демонстрацию: http://jsfiddle.net/3bydX/

Я float редактировал элемент li, чтобы поместить их в один ряд, элементы матрицы a имеют line-height равным height, поэтому текст центрирован по вертикали.

Так как вы можете менять разметку, я удалил разделитель li s и использовал псевдодетекторные элементы для достижения этого эффекта. Таким образом, вы также избавляетесь от несемантической разметки.

0 голосов
/ 03 марта 2012

Хотя ответ Джоны мне очень помог с псевдоэлементами (я не знал, что это возможно), он не полностью отвечает на мой вопрос: особенно я использовал высоту строки, равную половина моего роста, и я не использовал float: left, что создает проблемы только с центрированием меню.

Вместо этого, что действительно исправило все для меня, это display: block для тега A и особенно display: inline-block для тегов li.

Это изменило поведение тегов для выполнения именно того, что я хотел, с некоторыми незначительными изменениями.

У меня все еще есть небольшие проблемы с Google Chrome, но я думаю, что это связано с тем, что для Chrome (и Safari) шрифт имеет высоту 20 пикселей вместо 16, как во всех других браузерах (не знаю почему), но они не так плохи (текст уменьшен на 4 пикселя, я могу принять это).

Вот полное редактирование того, что я построил с помощью css, используя ответы Диодея и Джоны, а также небольшое изменение разметки html:

HTML:

  <section id="menu">
    <hr id="menu-bar-top" />
    <nav>
      <div>
        <ul>
          <li><a href="#">Home</a></li>
          <li><a href="#">Lavori svolti</a></li>
          <li><a href="#">Balbo e consorzi</a></li>
          <li><a href="#">Ciao</a></li>
          <li><a href="#">Etc...</a></li>
          <li><a href="#">Etc...</a></li>
        </ul>
      </div>
    </nav>
  </section>

CSS:

/**
 *     Creates a font that should be used in all pages TEST
 */

@font-face
{
  font-family:                                                          Ethnocentric;
  src:                                              url('../files/ethnocentric.eot');
  src:         url('../../files/ethnocentric.eot?iefix') format('embedded-opentype'),
                                 url('../../files/ethnocentric.woff') format('woff'),
                              url('../../files/ethnocentric.ttf') format('truetype'),
                                   url('../../files/ethnocentric.svg') format('svg');
}

*
{
  padding: 0;
  margin:  0;
}

html, body
{
  max-height:               100%;
  overflow:               hidden;
  height:                   100%;
}

/**
 *     Change the basic background color of the page
 */
html
{
  background-image: url(../../img/Layouts/default/Background.png);
  font-family:                                  Arial, sans-serif;
  font-size:                                                 10px;
}

/**
 *     Helper to clear from float
 */
.clear
{
  clear: both;
}

input[type="radio"].radio-hidden
{
  position: absolute;
  display:      none;
  left:      -9999px;
  top:       -9999px;
}

header, #menu, footer
{
  background-repeat: repeat-x;
  position:          absolute;
  overflow:            hidden;
  bottom:                   0;
  width:                 100%;
  right:                    0;
  left:                     0;
  top:                      0;
}
header
{
  background-image: url(../../img/Layouts/default/Gradient-top.png);
  height:                                                     125px;
}

#content
{
  /*background-repeat:                                             repeat-y;
  background-image:  url(../../img/Layouts/default/Background-center.png);*/
  position:                                                         fixed;
  overflow:                                                          auto;
  margin:                                                   0 auto 0 auto;
  bottom:                                                           165px;
  /*width:                                                            789px;*/
  width: 77%;
  right:                                                                0;
  left:                                                                 0;
  top:                                                              112px;

  border-width: 2px;
  border-style: solid;
  border-color: black;
  border-top-width: 0;
  border-bottom-width: 0;
  background-color: #5E656A;
}

#menu
{
  bottom: 111px;
  height:  54px;
  width:   100%;
  top:     auto;
}

footer
{
  background-image: url(../../img/Layouts/default/Gradient-bottom.png);
  height:                                                        111px;
  top:                                                            auto;
}

header div
{
  margin-right:  auto;
  margin-left:   auto;
  padding-top:   16px;
  width:        788px;
}

#menu-bar-top, #menu nav
{
  background-repeat: repeat-x;
  width:              inherit;
}

#menu-bar-top
{
  background-image:  url(../../img/Layouts/default/Hr-bottom.png);
  background-color:                                   transparent;
  border-style:                                              none;
  height:                                                    18px;
}

#menu nav
{
  background-image:  url(../../img/Layouts/default/Menu-background.png);
  height:                                                          36px;

}

#menu nav div
{
  text-align:  center;
  height:     inherit;
  margin:           0;
}

#menu nav ul
{
  list-style-type:         none;
  font-family:     Ethnocentric;
  font-size:              1.2em;
  padding:                    0;
  height:               inherit;
  margin:                     0;
  color:                  white;
}

#menu nav ul li
{
  position:     relative;
  display:  inline-block;
  padding:             0;
  height:        inherit;
  margin:              0;
  top:               0px;
}

#menu nav ul li a
{
  text-decoration:         none;
  line-height:             15px;
  display:                block;
  padding:                 10px;
  margin:          0 -2px 0 1px;
  color:                  white;
}

#menu nav ul li a:hover, #menu nav ul li a:focus
{
  background-position:                                                    0px 0px;
  background-repeat:                                                     repeat-x;
  background-image:    url(../../img/Layouts/default/Menu-background-hover-2.png);
}

#menu nav ul li a:before
{
  background-image: url(../../img/Layouts/default/Menu-separator.png);
  position:                                                  absolute;
  content:                                                         "";
  bottom:                                                       33.3%;
  width:                                                          2px;
  left:                                                          -2px; /* negative width of the seperator */
  top:                                                          33.3%;
}

#menu nav ul li a.menu-first:before
{
  background: none;
  width:         0;
  left:          0;
}

/* reset the firsit item */
#menu nav ul li:first-child a
{
    margin-left: -1px;
}

#menu nav ul li:first-child a:before
{
    display: none;
}

#company-info, #webdesigner-info
{
  font-size:    0.9em;
  position:  absolute;
  color:      #8E8C8C;
}

#company-info
{
  margin-left: 16px;
  margin-top:  11px;
  left:           0;
  top:            0;
}

#webdesigner-info
{
  margin-bottom: 11px;
  margin-right:  16px;
  bottom:           0;
  right:            0;
}

Вы можете посетить веб-страницу здесь (эта ссылка не будет существовать никогда)

0 голосов
/ 28 февраля 2012

Было бы полезно, если бы вы могли кодировать пример в JSFiddle, но я бы начал с добавления float left в тег li.Это должно исправить ваши кросс-браузерные проблемы.Наряду с другими твиками

#menu nav ul li {
  position: relative;
  top: 10px;
  display: inline;
  padding: 0;
  margin: 0;

  /* Add this */
  float:left;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...