Jump to content

Резиновая верстка. (1200px) Первый раз по БЭМу.


DmitryPavlov
 Share

Recommended Posts

Приветствую.  Пожалуйста, раскритикуйте мою верстку по таким критериям.           Сайт   —-    Макет.

  1. Именование классов якобы по БЭМ.
  2. Семантика.
  3. Позиционирование элементов.

Это основное, что я хочу узнать для себя. Если есть то, что конкретно бросается в глаза в коде, прошу скажите. Большое спасибо!

 

Link to comment
Share on other sites

БЭМ используют для возможности повторно использовать блоки.

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

Например кнопка - (contact us и get touched), сделали бы класс блока для неё - .link-details(для него были бы общие стили), а для фона сделали бы модификаторы .link-details_color_green и .link-details_color_red к примеру. 

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

По поводу портфолио меню, вложенность можно было бы сделать и проще(т.е. обойтись без ul и li): 

<div class="portfolio-menu">
  <a class="portfolio-menu__link" href="#"></a>
  ...
</div>

Здесь я не нашёл блок soc(экран our team):

<ul class="soc__list">
  ....

Почему нельзя сделать кнопку без спана? и снова нет блока com для com__text:

<a href="#" class="communication__button"><span class="com__text">Contact Us</span></a>

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

На счёт таких классов:

<h2 class="contact__h2">Contact Us</h2>

Кому как, но я не люблю в классах название тега, он обязывает вас применять его только к h2 тегам, а если тег нужно будет поменять?(исключение - элементы формы)

Edited by VeniVidiVici
Link to comment
Share on other sites

Верстка безразмерная а не 1200, используются картинки вместо CSS, неоправданное применения пустых дивов для оформления и самое ужасное - height.

ЗЫ Потенциальному работодателю это лучше не показывать .

Link to comment
Share on other sites

5 минут назад, DmitryPavlov сказал:

Почему безразмерная ?

Потому что тянется на любую ширину.

7 минут назад, DmitryPavlov сказал:

Что конкретно имеется ввиду ?

Фиксированная высота у отдельных блоков .

Link to comment
Share on other sites

Зачем ?! Верстка должна не только соответствовать макету, но и соответствовать дизайну при изменении контента внутри блока.  А контента может стать не только больше, но и меньше. И в этом случае у вас будет пустое пространство, что не есть хорошо.

Как правило дизайнер сохраняет некую симметрию при построении дизайна. До начала вёрстки вы можете выделить основные стили, как то line-height у заголовка, margin у кнопки, padding у самого блока.  В результате необходимая высота сформируется естественным образом везде где нужно ... ну или почти везде -)

Link to comment
Share on other sites

Привет Дмитрий, нашел у тебя ошибки в семантике.

В секции portfolio

<figure class="gallery__pic">
  <img class="gallery__pic-img" src="images/gallery-image.png" alt="">
  <a href="#" class="gallery__link">
    <figcaption class="gallery__pic-text">Click here for details</figcaption>
  </a>
</figure>

Ошибка в том что тег figcaption должен быть внутри figure , либо первым либо последним чаилдом (child),  у тебя он внутри тега a.

Правильное использование в твоем случае выглядело так бы  ...

<figure class="gallery__pic">
  <img class="gallery__pic-img" src="images/gallery-image.png" alt="">
  <figcaption class="gallery__pic-text">
    <a href="#" class="gallery__link">Click here for details</a>
  </figcaption>
</figure>

Но было бы снова неправильно , т.к. по спецификации тег figcaption используется  для описания заголовка или надписи тега figure.

У тебя это просто тег обертка для ссылки с одним и тем же текстом для всех элементов.

Для примера, если на сайт зайдет человек с нарушением работы органов зрения и будет использовать голосовой сканридер то все твои работы в портфолио будут для него всего лишь текстом Click here for details , и не принесут никакого логического смысла.

Для примера вот тебе разметка, прочитав атрибут alt  и тег figcaption можно понять что находиться на картинке, в твоем случае нет.

<figure aria-labelledby="operahouse">
    <img src="operahousesteps.jpg" alt="Сиднейский оперный театр"/>
    <figcaption id="operahouse_1">Здесь мы увидели оперу <cite>Севильский цирюльник</cite></figcaption>
</figure>

Теперь ты будешь использовать теги HTML5 со смыслом а не просто для галочки, что они есть в разметке. :)

Edited by Livitan
Link to comment
Share on other sites

Livitan, благодарю за ответ) Тогда в данной ситуации вовсе не стоило использовать figcaption. Но так же печально и останется для скринридеров, ведь попросту нечего читать будет. Скорее всего, просто нужно делать нормальный альтернативный текст. 

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
Reply to this topic...

×   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