Могу ли я иметь разные точки останова на основе отдельного элемента в адаптивном дизайне?

#css #responsive-design #media-queries

#css #адаптивный дизайн #медиа-запросы

Вопрос:

Я создаю адаптивный дизайн для своего сайта, и я довольно много читал о медиа-запросах и точках останова. Я понимаю, что нет установленных точек останова, поскольку сейчас так много экранов, и нам нужно выбрать лучший, который соответствует нашему макету. Но я не уверен, нормально ли иметь разные точки останова для каждого элемента, оформленного отдельно, или лучше сгруппировать все css в общую точку останова, которую я использую на всем своем сайте.Вот пример, объясняющий, что я имею в виду под этим:

Прямо сейчас я делаю что-то вроде этого:

Способ 1:

  .search_bar { 
    width: 30%;
    float: right;
 }
  /* Media Queries for Search Bar */
 @media only screen and (max-width: 900px) {
    .search_bar { 
        width: 40%;
    }
 }    
 @media only screen and (max-width: 780px) {
    .search_bar { 
        width: 50%;
    }   
 }
 @media only screen and (max-width: 500px) {
    .search_bar { 
        width: 100%;
    }   
 }

 .side_bar_wrap {
    width: 300px;
 }
 /* Media Queries for Side Bar */
@media only screen and (max-width: 850px) {
     .side_bar_wrap {
        width: 250px;
     }      
 }
 @media only screen and (max-width: 600px) {
     .side_bar_wrap {
        width: 150px;
     }  
 }
 @media only screen and (max-width: 400px) {
     .side_bar_wrap {
        display:none;
     }  
 }

 etc..etc..
  

Если вы заметили выше, у меня нет установленного количества точек останова для всего моего шаблона. Я определил разные точки останова для каждого элемента в зависимости от того, как ведут себя отдельные элементы при разных размерах экрана. Это дает мне точный способ выравнивания отдельных элементов, а не определения всех элементов в общих точках останова. Чего я не знаю, так это того, рекомендуется ли использовать вышеуказанный метод (или его можно использовать) или я не должен делать это так? Нужно ли мне изменить приведенное выше на что-то вроде этого, где я создаю общие точки останова для всего своего веб-сайта и добавляю стили, сгруппированные вместе в одну из этих общих точек останова? Что-то вроде:

Способ 2:

 .search_bar { 
    width: 30%;
    float: right;
}
.side_bar_wrap {
    width: 300px;
}

/* Common Breakpoints to my entire site */
 /* Media Queries for all elements are grouped into one of these */
 @media only screen and (max-width: 900px) {
     .side_bar_wrap {
        width: 250px;
     }  
    .search_bar { 
        width: 40%;
    }        
 }
 @media only screen and (max-width: 750px) {
     .side_bar_wrap {
        width: 150px;
     }  
     .search_bar { 
        width: 50%;
    }
 }
 @media only screen and (max-width: 500px) {
     .side_bar_wrap {
        display:none;
     }  
     .search_bar { 
        width: 100%;
    }
 }
  

Является ли мой первый метод допустимой практикой или я не должен так поступать? Может кто-нибудь посоветовать мне, если я делаю это правильно или неправильно, плз?

Комментарии:

1. Вы можете получить лучший ответ на codereview.stackexchange.com (однако ознакомьтесь с их часто задаваемыми вопросами).

Ответ №1:

Вы ищете лучшие практики, и решения для подобных вопросов часто основаны в первую очередь на мнениях. Тем не менее, я постараюсь дать объективный ответ.

На мой взгляд, наиболее удобным вариантом было бы использовать метод 2, т. Е. Свести селекторы мультимедиа к минимуму:

  • Это легко позволяет разделить CSS для разных мультимедийных устройств на отдельные файлы.
  • У вас есть лучшее представление о том, что нужно настроить для разных макетов: вместо того, чтобы разбрасывать их, вы храните их в одном месте.
  • Это уменьшает размер выходного кода CSS, что означает незначительно более быстрое время загрузки.

Минусы в том, что вы разбрасываете семантически связанные определения, т. Е. В этом примере правила для #menu разбросаны повсюду:

 #menu { base rules ... }
other base selectors and rules ...

@media only screen and (max-width: 500px) { #menu { custom rules 1 } }
@media only screen and (max-width: 700px) { #menu { custom rules 2 } }
  

Одним из решений этого было бы отказаться от попыток определить базовые правила и определить все, что необходимо настроить в селекторах мультимедиа. Это не очень хороший подход, поскольку вы легко нарушаете принцип «Не повторяйся«. Другим, лучшим подходом было бы ввести базовые контейнеры, например #menu-container , которые имеют постоянные базовые правила, а затем #menu «реализацию», в которой правила определены исключительно в @media селекторах.
В любом случае, смысл не в том, чтобы смешивать базовые правила с правилами, зависящими от устройства, поскольку это создает путаницу при чтении и изменении кода. (Исключением являются правила, которые определяют макет по умолчанию на всех устройствах; я бы сохранил эти правила, зависящие от конкретного устройства.)

Комментарии:

1. Спасибо за ваше объяснение @ rr- Могу я спросить, является ли мой метод 1 логически неправильным или нет правильного / неправильного пути? Теперь я понимаю плюсы и минусы метода 2, но в моем первом методе плюсы, которые я вижу, заключаются в том, что медиа-запросы семантически связаны с элементами (которые, как я считаю, легче поддерживать), и это дает более точное выравнивание для каждого элемента. Но минусы в том, что это добавляет дополнительные медиа-запросы, и при просмотре всего css будет слишком много различных точек останова. Так вызовет ли это какие-либо другие эффекты для браузера, кроме медленной скорости загрузки, которая может быть незначительной?

2. На самом деле, это не вызовет никаких проблем. Ваш аргумент в пользу метода 1 верен, и я думаю, это правда, что нет правильного / неправильного пути. Все зависит от масштаба вашего проекта: чем больше проект, тем больше метод 2 упростит его обслуживание.

3. Спасибо, что поделились своим мнением @rr-. Ваш совет действительно помог. Я приму ваше предложение к сведению и рассмотрю свой код с учетом будущего обслуживания. Еще раз спасибо.