powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Как с помощью css3 "вытащить" содержимое блока за его пределы ?
4 сообщений из 4, страница 1 из 1
Как с помощью css3 "вытащить" содержимое блока за его пределы ?
    #38695142
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходная задача заключалась в реализации вертикальной многоколоночной вёрстке больших списков с изменяемым числом столбцов, зависящим от горизонтального разрешения. Без использования javascript и без использования возможностей css3. Т.е. эта вёрстка должна работать и на старых браузерах с отключенными скриптами.

Именно в такой постановке задача нерешаема. Необходимы какие-то "послабления".
Поэтому, остановился на самом оптимальном варианте:

1 . На уровне html с использованием css2 оформляю минимальное число столбцов, которое должно быть при минимальном горизонтальном разрешении (минимальной ширине контейнера):
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<div id="wrapper">
    <div class="column">
        <div class="item">...<span>item1<span>...</div>
        <div class="item">...<span>item2<span>...</div>
        <div class="item">...<span>item3<span>...</div>
    </div>
    <div class="column">
        <div class="item">...<span>item4<span>...</div>
        <div class="item">...<span>item5<span>...</div>
        <div class="item">...<span>item6<span>...</div>
    </div>
...
</div>

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

Далее, если браузер поддерживает css3, на уровне css выполняются следующие действия:

2 . Все блоки-столбцы <div class="column"> переводятся в такое состояние, при котором содержащиеся внутри них элементы ведут себя так, как будто блоков класса column нет, а их родителем является блок wrapper.

3 . Используя возможности css3 (например, CSS Multi-column Layout Module ), оформить элементы класса item в виде колонок.
================================================================================================

Сабжевый вопрос заключается в том, каким образом, используя возможности css3, реализовать пункт №2 ?

Можно все элементы внутри столбцов сделать плавающими, а столбцам задать свойство [overflow: visible] - в этом случае блок-столбец "схлопнется" по вертикали, а элементы будут вести себя так, как будто блока-столбца и нет. Этот вариант не реализуем, поскольку:
а) сами элементы списка либо содержимое этих элементов не должны быть плавающими (исходное условие)
б) css3-column-свойства с плавающими элементами будут работать некорректно (вернее, не так, как нужно)

Другой вариант - использовать псевдоэлементы :after и :before для закрытия тега <div class="column"> (сразу после оного) и открытия тега </div> (сразу перед оным). Т.е. из одного столбца с элементами получим два пустых столбца. Этот вариант тоже не реализуем, т.к. псевдоэлементы :after и :before работают только с текстом (теги в свойстве content будут восприниматься как строки).

Может ли css3 справиться с этой задачей ?
Скрипты использовать нельзя.
...
Рейтинг: 0 / 0
Как с помощью css3 "вытащить" содержимое блока за его пределы ?
    #38695408
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожно все элементы внутри столбцов сделать плавающими, а столбцам задать свойство [overflow: visible] - в этом случае блок-столбец "схлопнется" по вертикали, а элементы будут вести себя так, как будто блока-столбца и нет. Этот вариант не реализуем, поскольку:
а) сами элементы списка либо содержимое этих элементов не должны быть плавающими (исходное условие)
б) css3-column-свойства с плавающими элементами будут работать некорректно (вернее, не так, как нужно)Даже если упростить задачу и допустить ту возможность, что элементы списка (которые являются блоками) могут быть плавающими, то и в этом случае получаем проблему: css3-column-свойства , очевидно, будет применены к блокам-столбцам, а не к элементам внутри них. А необходимо, чтобы эти column-свойства были применены ко всем элементам списка из всех столбцов одновременно.
...
Рейтинг: 0 / 0
Как с помощью css3 "вытащить" содержимое блока за его пределы ?
    #38695424
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. для того, чтобы получить сабжевую кроссбраузерную многоколоночную вёрстку, достаточно решить одну из двух альтернативных задач:

Задача 1 . С помощью css (без использования javascript) все блоки-столбцы <div class="column"> перевести в такое состояние, при котором содержащиеся внутри них элементы ведут себя так, как будто блоков класса column нет, а их родителем является блок wrapper. В этом случае можно будет применить к блоку wrapper css3-column-свойства.

Задача 2 . Разместить элементы <div class="item">...<span>item i<span>...</div> в заранее известное число колонок без использования вспомогательных блоков-колонок . В этом случае необходимость "избавления" от блоков-колонок отпадает.

Для определённости возьмём конкретные цифры :
- общее число элементов = 9
- число столбцов = 3
- число элементов в одном столбце = 3

Задача : сверстать эти элементы так, чтобы они были расположены в 3 столбца:
Item 1 Item4 Item7
Item 2 Item5 Item8
Item 3 Item6 Item9

Условия :
1. Каждый элемент - это блок (div)
2. Высота элемента (в пикселах) неизвестна
3. Каждый элемент может занимать и более одной строки, если не умещается в одну строку (работает автоматический перенос текстового содержимого)
4. Все колонки должны быть одинаковой ширины
5. Колонки могут быть разной высоты, если некоторые элементы занимают более одной строки
6. Каждому элементу индивидуально можно присваивать любые классы (т.е. задавать любые свойства), главное, чтобы механизм присваивания свойств был алгоритмически детерминирован и опирался только на известные данные

Например, код может быть таким:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<div id="wrapper">
    <div class="item column1 first">...<span>item1</span>...</div>
    <div class="item column1">...<span>item2</span>...</div>
    <div class="item column1 last">...<span>item3</span>...</div>    
    <div class="item column2 first">...<span>item4</span>...</div>
    <div class="item column2">...<span>item5</span>...</div>
    <div class="item column2 last">...<span>item6</span>...</div>    
    <div class="item column3 first">...<span>item7</span>...</div>    
    <div class="item column3">...<span>item8</span>...</div>    
    <div class="item column3 last">...<span>item9</span>...</div>    
</div>

<style>
    .item { float: left; }
    .column1 { margin-left: 0; }
    .column2 { margin-left: 33%; }
    .column3 { margin-left: 66%; }    
</style>


или таким:
Код: html
1.
2.
3.
4.
5.
6.
7.
<style>
    .item { float: none; }    
    .column1 { margin-left: 0; }
    .column2 { margin-left: 33%; }
    .column3 { margin-left: 66%; }    
    .first { margin-top: -100%; }  /* поднимаем столбец вверх */
</style>


P.S. Задача кажется простой, особенно, когда почти всё известно. Только вот хрен. Не решается она просто.
Вот из этих 7 вариантов единственный, который удовлетворяет условиям (без использования блоков-колонок, элементы следуют сверху вниз) - 6-й. Только вот высота элементов неизвестна, а [margin-top: -100%] работает не так, как нужно.
...
Рейтинг: 0 / 0
Как с помощью css3 "вытащить" содержимое блока за его пределы ?
    #38695792
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой вариант решил бы все проблемы:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>  

<style>
    #wrapper { width: 300px; height: 500px; background: rgb(200,200,200); }
    .item { float: none; }
    .column1 { margin-left: 0; }
    .column2 { margin-left: 33%; }
    .column3 { margin-left: 66%; }
    .column2.first { margin-top: -100%; }
    .column3.first { margin-top: -100%; }
</style>

</head>
<body>

<div id="wrapper">
    <div class="item column1 first"><span>item1</span></div>
    <div class="item column1"><span>item2</span></div>
    <div class="item column1 last"><span>item3</span></div>    
    <div class="item column2 first"><span>item4</span></div>
    <div class="item column2"><span>item5</span></div>
    <div class="item column2 last"><span>item6</span></div>    
    <div class="item column3 first"><span>item7</span></div>    
    <div class="item column3"><span>item8</span></div>    
    <div class="item column3 last"><span>item9</span></div>    
</div>

</body>
</html>


Но какого хрена вертикальные отступы (margin) отсчитываются от ширины родительского элемента, а не от его высоты ?
Кто-то может возразить:
авторЕсли значение width элемента div изменится, изменится также и верхнее поле. Кажется странным? Считаем, что высота большинства элементов в нормальном потоке (как мы предполагаем) такова, чтобы вместить их элементов потомков, включая поля. Если верхнее и нижнее поля элемента задать как процент от высоты родителя, это может привести к бесконечному циклу: высота родителя увеличивалась бы, чтобы вместить верхнее и нижнее поля, которые затем должны были бы увеличиться соответственно новой высоте и т. д.

Вместо того чтобы просто игнорировать процентные значения для верхнего и нижнего полей, авторы спецификации решили соотнести их с шириной родительского элемента, которая не меняется в зависимости от ширины его потомков.Возникает вопрос: а что - линейные функции уже не решаются ?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Как с помощью css3 "вытащить" содержимое блока за его пределы ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]