Jump to content
  • 0

Когда div нужен


riki
 Share

Question

Доброго времени суток,

народ правильно ли если div пустой и он имеет только бэкграунд? этот div сделан только для этого фона.

Чем это не хорошо кроме того что лишние div не нужны.

И есть ли ситуации когда так делать нормально?

Link to comment
Share on other sites

16 answers to this question

Recommended Posts

  • 0

Доброго времени суток, народ правильно ли если div пустой и он имеет только бэкграунд? этот div сделан только для этого фона. Чем это не хорошо кроме того что лишние div не нужны. И есть ли ситуации когда так делать нормально?

Я всегда старался не допускать в разметке пустых элементов, ибо всегда считал, что это плохо и что для оформления нужен только CSS, который для этого и придуман. Но, если уж прям ситуация тупиковая, то я старался использовать псевдоэлементы, но а если уж и последних не хватает, то тогда да, приходится использовать пустые элементы.

 

В общем, имхо, не стоит использовать пустые элементы, если можно обойтись без них.

Link to comment
Share on other sites

  • 0

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

 

Вопрос скорее общий, конктрного кода нет

Зачем демонстрировать? Вполне нормально. Что вы еще можете использовать кроме div?

Речь идет о пустом div - только фон, (или span)

 

 

Доброго времени суток, народ правильно ли если div пустой и он имеет только бэкграунд? этот div сделан только для этого фона. Чем это не хорошо кроме того что лишние div не нужны. И есть ли ситуации когда так делать нормально?

Я всегда старался не допускать в разметке пустых элементов, ибо всегда считал, что это плохо и что для оформления нужен только CSS, который для этого и придуман. Но, если уж прям ситуация тупиковая, то я старался использовать псевдоэлементы, но а если уж и последних не хватает, то тогда да, приходится использовать пустые элементы.

 

В общем, имхо, не стоит использовать пустые элементы, если можно обойтись без них.

 

То есть по нормальному пустые элементы - это зло?

А если в макете это элемент дизайна, но возможно, если будут изменения это будет элемент, и для него будут какие то действия. И предаться переделывать верстку. Как тогда аргументировать - что пустой div (только - фон это зло).

 

чем псевдоэлементы уже не угодили?

Требуют ИЕ7 какой-нибудь?

Вопрос к кому?

Link to comment
Share on other sites

  • 0
То есть по нормальному пустые элементы - это зло? А если в макете это элемент дизайна, но возможно, если будут изменения это будет элемент, и для него будут какие то действия. И предаться переделывать верстку. Как тогда аргументировать - что пустой div (только - фон это зло).

 

Да, пустые элементы - это плохо. Но, у меня лично бывали случаи, когда мне приходилось использовать пустые элементы. Дизайнер нарисовал такой макет, что там без доп. разметки вообще не обойтись. Вот этот сайт. Обрати внимание на код серого блока в середине страницы (Онлайн каталог, Новости, О компании и т.д). Вот какая там разметочка используется только для фона:

 

<div class="bg">						<i class="bg__top"></i>						<i class="bg__bottom"></i>						<i class="bg__color"></i>						<i class="shadow__big"></i>						<i class="shadow__rech"></i>						<i class="shadow-left"></i>						<i class="shadow-right"></i>					</div>

И у меня не было другого выбора, ибо для фона там нужно было: тень, сетка, закруглённые углы, переливание бордера градиентом, блик и т.д. И нужно было IE8+. Поэтому пришлось пойти на такую крайность :)

Link to comment
Share on other sites

  • 0

Пустые элементы, на мой взгляд, нормально, если это оправдано. Например, навигация «точками» не требуют содержимого (там, правда не <div>, а <a>, но тем не менее). Думаю, ещё много примеров можно придумать.

Link to comment
Share on other sites

  • 0
Дизайнер нарисовал такой макет, что там без доп. разметки вообще не обойтись. Вот этот сайт.

воу, воу, воу. Мне кажется или это конкретный перебор? 

Сайт фикс, если нет строгого ТЗ, то это лепится bg картинкой и все (ок, двумя). Взамен имеем 7 блоков + 1 обертка для него.

Те же тени можно было в 1 картинку влепить, или вообще через CSS, раз уж на то пошло.

 

