Соединение повторяющихся и неповторяемых фонов без шва

У меня есть фон размером 700x300, который плавно повторяется внутри основного содержимого div. Теперь я хотел бы прикрепить div в нижней части content-div, содержащий другое фоновое изображение, которое не может быть повторено, плавно соединяясь с повторяющимся фоном над ним. По сути, неповторимое изображение будет выглядеть как конечная часть повторяемого изображения.

Из-за характера шаблона, если полная высота фонового изображения 300 пикселей не видна в последнем повторении фона content-div, фон в div ниже не будет легко соединяться. По сути, мне нужно, чтобы высота div содержимого была кратной 300 пикселей при любых обстоятельствах. Как лучше всего подходить к такого рода проблемам?

Я пробовал изменять размер content-div при загрузке страницы, но это работает только до тех пор, пока содержимое div не содержит динамического содержимого, изменяющего размер, что не в моем случае:

function adjustContentHeight()
{
    // Setting content div's height to nearest upper multiple of column backgrounds height, 
    // forcing it not to be cut-off when repeated.

    var contentBgHeight = 300;
    var contentHeight   = $("#content").height();
    var adjustedHeight  = Math.ceil(contentHeight / contentBgHeight);

    $("#content").height(adjustedHeight * contentBgHeight);
}

$(document).ready(adjustContentHeight);

То, что я ищу, есть способ ответить на событие изменения размера div, но там похоже, что это не так. Кроме того, предположим, что у меня нет доступа к JS, контролирующему изменение размера содержимого в content-div, хотя это потенциально способ решения проблемы.

Еще одно потенциальное решение, о котором я думал, - это смещение фонового изображения в нижнем div на определенную величину, зависящую от высоты content-div. Опять же, похоже, что недостающая часть - это способность реагировать на событие изменения размера.


person Stiggler    schedule 20.03.2010    source источник
comment
Простое выравнивание фонового изображения по низу основного содержимого div (вместо его верха) не вариант?   -  person Pekka    schedule 21.03.2010
comment
Было бы, но я намерен сделать то же самое в верхней части с верхним div. Я пропустил эту часть в надежде облегчить понимание вопроса.   -  person Stiggler    schedule 21.03.2010


Ответы (4)


Другой подход - вычислить стиль background-position для нижнего и верхнего DIV на основе размера DIV содержимого. Вы можете использовать отрицательные позиции, чтобы выровнять нижнюю часть одного по верхнему краю другого.

Еще один подход заключается в использовании многоуровневого подхода к DIV, в котором верхняя часть, содержимое и нижняя часть являются дочерними элементами родительского DIV, содержащего фон.

Преимущество этих подходов состоит в том, что они не изменяют естественную визуализацию содержимого DIV просто для управления фоном.

Пример: http://bin.googlecode.com/svn/trunk/css/repeating-bg-content.html

person nicerobot    schedule 21.03.2010
comment
Спасибо, но это не решает проблему. - person Stiggler; 21.03.2010
comment
Скорее всего, это произойдет, если вы правильно разместите x и y. То есть, исходя из размера div содержимого, вы можете точно рассчитать, где заканчивается фон, и расположить другие div, чтобы расположить начало координат так, чтобы они точно совпадали. - person nicerobot; 21.03.2010
comment
Но что, если размер div содержимого изменяется динамически? См. Часть моего вопроса под кодом; Я думаю, вы, возможно, не обратили на него внимания, поскольку в нем уже содержится ваше первое предложение, включая то, что в нем проблематично. - person Stiggler; 21.03.2010
comment
Если вы изменяете размер div, есть две причины. Размер окна изменяется, или вы управляете содержимым. У обоих есть очки событий. Один предоставляется браузером, другой - разработчиком (то есть вы изменяете контент, чтобы знать, как управлять div). С JavaScript у вас ВСЕГДА есть контроль. Вы можете заменить любую функцию собственной оболочкой или полностью заменить функцию. Может быть, PitA с хромыми библиотеками, но это всегда возможно. Но почему бы не использовать вторую альтернативу? Просто переместите div, чтобы они были дочерними по отношению к родителю, и дайте ему фон. - person nicerobot; 21.03.2010
comment
JS, который динамически изменяет размер содержимого, взят из используемой мной CMS. Мне любопытно, можно ли это сделать, не прибегая к взлому стороннего кода. Извините, но я не понимаю, как вторая альтернатива решает проблему: я работаю с несколькими фонами, которые нельзя объединить в один. Другими словами, есть один повторяющийся и один неповторяемый фон, оба из которых должны сливаться без стыка. - person Stiggler; 21.03.2010
comment
Ты прав. Вторая альтернатива не решает эту проблему, потому что я не понимал, что продолжение до конца означает другое изображение, чем повторяющееся изображение содержимого div. Я думаю, что решением будет несколько div и разделение на слои. Например, нанесение непрозрачного покрытия на верхнюю и нижнюю части. И посмотрите, как раньше реализовывались границы со скругленными углами с несколькими фрагментами изображений. И я считаю, что если вы настаиваете на решении этого javascript, я думаю, что для этого потребуется динамическое создание изображений. - person nicerobot; 21.03.2010
comment
Динамическое создание изображений звучит грубо; Думаю, лучше взломать сторонний код. :) - person Stiggler; 21.03.2010
comment
Кстати, я обновил вопрос, чтобы прояснить то, что мне нужно. Спасибо за ответ! - person Stiggler; 21.03.2010
comment
Вот пример того, что вы ищете: bin .googlecode.com / svn / trunk / css / repeat-bg-content.html он не идеален, но ясно показывает, что javascript не является решением. Это просто вопрос структурирования контента и соответствующего им стиля. Если вы не можете добиться этого с помощью своей CMS, вы можете рассмотреть другое решение CMS. - person nicerobot; 21.03.2010
comment
Спасибо, но я не думаю, что это то, что я ищу. Что касается стиля и структурирования, то CMS меня не подчиняет. - person Stiggler; 21.03.2010

Может ли установка background-position: fixed в вашем css помочь? Тогда ваш нижний div может перемещаться, но его фоновое изображение останется фиксированным по отношению к верхней части страницы. Чем больше раскрывается повторяющееся изображение, тем больше скрывается нижнее изображение.

Это будет происходить под заголовком «смещение фонового изображения в нижнем div на определенную величину в зависимости от высоты content-div», а не «высота div содержимого должна быть кратна 300 пикселей при любых обстоятельствах».

person bensaunders    schedule 24.03.2010
comment
Извините, но я не уверен, что понимаю, как это должно работать ... Вы имеете в виду «background-attachment: fixed»? Как постепенно скрывается фоновое изображение нижнего div? - person Stiggler; 26.03.2010
comment
Вы правы, я имел в виду привязанность к фону. Я думал об эффекте, продемонстрированном на явно прозрачных пунктах меню на этой странице: meyerweb.com/eric/css/edge/complexspiral/demo.html Однако если подумать об этом сейчас, я не думаю, что это сработает в вашей ситуации. Я сбивал с толку прокрутку с изменением положения относительно другого контента. - person bensaunders; 14.04.2010

Вы можете попробовать добавить прослушиватель событий в div:


        var div = document.getElementById("content");
        div.addEventListener("resize", adjustContentHeight, false);
person Angie    schedule 28.03.2010
comment
Предположительно, событие изменения размера не применяется к div: stackoverflow.com/questions/229010/ - person Stiggler; 28.03.2010
comment
Хм. Что ж, я думаю, это то, что я получаю за то, что доверяю w3schools вместо того, чтобы тестировать его сам. Их размер применим ко всем элементам HTML: w3schools.com/jsref/dom_obj_all.asp < / а> - person Angie; 28.03.2010

Если ничто не должно совпадать вверху, поместите повторяющееся изображение внизу div (чтобы переполнение перетекло поверх). Нравится:

div#repeating { background: transparent url('/path/to/image') repeat left bottom; }

person kingjeffrey    schedule 14.04.2010
comment
Да, я только что видел комментарий Пекки выше. Извините за дублирование. - person kingjeffrey; 14.04.2010