Сделать атрибуты дочерних CSS зависят от размера родительского элемента (например, запросы к файлам зависят от ширины браузера)

У меня есть структура формы, зависящая от ширины окна браузера: чтобы упростить вопрос, предположим, что он имеет три уровня (начинайте с самого широкого случая):

  • Полевая метка слева, поле ввода в центре и описание поля справа.
  • Полевая метка слева, поле ввода в центре и описание поля ниже поля ввода
  • Полевая метка сверху, поле ввода в середине и описание поля внизу

Это делается следующим образом:

@media (max-width:1000px) { /* code for 1. */ }
@media (max-width:900px) { /* code for 2. */ }
@media (max-width:800px) { /* code for 3. */ }

То, что я прошу, это получить ту же функциональность для элементов all, поэтому, когда я помещаю form в div с шириной 1000px, CSS будет применяться к этому специфические form те же свойства, которые используются для стилизации 1-го макета (max-width:1000px). Когда этот div будет уменьшаться до 800px, form должен автоматически переходить на третий макет, даже если окно просмотра все еще имеет ширину, установленную на 1000px.

Возможно ли это?

Ответ 1

Благодаря второй ссылке в комментарии @torazaburo в вопросе, я нашел идеальное решение:

https://github.com/marcj/css-element-queries

Тем не менее, он очень молод, он еще имеет некоторые уязвимости (29 июля 2013 г.), но также имеет потенциал. Он не основан на запросах @element, а на attributes. Пример:

.fooDiv[min-width="1000px"] .form { /* code for 1. */ }
.fooDiv[min-width="900px"] .form { /* code for 2. */ }
.fooDiv[min-width="800px"] .form { /* code for 3. */ }

Эти атрибуты устанавливаются слушателями, поэтому они работают с каждым изменением размера .fooDiv.


Другой проект (несовместимый с SASS/SCSS),

https://github.com/Mr0grog/element-query

будет работать следующим образом:

.test-element:media(max-available-width: 400px) {
    background: purple;
}

В приведенном выше CSS .test-element будет иметь фиолетовый фон, если он находится внутри элемента 400px в ширину или меньше.


Еще один,

https://github.com/tysonmatanich/elementQuery Я использую его в повседневных проектах.


Еще об этом:

http://coding.smashingmagazine.com/2013/06/25/media-queries-are-not-the-answer-element-query-polyfill/

Ответ 2

Не то, чтобы я знал, с точки зрения прямого CSS. Вы можете комбинировать jQuery для достижения этого. Пример jQuery:

$(document).ready(function() {
    box_size();

    $(window).resize(function() {
        box_size();
    });

    function box_size() {
        var window_width = $(window).width();

        $('.box').removeClass('break-one').removeClass('break-two').removeClass('break-three');

        if (window_width <= 1000 && window_width > 900) {
            $('.box').addClass('break-one');
        }
        else if (window_width <= 900 && window_width > 800) {
            $('.box').addClass('break-two');
        }
        else if (window_width <= 800) {
            $('.box').addClass('break-three');
        }
    }
});

Функция вызывается дважды. Однажды, когда он загружается, чтобы проверить размер и снова при изменении размера браузера.

Css:

.box {
    color: black;
}

.box.break-one {
    color: red;
}

.box.break-two {
    color: blue;
}

.box.break-three {
    color: yellow;
}

Конечно, посмотрите в действии в jsfiddle: http://jsfiddle.net/PWbvY/