ИЕ8+ - это понятно, но это ведь по-разному можно понимать. Для одного заказчика ИЕ8 значит - "сделайте чтобы в осле просто можно было прочитать, что написано", для другого - "сделайте везде чтобы было один в один насколько возможно с применением любых трюков, от ИЕ8 и выше".

Edited by advokatua
Link to comment
Share on other sites

  • 0

 

Дизайнер нарисовал такой макет, что там без доп. разметки вообще не обойтись. Вот этот сайт.

воу, воу, воу. Мне кажется или это конкретный перебор? 

Сайт фикс, если нет строгого ТЗ, то это лепится bg картинкой и все (ок, двумя). Взамен имеем 7 слоев.

Те же тени можно было в 1 картинку влепить, или вообще через CSS, раз уж на то пошло.

 

ИЕ8+ - это понятно, но это ведь по-разному можно понимать. Для одного заказчика ИЕ8 значит - "сделайте чтобы в осле просто можно было прочитать, что написано", для другого - "сделайте везде чтобы было один в один насколько возможно с применением любых трюков, от ИЕ8 и выше".

 

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

 

Заказчику надо было, чтобы в IE8 тоже смотрелось как и везде. Слава Богу, что ещё на IE7 отговарил)

Link to comment
Share on other sites

  • 0

ТС, используй :after, :before для соседнего элемента для задания одного только фона, сам так часто поступаю. А вообще не вижу ничего плохого в использовании пустого <div>, может быть потому, что верстаю в основном лендинги, в которых к чистоте HTML кода не предъявляют обычно требований. А в целом нужно как всегда искать баланс между уместностью использования пустого <div> и избыточностью кода.

Link to comment
Share on other sites

  • 0
Там блок должен ещё тянуться вниз и т.д.

Эмм, так он же не тянется. В смысле там после 350px начинает вылезать радиальный градиент. 

 

И типа так http://jsbin.com/xanikeja/1/ никак не прокатит? )

Там разве что один border-radius не проканает на ИЕ8, но опять же, если этот радиус в 8-ом жесть как нужен, то лепим псевдокартинки по углам, в противном случае подаем как есть. Если клиент умеет тестить на ранних ослах и жужжит, "почему нет радиуса", то объясняем, что это +4 запроса к серваку и это довольно глупо, учитывая аудиторию данногого осла.

 

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

Link to comment
Share on other sites

  • 0
И типа так http://jsbin.com/xanikeja/1/ никак не прокатит? )

 

Нет, не прокатит. На других страницах дизайна блок по высоте должен быть больше. Добавил текста. И результат. FF.

Link to comment
Share on other sites

  • 0

так я в курсе, я же и написал, что у тебя тоже самое ) Потому и спросил, в каком смысле означало - "тянется".

 

Забыл добавить, вот теперь тянется http://jsbin.com/xanikeja/3/

(Для ИЕ8 костыли имеются, можно поискать)

Edited by advokatua
Link to comment
Share on other sites

  • 0

так я в курсе, я же и написал, что у тебя тоже самое ) Потому и спросил, в каком смысле означало - "тянется".

 

Забыл добавить, вот теперь тянется http://jsbin.com/xanikeja/3/

(Для ИЕ8 костыли имеются, можно поискать)

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

А потом у тебя ссылки не кликабельные, т.к. их блок с фоном перекрывает.

Link to comment
Share on other sites

  • 0
А потом у тебя ссылки не кликабельные, т.к. их блок с фоном перекрывает.
Шустро лепил, и само собой где-то пропустил моменты. http://jsbin.com/xanikeja/4

 

А вообще судя по описанию каша понятна. Дизайнера ты небось потом еще долго вспоминал. )

Link to comment
Share on other sites

  • 0

 

А потом у тебя ссылки не кликабельные, т.к. их блок с фоном перекрывает.
Шустро лепил, и само собой где-то пропустил моменты. http://jsbin.com/xanikeja/4

 

А вообще судя по описанию каша понятна. Дизайнера ты небось потом еще долго вспоминал. )

 

В IE8 не хватает фонов. На счёт внешних теней выше написал.

Нет, дизайнер был заказчиком, он меня щедро вознаградил, так что разошлись с миром :)

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 Марко
      Добрый день. Начинающий программист, столкнулся с проблемой. Селектор .class не работает должным образом. Несмотря на правильное, я надеюсь, описание, на web-странице не отображается ни одно изображение. С чем может быть связано? Заранее спасибо за помощь. 



    • 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'); }, });  
×
×
  • 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