ShadowOfCasper
@ShadowOfCasper
Middle User Interface Web Developer

Как отфильтровать все элементы страницы, выбрав только те, у которых есть определённое css свойство?

Всем привет, меня тут забодала одна фича.
Интро:
Все мы прекрасно понимаем, что для расположения блоков в одну линию достаточно использовать сетку. Все гриды, которые я использовал когда либо опираются на float (грёбаный костыль). Меня бы всё радовало, если бы флоуты действительно предназначались именно для расположения блоков в одну строку, но это не так и у свойства есть один побочный эффект.
Стандартно все блоки наследуют высоту по совокупности размещённых внутри дочерних блоков или строк. Но если мы дадим блоку float (неважно какой), то height auto будет равно нулю. Соответственно все блоки что ниже, подползают выше. А дальше идут костыли типа статического height или margin-top следующего блока за блоком с float.
Суть:
Меня это заманало. Я даже написал и пробнул сетку, которая опирается на inline-block с margin-right: -4px. Но inline block это вообще какая-то недетская жуть. Если в inline-block вкрутить ещё один inline-block, начнутся баги и фаршмаг.
Решение:
Я решил написать небольшой скрипт, который исправит недочёт флоутов.
1) Брать все элементы с css('float') - но селектора подобного нет - как их все выбрать не могу додуматься.
2) У каждого элемента с float находить массив дочерних и у каждого дочернего брать высоту.
3) Сравнивать все высоты и самую большую возвращать в блок с float, в css height.

2е и 3е - не проблема, а вот на первом я туплю.
  • Вопрос задан
  • 266 просмотров
Решения вопроса 2
$(document).each(function(){
if($(this).css('float') == 'left' || $(this).css('float') == 'left') {
...
}
});

не по-феншую, конечно, но тем не менее...

а вообще, overflow: hidden решает проблему нулевой высоты без подобных костылей...
UPD: тоже костыль, конечно, и тоже не по назначению, но он таки дает динамическую высоту "в одну строчку" средствами CSS.
Ответ написан
@RoverWhite
$('*').filter(function(idx,elem){if ($(elem).css('float') != 'none') {return true;} return false})


Естественно вместо $('*') Вы пишете селектор который переберет все дочерние элементы в Вашей таблице
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ShadowOfCasper
@ShadowOfCasper Автор вопроса
Middle User Interface Web Developer
еее нигеры, работет.
$('body').find('*').each(function(){
        var floatElem = $(this);
        if(floatElem.css('float') == 'left' || floatElem.css('float') == 'right') {
            var floatElemHeight = floatElem.outerHeight();
            var floatElemParent = floatElem.parent();
            var otherfloatElems = floatElemParent.children().not(floatElem);
            var maxHeight = floatElemHeight;
            if(otherfloatElems != undefined){
                otherfloatElems.each(function(){
                    var otherfloatElemHeight = $(this).outerHeight();
                    if(otherfloatElemHeight > maxHeight){
                        maxHeight = otherfloatElemHeight;
                    }
                    floatElemParent.height(maxHeight);
                })
            }
        }
    });

Хоть и дико смотрится. Спасибо большое Александр Х и RoverWhite за помощь.
Не знаю, правда, кому решение отдать. Пожалуй Александр Х ибо его ответ пришёл раньше.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы