Jump to content
  • 0

Проблема с границами


Bumblebee
 Share

Question

Всем доброго времени суток.

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

Сделал меню. В условия было указано, что надо использовать только css и html:

http://jsfiddle.net/...ebee1993/WxdQp/

Проблема:

Перегородка между элементом основного меню и раскрывающимся под ним списком должна отсутствовать.

Выслушаю любые предложения.

Заранее благодарен :)

Link to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 0
почему не работает z-index

Кстати, работает :). Я забыл, что выпадушка тут позиционируется относительно внешнего ul, а не li, а значит, находится в его контексте наложения и ее можно легко «подсунуть» под его непозиционированный контент отрицательным z-index'ом.

Но в свете нового ответа это решение, как и предыдущее, не подходит, думаю дальше...

Link to comment
Share on other sites

  • 0

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

Прочел вашу статью на хабре. Очень интересно :)

Edited by Bumblebee
Link to comment
Share on other sites

  • 0

Ну если будет фон и не нужна перегородка, я вижу так.

Основное меню должно иметь z-index: 1, всплывающее меню 2 (чтобы перекрывать границу основного меню) и li:hover, из которого всплывает меню должен быть z-index:3 с прозрачной нижней границей, тогда не будет перегородки и фон будет сохранен. Но я не понимаю до конца как это реализовать, так как меня вводит в ступор, почему не пашет самое банальное li:hover z-index: 2; и всплывающее меню его границу все равно закрывает.

Link to comment
Share on other sites

  • 0

Можно задать здесь заодно нубский вопрос? Почему, если li (даже если только первому ul) присвоить position: relative, то выпадающее меню начинает выравниваться в столбик?

Link to comment
Share on other sites

  • 0
Почему, если li (даже если только первому ul) присвоить position: relative, то выпадающее меню начинает выравниваться в столбик?

Потому что тогда containing block-ом (типа «домиком») для него становится не широченный внешний ul, а сам этот тесный li. И позиционированный потомок по умолчанию (если ему не задана ширина) пытается вписаться в этот «домик».

Link to comment
Share on other sites

  • 0

SelenIT, получается, что ширину он берет по ul с заданным position, но позиционирование себя как блока начинает не с левого верхнего угла ul, а с угла li? Почему-то казалось, что от ul тогда должен выравниваться...

Link to comment
Share on other sites

  • 0
но позиционирование себя как блока начинает не с левого верхнего угла ul, а с угла li?

Если left и right не заданы, элемент помещается по горизонтали там, где он рисовался бы, не имея position:absolute. Аналогично с положением по вертикали и top/bottom. Если добавить top:0; left:0 — будет с левого верхнего угла ul.

Link to comment
Share on other sites

  • 0
почему при задании li position relative и после этого установлие свойства: .#nav .dropdown:hover { z-index: 100; } Ячейка все равно не оказывается поверх всплывающего меню?

Потому что тогда containing block-ом всплывающего меню становится сам li.dropdown, и оно оказывается в его контексте наложения. И z-index поднимает li.dropdown вместе со всем, что из него позиционируется, как единую стопку. Опустить позиционированный потомок элемента ниже containing block-а можно, лишь задав отрицательный z-index самому потомку (но фон родителя всё равно будет еще ниже, у него, можно сказать, z-index равен минус бесконечности).

Хз, стабильно ли..

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

Link to comment
Share on other sites

  • 0

Не дает мне покоя эта штука).

Что я сделала. Так как <li> выпадает из z-index и его невозможно сделать выше <ul>, я добавила один слой, почти полностью копирующий <li>, но находящийся внутри его и уже ему подняла z-index. Я обернула <a> в дополнительный <div> и уже внутри него перед a: добавила слой :before, который имеет все свойства <li>. Самое главное, что он имеет бэкграунд, а нижняя граница этого слоя прозрачная, таким образом на самой границе мы будем видеть неоднородный бэкграунд и создаться ощущение, что границы нет (она прозрачная). Саму ссылку мы подняли выше этого слоя по z-index, чтобы она не пропадала. Ну а псевдо-слой сам по себе выше ul.

http://jsfiddle.net/WxdQp/12/

Edited by Zverushka
Link to comment
Share on other sites

  • 0

Вот как это выглядит с задним фоном.

http://jsfiddle.net/WxdQp/13/

Одна проблема, если задать кнопке градиент, у нее внизу появляется белая полоса, а наверху черко-очерченная граниентная. ФЗ почему )...

Link to comment
Share on other sites

  • 0

Ваш вариант, к сожалению не подходит, так как если подложить фон всей страницы (body например), то выпадающее меню исчезает вовсе. А именно таким было условие, я наверное не ясно выразился. У меня почти получилось. Но все равно, как заметил SelenIT, если сделать выпадающее меню слишком коротким, то граница вылезает за пределы.

Link to comment
Share on other sites

  • 0

Ваш вариант, к сожалению не подходит, так как если подложить фон всей страницы (body например), то выпадающее меню исчезает вовсе. А именно таким было условие, я наверное не ясно выразился. У меня почти получилось. Но все равно, как заметил SelenIT, если сделать выпадающее меню слишком коротким, то граница вылезает за пределы.

Да, там если еще браузер будет не в полном окне и выпадающее меню схлопнется - вылезут лишние границы наверху...

Кстати у меня ничего не исчезает: http://jsfiddle.net/WxdQp/15/

Edited by Zverushka
Link to comment
Share on other sites

  • 0

Закомментируейте градиент. Там перегородка видна.

Мммм, не понимаю. Нужно, чтобы в меню просвечивался фон body полностью без перегородок? Типа такого? http://jsfiddle.net/WxdQp/16/

В этом точно есть смысл? Ведь тогда меню становится нечитабельным. Фона, цвета, бэкграунда у меню вообще не будет?

Edited by Zverushka
Link to comment
Share on other sites

  • 0
Нужно, чтобы в меню просвечивался фон body полностью без перегородок?

Да, все правильно понимаете :)

