таблицы на web ресурсе
Вывожу таблицы на web ресурсе для работы. Разные базы данных.
Хотел реализовать, чтобы при прокрутке таблицы вниз заголовки колонок оставались на месте. Как в экселе закрепление области, например.
Предполагаю, что можно сделать фреймами. Но как? :confused:
Сайт работает на Апаче, пхп 5 и мускуле 5. При выводе таблиц на экран естественно делаю запросы типа SELECT в мускул. Вернувшийся массив обрабатываю и циклом вывожу в хтмл. :)
Делаешь таблицу по центру страницы. С одной строчкой, в каждой ячейке - название заголовка таблицы.
Ровно под ней делаешь ифрейм, и в нём уже генеришь основную таблицу. Будешь скроллить саму таблицу - и всё будет гуд, т.к. скролится по сути содержимое ифрейма.
Правда тут могут возникнуть проблемы с шириной ячеек. Т.е. не будет совпадать ширина заголовков с щириной ячеек в которых контент.
Другой вариант - это генерить нормально таблицу на странице, а вверху страницы прилепить див с названиями заголовков, и сделать так что-б при скролле страницы див "приклеивался" к заголовку окна и скроллился со всей страницей , примерно как тут (окошко справа снизу) - http://www.wtfmacos.ru/
[HTML]
<div>
<div style="width:300px;">
<table width="100%">
<tr><th>Header 1</th><th>Header 2</th></tr>
</table>
</div>
<div style="overflow:scroll; width:300px; height:300px;">
<table width="100%" style="text-align:center">
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr><td>1</td><td>2</td></tr>
</table>
</div>
</div>
[/HTML]
т.е. поиграться с css overflow.
Да да... Только у варианта этого трабла: не совпадает ширина ячеек (шапки и ячеек таблицы снизу)...
А мне что-то не спится сегодня, решил поломать себе мозг.
Пришла идея:
Можно решить проблему ценой дублирования шапки. При этом, для второй таблицы задаем отрицательный margin, равный высоте шапки.
Вот собственно и вся идея.
Вопрос лишь в том, как это наиболее корректно реализовать c причудами браузеров. IE, например, рисует скролл не туды, по крайней мере 6 версия... Бордюрчики не везде зачетные.
Мой чудо код:
[HTML]<!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>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Хэй мэээн, я тут таблоид скроллю, а это, типа, шапка на месте там и все такое...</title>
<style type="text/css">
div.tbl
{
background-color: #D4D0C8;
border: 1px solid gray;
width: 600px; /* Ширина таблички */
padding: 0px;
margin: 0px;
}
div.tbl div.head
{
border: 0px;
padding-right: 16px;
padding-right: expression('0px'); /* я тоже крут */
}
div.tbl table
{
border: 0px;
border-collapse:collapse;
width: 100%;
}
div.tbl table th
{
height: 45px;
border: 1px solid gray;
background-color: #EEE;
}
div.tbl table.data
{
margin-top: -48px;
}
div.tbl table.data th
{
visibility:hidden;
}
div.tbl table.data td
{
background-color: white;
border: 1px solid gray;
border-bottom: 0px;
}
div.tcontent
{
overflow-y: scroll; /* а вот захотелось */
height: 150px;
}
</style>
</head>
<body>
<div class="tbl">
<div class="head">
<table>
<tr>
<th>Наименоваине</th>
<th>Начальный остаток</th>
<th>Приход</th>
<th>Расход</th>
<th>Конечный остаток</th>
</tr>
</table>
</div>
<div class="tcontent">
<table class="data">
<tr>
<th>Наименоваине</th>
<th>Начальный остаток</th>
<th>Приход</th>
<th>Расход</th>
<th>Конечный остаток</th>
</tr>
<tr><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr>
<tr><td>2</td><td>2</td><td>2</td><td>2</td><td>2</td></tr>
<tr><td>3</td><td>3</td><td>3</td><td>3</td><td>3</td></tr>
<tr><td>4</td><td>4</td><td>4</td><td>4</td><td>4</td></tr>
<tr><td>5</td><td>5</td><td>5</td><td>5</td><td>5</td></tr>
<tr><td>6</td><td>6</td><td>6</td><td>6</td><td>6</td></tr>
<tr><td>7</td><td>7</td><td>7</td><td>7</td><td>7</td></tr>
<tr><td>8</td><td>8</td><td>8</td><td>8</td><td>8</td></tr>
<tr><td>9</td><td>9</td><td>9</td><td>9</td><td>9</td></tr>
<tr><td>A</td><td>A</td><td>A</td><td>A</td><td>A</td></tr>
<tr><td>B</td><td>B</td><td>B</td><td>B</td><td>B</td></tr>
</table>
</div>
</div>
</body>
</html>
[/HTML]
Есть идеи?
Но во всех вариантах, контент колонки и колонки шапки разлазятся, если текст контента шире, чем название колонки.
Надо еще поиграться.
Но во всех вариантах, контент колонки и колонки шапки разлазятся, если текст контента шире, чем название колонки.
Да да, хреновая идея пришла, как и все, приходящие на ночь глядя...
Лажа в том, что цена при таком подходе заключается не только в копировании заголовков вниз, но также и данные необходимо дублировать вверх.
А это писец.
Незачет, Андрюшенька, дорогой, незачет.
Хотя твой вариант работал и на IE8.
CSS знаю слабо, подскажи в каком месте чел по твоей ссылке отработал ширину колонок?
P/s/ В идеале конечно хотелось бы не использовать жаву скрипт. Не доверяю я клиенту :)
Ну так сказали бы, что готовы использовать JS фреймворки.
А на ДИВах будет не проще? Если я правильно понял задачу, конечно.
<table border=1 width='400'>
<tr>
<th width='100'>Заголовок</th>
<th width='100'>Заголовок</th>
<th width='100'>Заголовок</th>
<th width='100'>Заголовок</th>
</tr>
</table>
</div>
<div style='width: 500px; text-align: center; margin: 0; height: 100px; overflow: scroll;'>
<table border=1 width='400'>
<tr>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
</tr>
<tr>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
</tr>
<tr>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
</tr>
<tr>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
</tr>
<tr>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
<td width='100'>Содержимое</td>
</tr>
</table>
</div>
Фаил стиля me.css:
[HTML]
body {
margin: 0px 0px 0px 0px;
padding: 0px 0px 0px 0px;
background: #333333;
color: #dadada;
}
h1 {
text-align:center;
color:#00749E;
}
#title {
width:300px;
height:300px;
left:489px;
position:absolute;
}
#board {
width:300px;
height:300px;
overflow:scroll;
position:absolute;
margin:4px 15px;
top:100px;
left:475px;
display:block;
}
#TR {
margin:0px 0px;
display:table-row;
border:1px solid #00749E;
}
#TD {
height:30px;
width:120px;
padding:10px;
display:table-cell;
border:1px solid #00749E;
}
[/HTML]
Файл index.html
[HTML]
<html>
<head>
<title>Boards 'R' Us</title>
<link href="me.css" type="text/css" rel="stylesheet" />
</head>
<body>
<div id="title">
<h1>Boards 'R' Us Sales Report</h1>
<hr style="width:300px;" />
</div>
<div id="board">
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">Showboards Sold </p> <p id="TD">1012</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What I Sell'em For </p> <p id="TD">$249.95</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What it Costs Me </p> <p id="TD">$84.22</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">Showboards Sold </p> <p id="TD">1012</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What I Sell'em For </p> <p id="TD">$249.95</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What it Costs Me </p> <p id="TD">$84.22</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">Showboards Sold </p> <p id="TD">1012</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What I Sell'em For </p> <p id="TD">$249.95</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What it Costs Me </p> <p id="TD">$84.22</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">Showboards Sold </p> <p id="TD">1012</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What I Sell'em For </p> <p id="TD">$249.95</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What it Costs Me </p> <p id="TD">$84.22</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">Showboards Sold </p> <p id="TD">1012</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What I Sell'em For </p> <p id="TD">$249.95</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What it Costs Me </p> <p id="TD">$84.22</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">Showboards Sold </p> <p id="TD">1012</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What I Sell'em For </p> <p id="TD">$249.95</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What it Costs Me </p> <p id="TD">$84.22</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">Showboards Sold </p> <p id="TD">1012</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What I Sell'em For </p> <p id="TD">$249.95</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What it Costs Me </p> <p id="TD">$84.22</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">Showboards Sold </p> <p id="TD">1012</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What I Sell'em For </p> <p id="TD">$249.95</p>
</p>
<p id="TR">
<p style="background:e0e0e0; color:#000;" id="TD">What it Costs Me </p> <p id="TD">$84.22</p>
</p>
</div>
</body>
</html>
[/HTML]:
Для осла потребуются CSS хаки.
Недопонял ты проблемку. Попробуй в своей таблице ввести в одну из ячеек длинный набор символов:
например: "Содержаниееееееееееееееееееееееееееееееееееееее".
Ты увидишь, что случится с твоей шапкой. :rolleyes:
Фаил стиля me.css:
Для осла потребуются CSS хаки.
Хм. это что такое? в IE и Firefox отображется вообще по разному. Да и где здесь фиксация шапки то ? :eek:
например: "Содержаниееееееееееееееееееееееееееееееееееееее".
Ты увидишь, что случится с твоей шапкой. :rolleyes:
ну про произвольную ширину речи не было.
Тогда задать каждой таблице свой ID и сравнивать типа такого:
w1 = document.getElementById('tb1').style.width;
w2 = document.getElementById("tb2").style.width;
if (w1>w2) document.getElementById("tb2").style.width = w1;
else document.getElementById("tb1").style.width = w2;
</script>
только не забудь проставить у таблиц ширину стилями
...
только не забудь проставить у таблиц ширину стилями
Что-то мне подсказывает, что так просто не отделаться.
Если ширина ячейки изменится автоматически при добавлении текста, то получить реальную ширину через style.width не выйдет.
style.width вернет те же 400px.
Поэтому придется шаманить...
Видимо с такими методами, как getBoundingClientRect().
Пока не разбирался.
Все, что реализованно на фрейморвке спокойно может быть решено и без применения оного. Вопрос чаще всего упирается в уровень квалификации разработчика.
Если ширина ячейки изменится автоматически при добавлении текста, то получить реальную ширину через style.width не выйдет.
style.width содержить значение inline style, т.е. то, что явно прописано в атрибуте style элемента. Для текущего определения ширины (динамичесвкой или заданной через CSS файл) таким образом ширину узнать нельзя, для этого существуют другие методы.
какие, если не секрет?
Не секрет, но тут тебе помодет гугл. К тому тему даже на этом форуме поднимали пару раз и я даже в них отвечал. Повторятся влом, кому нужно найдет в поиске ;) ну и полезная практика ему будет.
Если речь идет о:
То, в данном случае, ничего не выйдет (работать будет только в Firefox).
Шаманить надо либо со всей веткой, расчитывая все оффсеты, поля да отступы, либо с getBoundingClientRect(), либо незнаю что еще.
Короче, копаем исходники фреймворков, например, метод width() в jquery.