Border-стили на CSS-подобной матрице, без дополнительных классов - PullRequest
2 голосов
/ 26 октября 2011

Я делаю макет в виде таблицы, используя только CSS.Со всеми ячейками, установленными на float:left, контейнер .matrix достаточно широк для 4 ячеек по горизонтали.

<div class="matrix">
    <!-- first row -->
    <div class="cell">Cell contents</div>
    <div class="cell">Cell contents</div>
    <div class="cell">Cell contents</div>
    <div class="cell right">Cell contents</div>
    <!-- last row -->
    <div class="cell last">Cell contents</div>
    <div class="cell last">Cell contents</div>
    <div class="cell last">Cell contents</div>
    <div class="cell last right">Cell contents</div>
</div>

Чтобы контролировать применение стилей границ, я использую классы .last и .rightчтобы пропустить стили границ по краям:

.cell {
    border-bottom:1px solid red;
    border-right:1px solid red;
}
.right {
    border-right:none;
}
.last {
    border-bottom:none;
}

Мне интересно, есть ли у кого-нибудь техника, в которой я добиваюсь того же результата / логики - но без необходимости в дополнительных классах.

Спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 26 октября 2011

Есть способ, однако он использует некоторые селекторы, которые старые браузеры не могут понять.Ваше решение самое безопасное, поэтому оно наиболее распространенное.

В CSS3 есть множество новых селекторов, некоторые из которых могут решить вашу проблему.Вот интересный список полезных селекторов

1 голос
/ 28 октября 2011

Я думаю, что нашел решение, не используя дополнительные классы, селекторы CSS3 или элементы-обертки.Задав контейнеру overflow:hidden и немного сместив ячейки так:

.matrix{
    width:400px;
    overflow:hidden;
}

.cell {
    width:100px;
    float:left;
    border-left:1px solid #ccc;
    border-bottom:1px solid #ccc;
    position:relative;
    bottom:-1px;
    padding:5px;
    left:-1px;
}

См. Пример здесь: http://jsfiddle.net/KBMvL/5/

1 голос
/ 26 октября 2011

Если вы используете элемент-обертку вокруг строк, вы можете использовать CSS :last-child для работы как с ячейками справа, так и с ячейками внизу.

Я предполагаю, что ваш элемент-обертка также будет <div>:

.cell {
    border-bottom:1px solid red;
    border-right:1px solid red;
}

.matrix>div:last-child>.cell, .matrix>div>.cell:last-child {
    border-bottom:none;
}

Но учтите, что :last-child не поддерживается IE8 и более ранними версиями.

Возможно, вам больше повезет, установив противоположные границы (т. Е. Сверху и слева), и вместо этого используйте :first-child, чтобы убрать крайнюю левую и верхнюю ячейки, потому что :first-child поддерживается IE7 и IE8. Конечный результат будет точно таким же.

Подробнее о поддержке браузером селекторов CSS можно узнать здесь: http://quirksmode.org/css/contents.html

Если вам нужно использовать :last-child и вам нужно поддерживать IE7 / 8, то вы можете получить его, используя библиотеку javascript, такую ​​как Selectivizr .

Однако, после всего этого, я бы также сказал, что, учитывая элемент обертки, который я добавил для строк, мы получаем ту же базовую структуру, что и таблица HTML. Итак, вопрос в том, почему бы просто не использовать таблицу? Затем вы можете использовать border-collapse для достижения аналогичных результатов.

Что касается этого последнего пункта, я знаю, что вы поставили «без таблиц» в качестве тега в вопросе, поэтому я предполагаю, что вы работаете над дизайном без таблиц. Однако, если данные действительно имеют табличный характер, то нет ничего плохого в использовании таблицы. Дизайн без таблиц предназначен для того, чтобы запретить людям использовать таблицы для произвольного макета страницы, но таблицы по-прежнему идеально подходят для использования в правильном контексте. Описание в вопросе действительно звучит так, как будто ваш пример попадает в эту категорию.

Надеюсь, это поможет.

1 голос
/ 26 октября 2011

Вот как вы это сделаете, используя CSS :nth-child селекторы

.matrix{
    width:400px;
}

.cell {
    border-bottom:1px solid red;
    border-right:1px solid red;
    float:left;
    padding:.5em;
}

.cell:nth-child(n+5):nth-child(-n+8){
    border-bottom:none;
}

.cell:nth-child(4), .cell:nth-child(8){
    border-right:none;
}

Пример: http://jsfiddle.net/KBMvL/

...