МЕНЬШЕ вложенных стилей для имитации макета html?

Этот вложенный беспорядок - это то, как выглядит макет моей таблицы стилей less (за вычетом любых реальных стилей):

#branding {
    h1 {

    }
    #tagline {

    }
    .ticker {

    }
    nav {
        ul {
            li {
                a {

                }
            }
        }
    }
    #search-form {
        input {

        }
        button {

        }
    }
}
#masthead {
    #store-locator {

    }
    #slider {
        ul {
            li {

            }
        }
    }
    #events {
        article {
            img {

            }
            h4 {

            }
            p {

            }
        }
    }
}
#main {
    #buckets {
        ul {
            li {
                img {

                }
                h3 {

                }
                .description {
                    .author {
                        a {

                        }
                    }
                    p {

                    }
                    blockquote {

                    }
                }
                .more {

                }
            }
        }
    }
    #social-feed {
        hgroup {

        }
        #filters {
            ul {
                li {

                }
            }
        }
        #feeds {
            .feed-column {
                > div {
                    img {

                    }
                    h3 {
                        span {

                        }
                    }
                    .description {
                        p {

                        }
                        .author {
                            a {

                            }
                        }
                    }
                }
            }
        }
        #feed-amount {
            a {
                &:before {

                }
                &:after {

                }
            }
        }
    }
}
#summary {
    nav {
        ul {
            li {
                a {

                }
            }
        }
    }
    #newsletter-form {
        h4 {

        }
        input {

        }
        button {

        }
    }
    #stay-connected {
        h4 {
            a {

            }
        }
    }
    #donation {

    }
    #contact-info {
        #contact-number {
            span {
                strong {

                }
            }
        }
        #contact-details {
            address {
                strong {
                    a {

                    }
                }
            }
            p {

            }
        }
    }
}

Это имеет смысл для меня в некотором смысле, потому что это имитирует макет разметки, но у него есть некоторые серьезные недостатки, такие как чрезмерно специфичные селекторы, IE:

#main #social-feed #feeds .feed-column > div .description p {}

У меня вопрос, как лучше оформить этот документ?

Я злоупотребляю LESS здесь? Я искал «примеры таблицы стилей LESS» и подобные вещи, но не смог найти ни одного примера таблицы стилей less целиком — может ли кто-нибудь предоставить мне пример хорошо продуманного документа less?


person Ivan Durst    schedule 04.01.2013    source источник


Ответы (2)


Раздувание селекторов, как вы иллюстрируете, как один из «серьезных недостатков», - вот почему я бы экономно использовал вложенность селекторов. Для меня не так важно, чтобы CSS точно соответствовал макету разметки. Я могу использовать несколько разреженных комментариев, чтобы помочь мне понять, в каком «разделе» я нахожусь в CSS. Итак, позвольте мне высказать некоторые мысли о том, как я могу что-то изменить.

Держитесь рядом, а не обязательно вложенными

Пример

/* branding */

#branding {
    h1 { }

    .ticker { }

    nav {
        ul { }
        li { }
        a { }
    }
}

#tagline { }

#search-form {
    input { }
    button { }
}

Обсуждение

Во-первых, обратите внимание, как поставить комментарий в качестве заголовка моего раздела, а не просто использовать #branding для группировки всего. Это мое сохранение некоторой «структуры», такой как html, я группирую по основным заголовкам «обертки» и держу их рядом друг с другом.

Во-вторых, любой тег id должен иметь собственную вложенную группу верхнего уровня, при условии, что вы правильно структурируете свой HTML, чтобы сохранить уникальный идентификатор страницы. Единственным исключением, на мой взгляд, будет случай, когда вы используете некоторый класс элемента body для переключения внешнего вида на страницах, и часть этого изменения внешнего вида включает изменение стиля элемента, выбранного id (но даже это может быть обработано по-прежнему поставив id в качестве верхнего уровня; см. «Используйте силу &» ниже). Вот я и вытащил ваши #tagline и #search-form из гнезда под #branding.

В-третьих, подумайте о своем дизайне и коде для минимального раздувания. Например, если у вас есть другие элементы nav на странице (вспомогательные элементы навигации в боковых панелях и т. д.), то стоит вложить nav в #branding. Аналогично, если у вас есть другие h1 или .ticker использования вне этой оболочки. Однако обычное гнездо, которое я презираю, — это гнездо ul li a. Если единственный список внутри nav — это ul, то нет причин вкладывать в него li и в итоге получить ul li в строке селектора, потому что все li находятся там. Точно так же, если только теги a в nav находятся внутри списка, то нет необходимости вкладывать их. Имея этот css...

#branding nav ul { }
#branding nav li { }
#branding nav a { }

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

Используйте возможности &

Мне нравится идея использовать & для добавления ключевые родители для кодирования. Вспомните приведенное выше исключение о добавлении класса к элементу body для управления темами (или внешним видом) на разных страницах. Вы можете вложить его в класс темы или сделать так:

Пример

#branding {
    .theme1 & { }
    .theme2 & { }

    h1 { }

    .ticker { }

    nav {
        ul { }
        li { }
        a { }
    }
}

Обсуждение

Что затем создаст селектор типа .theme1 #branding для изменения внешнего вида #branding по классу темы. Если вам это нужно для изменения свойств вложенных в него элементов, вы можете сделать это различными способами (это сильно зависит от того, какую структуру вы хотите получить в конечном результате). Один из способов добавить его только к тому, что необходимо:

Пример

#branding {
    .theme1 & { }
    .theme2 & { }

    h1 { 
      .theme2 & { //special code only for theme2 here }
    }

    .ticker { }

    nav {
        ul { 
          //main code here
          .theme1 & { //special code here }
          .theme2 & { }
        }
        li { }
        a { }
    }
}

Обсуждение

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

#branding nav ul {}
.theme1 #branding nav ul {}
.theme2 #branding nav ul {} 
#branding nav li {}
#branding nav a {}

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

Конечно, использование & для обычного добавления по-прежнему полезно при вложении, так что...

a {
  &:hover {}
}

... для создания информации a:hover {} независимо от того, насколько глубоко может быть вложен a, это отличное использование вложенности и & в сочетании.

Заключение

Безусловно, на эту тему можно было бы сказать больше. Суть в том, чтобы использовать мощь препроцессоров там, где это необходимо, а не только потому, что они доступны. Для меня примеси — более полезная часть препроцессоров, чем вложенность.

person ScottS    schedule 04.01.2013
comment
Очень подробный, поучительный ответ. Это имеет смысл, что идентификаторы не должны быть вложенными, и я даже не знал об использовании & таким образом для нацеливания на родителя. Спасибо, что нашли время, чтобы объяснить это мне, я надеюсь, что это поможет и другим - person Ivan Durst; 05.01.2013

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

Если ваша цель - просто визуальная иерархия, вы можете сделать это без реальной вложенности:

#social-feed {
    /**/
}
    #feeds {
        /**/
    }

Обычно не имеет смысла вкладывать селекторы идентификаторов (например, #foo #bar) (пока иерархия ваших элементов постоянна на разных страницах).

Кроме того, имеет смысл использовать дочерний комбинатор, когда это применимо:

nav {
    & > ul {
        & > li {
            & > a {

            }
        }
    }
}

так что результирующий селектор (NAV > UL > LI > A) может работать потенциально быстрее, чем селектор контекста (NAV UL LI A или NAV A).

person Marat Tanalin    schedule 04.01.2013
comment
Я согласен, отличная точка зрения на визуальную иерархию без вложенности. Результирующий CSS теперь может быть таким же, как если бы я набрал его вручную, чего не было бы в случае вложения. - person Ivan Durst; 05.01.2013