В этом точно есть смысл?

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By zeiger2
      Здравствуйте! У меня стоит задача, что при наведении на блок li строка должна поменять цвет, в том числе и картинка. Я меняю картинку с помощью 
      background-image: none;     background: url(../img/check_icon_red.png) left no-repeat;   Но теперь картинка позицианируется не там где должна, её можно поставить на место только вручную, через -100px. Нужно поставить ровно туда, где она была. Должна быть в одном ряду с другими
    • By Mix9
      есть див с 5 img, при уменьшении экрана див выходит за него. Я добавил overflow: auto для этого div в надежде на то, что я смогу прокручивать фотки с помощью скроллбара, однако даже с ним почему-то я не вижу часть фоток которые вышли за границу. Что с этим можно сделать? класс video повторяется 5 раз, я тут оставил только 1 
      .content{ width: 90%; background-color: #333; } .video{ margin: 0px 4px 0px 4px; width: 310; display: flex; flex-direction:column; } .video_button_text{ margin-top: 10px; display: flex; flex-direction: row; font-size: 20px; color: white; } .video_text_div{ display: inline-block; width: 250px; } .video_text{ text-align: justify-all; margin: 0px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .slidan_videos{ margin: 0px 10px 0px 20px; overflow: auto; width: auto; margin-bottom: 50px; display: flex; flex-direction: row; justify-content: space-around; } <div class="content"> <div class = slidan_videos> <div class = video> <div> <a href = 'ссылка'><img class="img" src=""картинка"></a> </div> <div class = video_button_text> <div class = avatarka_div> <a href="ссылка" target="_blank"><img class = avatarka src="картинка"></a> </div> <div class = video_text_div> <p class = video_text><a href="ссылка">текст</a></p> </div> </div> </div>
    • By Kaido
      Использую готовый плагин для модальных окон(от MaxGraph). Проблема в том, что когда у меня открыто два модальных окна, для примера Форма + Политика конфендициальности, и мне нужно закрыть политику вместе с ней закрывается и другое модальное окно. В JS я не сильно разбираюсь(собственно из за этого и использую готовый плагин), можете помочь кто работал с этим плагином? Я примерно понимаю как он работает, но реализовать чтобы закрывалось только одно не получается.
       
        <div class="content"> <button class="modal-btn" data-path="first" data-animation="fadeInUp" data-speed="1500">Открыть окно 1</button> </div> <div class="modal"> <div class="modal__wrapp" data-target="first"> <div class="modal__content"> <button class="modal__close">Закрыть</button> модальное окно <button data-path="policy">Политика</button> </div> </div> <div class="modal__wrapp" data-target="policy"> <div class="modal__content"> <button class="modal__close">Закрыть</button> политика </div> </div> </div> .modal { --transition-time: 0.3s; position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 1000; cursor: pointer; overflow-y: auto; overflow-x: hidden; text-align: center; opacity: 0; visibility: hidden; transition: opacity var(--transition-time), visibility var(--transition-time); } .modal__wrapp { display: none; cursor: default; width: fit-content; height: fit-content; } .modal__content{ position: absolute; left: 500px; width: 500px; height: 500px; display: flex; color: white; flex-direction: column; text-align: left; background-color: #000; } .modal__content button{ width: 200px; height: 50px; margin: 50px 0; } .modal.is-open { opacity: 1; visibility: visible; transition: opacity var(--transition-time), visibility var(--transition-time); } .modal__wrapp.modal-open { display: flex; } .disable-scroll { position: relative; overflow: hidden; height: 100vh; position: fixed; left: 0; top: 0; width: 100%; } .fade { opacity: 0; transition: opacity var(--transition-time); } .fade.animate-open { opacity: 1; transition: opacity var(--transition-time); } .fadeInUp { opacity: 0; transform: translateY(vw(-100)); transition: opacity var(--transition-time), transform var(--transition-time); } .fadeInUp.animate-open { opacity: 1; transform: translateY(0); transition: opacity var(--transition-time), transform var(--transition-time); } .modal__wrapp[data-target="policy"] .modal__content{ left: 1050px; background-color: #000; opacity: .5; } class Modal { constructor(options) { let defaultOptions = { isOpen: () => {}, isClose: () => {}, } this.options = Object.assign(defaultOptions, options); this.modal = document.querySelector('.modal'); this.speed = false; this.animation = false; this.isOpen = false; this.modalContainer = false; this.previousActiveElement = false; this.fixBlocks = document.querySelectorAll('.fix-block'); this.focusElements = [ 'a[href]', 'input', 'button', 'select', 'textarea', '[tabindex]' ]; this.events(); } events() { if (this.modal) { document.addEventListener('click', function(e){ const clickedElement = e.target.closest('[data-path]'); if (clickedElement) { let target = clickedElement.dataset.path; let animation = clickedElement.dataset.animation; if (clickedElement.classList.contains('modal-close')) { this.close(); } let speed = clickedElement.dataset.speed; this.animation = animation ? animation : 'fade'; this.speed = speed ? parseInt(speed) : 300; this.modalContainer = document.querySelector(`[data-target="${target}"]`); this.open(); return; } if (e.target.closest('.modal__close')) { this.close(); return; } }.bind(this)); window.addEventListener('keydown', function(e) { if (e.keyCode == 27) { if (this.isOpen) { this.close(); } } if (e.keyCode == 9 && this.isOpen) { this.focusCatch(e); return; } }.bind(this)); this.modal.addEventListener('click', function(e) { if (!e.target.classList.contains('modal__wrapp') && !e.target.closest('.modal__wrapp') && this.isOpen) { this.close(); } }.bind(this)); } } open() { this.previousActiveElement = document.activeElement; this.modal.style.setProperty('--transition-time', `${this.speed / 1000}s`); this.modal.classList.add('is-open'); this.disableScroll(); this.modalContainer.classList.add('modal-open'); this.modalContainer.classList.add(this.animation); setTimeout(() => { this.options.isOpen(this); this.modalContainer.classList.add('animate-open'); this.isOpen = true; this.focusTrap(); }, this.speed); } close() { if (this.modalContainer) { this.modalContainer.classList.remove('animate-open'); this.modalContainer.classList.remove(this.animation); this.modal.classList.remove('is-open'); this.modalContainer.classList.remove('modal-open'); this.enableScroll(); this.options.isClose(this); this.isOpen = false; this.focusTrap(); } } focusCatch(e) { const focusable = this.modalContainer.querySelectorAll(this.focusElements); const focusArray = Array.prototype.slice.call(focusable); const focusedIndex = focusArray.indexOf(document.activeElement); if (e.shiftKey && focusedIndex === 0) { focusArray[focusArray.length - 1].focus(); e.preventDefault(); } if (!e.shiftKey && focusedIndex === focusArray.length - 1) { focusArray[0].focus(); e.preventDefault(); } } focusTrap() { const focusable = this.modalContainer.querySelectorAll(this.focusElements); if (this.isOpen) { focusable[0].focus(); } else { this.previousActiveElement.focus(); } } disableScroll() { let pagePosition = window.scrollY; this.lockPadding(); document.body.classList.add('disable-scroll'); document.body.dataset.position = pagePosition; document.body.style.top = -pagePosition + 'px'; } enableScroll() { let pagePosition = parseInt(document.body.dataset.position, 10); this.unlockPadding(); document.body.style.top = 'auto'; document.body.classList.remove('disable-scroll'); window.scroll({ top: pagePosition, left: 0 }); document.body.removeAttribute('data-position'); } lockPadding() { let paddingOffset = window.innerWidth - document.body.offsetWidth + 'px'; this.fixBlocks.forEach((el) => { el.style.paddingRight = paddingOffset; }); document.body.style.paddingRight = paddingOffset; } unlockPadding() { this.fixBlocks.forEach((el) => { el.style.paddingRight = '0px'; }); document.body.style.paddingRight = '0px'; } } const modal = new Modal({ isOpen: (modal) => { console.log(modal); console.log('opened'); }, isClose: () => { console.log('closed'); }, });  
    • By stasN1
      Мне нужен такой результат :

      Не понимаю почему background не применяется вокруг иконок:

       
      Сам код:
      Html:
      css:

      Html:
      <section class="finish"> <div class="container"> <h2 class="finish_header">По окончании обучения Вы сможете!</h2> <div class="finish_divider"></div> <div class="finish_wrapper"> <finish_item> <div class="finish_round"> <img src="/icons/finish/1 (1).png" alt="" class="finish_icon"> </div> <div class="finish_descr">Создать свой сайт или блог</div> </finish_item> <finish_item> <div class="finish_round"> <img src="/icons/finish/2.png" alt="" class="finish_icon"> </div> <div class="finish_descr">Создать свой сайт или блог</div> </finish_item> <finish_item> <div class="finish_round"> <img src="/icons/finish/3.png" alt="" class="finish_icon"> </div> <div class="finish_descr">Обеспечить ему медленный, но верный рост в ТОП</div> </finish_item> <finish_item> <div class="finish_round"> <img src="/icons/finish/4.png" alt="" class="finish_icon"> </div> <div class="finish_descr">Достигнуть стабильного прироста посетителей</div> </finish_item> <finish_item> <div class="finish_round"> <img src="/icons/finish/5.png" alt="" class="finish_icon"> </div> <div class="finish_descr">Достигнуть стабильного прироста посетителей</div> </finish_item> </div> </div> </section>  
      Css:
      .finish .finish_wrapper { margin-top: 41px; display: flex; justify-content: space-between; } .finish .finish_wrapper .finish_item { width: 204px; } .finish .finish_wrapper .finish_item .finish_round { width: 115px; height: 115px; background-color: #b4e2ff; border-radius: 8px; } .finish_descr { font-family: Roboto; font-size: 17px; line-height: 20px; font-weight: 300; color: #efefef; Спасибо!
       

      Уже решил, спасибо!
      У меня CSS селектор вида:
      .finish .finish_wrapper .finish_item .finish_round

      А должен быть:
      .finish .finish_wrapper finish_item .finish_round
      Т.е. без точки перед finish_item, так как это не класс, а элемент
    • By Dos1er
      Приветствую! 
      Подскажите, плиз, как сделать чекбокс как на скрине? 
      Я новичок в верстке и что-то не могу разобраться в кастомизации данной штуки

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy