|
|
|
Как с помощью css3 "вытащить" содержимое блока за его пределы ?
|
|||
|---|---|---|---|
|
#18+
Исходная задача заключалась в реализации вертикальной многоколоночной вёрстке больших списков с изменяемым числом столбцов, зависящим от горизонтального разрешения. Без использования javascript и без использования возможностей css3. Т.е. эта вёрстка должна работать и на старых браузерах с отключенными скриптами. Именно в такой постановке задача нерешаема. Необходимы какие-то "послабления". Поэтому, остановился на самом оптимальном варианте: 1 . На уровне html с использованием css2 оформляю минимальное число столбцов, которое должно быть при минимальном горизонтальном разрешении (минимальной ширине контейнера): Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. На стороне сервера, зная общее число элементов, распределить их по столбцам не составляет проблем. Если горизонтальное разрешение будет больше минимального, то эти столбцы просто-напросто будут расширяться, не порождая никаких артефактов в вёрстке. Далее, если браузер поддерживает 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 справиться с этой задачей ? Скрипты использовать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2014, 21:54 |
|
||
|
Как с помощью css3 "вытащить" содержимое блока за его пределы ?
|
|||
|---|---|---|---|
|
#18+
авторМожно все элементы внутри столбцов сделать плавающими, а столбцам задать свойство [overflow: visible] - в этом случае блок-столбец "схлопнется" по вертикали, а элементы будут вести себя так, как будто блока-столбца и нет. Этот вариант не реализуем, поскольку: а) сами элементы списка либо содержимое этих элементов не должны быть плавающими (исходное условие) б) css3-column-свойства с плавающими элементами будут работать некорректно (вернее, не так, как нужно)Даже если упростить задачу и допустить ту возможность, что элементы списка (которые являются блоками) могут быть плавающими, то и в этом случае получаем проблему: css3-column-свойства , очевидно, будет применены к блокам-столбцам, а не к элементам внутри них. А необходимо, чтобы эти column-свойства были применены ко всем элементам списка из всех столбцов одновременно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2014, 17:58 |
|
||
|
Как с помощью css3 "вытащить" содержимое блока за его пределы ?
|
|||
|---|---|---|---|
|
#18+
Т.е. для того, чтобы получить сабжевую кроссбраузерную многоколоночную вёрстку, достаточно решить одну из двух альтернативных задач: Задача 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. или таким: Код: html 1. 2. 3. 4. 5. 6. 7. P.S. Задача кажется простой, особенно, когда почти всё известно. Только вот хрен. Не решается она просто. Вот из этих 7 вариантов единственный, который удовлетворяет условиям (без использования блоков-колонок, элементы следуют сверху вниз) - 6-й. Только вот высота элементов неизвестна, а [margin-top: -100%] работает не так, как нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2014, 18:45 |
|
||
|
Как с помощью css3 "вытащить" содержимое блока за его пределы ?
|
|||
|---|---|---|---|
|
#18+
Вот такой вариант решил бы все проблемы: Код: 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. Но какого хрена вертикальные отступы (margin) отсчитываются от ширины родительского элемента, а не от его высоты ? Кто-то может возразить: авторЕсли значение width элемента div изменится, изменится также и верхнее поле. Кажется странным? Считаем, что высота большинства элементов в нормальном потоке (как мы предполагаем) такова, чтобы вместить их элементов потомков, включая поля. Если верхнее и нижнее поля элемента задать как процент от высоты родителя, это может привести к бесконечному циклу: высота родителя увеличивалась бы, чтобы вместить верхнее и нижнее поля, которые затем должны были бы увеличиться соответственно новой высоте и т. д. Вместо того чтобы просто игнорировать процентные значения для верхнего и нижнего полей, авторы спецификации решили соотнести их с шириной родительского элемента, которая не меняется в зависимости от ширины его потомков.Возникает вопрос: а что - линейные функции уже не решаются ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2014, 12:12 |
|
||
|
|

start [/forum/search_topic.php?author=MAXUS23&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 1225ms |
| total: | 1354ms |

| 0 / 0 |
