Зафиксировать шапку таблицы html по условию
Здравствуйте
Есть js который фиксирует див #sidebar по двум условиям: если при прокрутке див #sidebar (в нем шапка таблицы) достигнет верха экрана если див #table_wrap (в нем шапка и таблица) окажется больше окна браузера <script type="text/javascript"> var jQnoC9 = jQuery.noConflict(); // query ноконфликт function getTopOffset(e) { var y = 0; do { y += e.offsetTop; } while (e = e.offsetParent); return y; } var block = document.getElementById('sidebar'); if ( null != block ) { var topPos = getTopOffset( block ); window.onscroll = function() { if ( jQnoC9('#table_wrap').height() >= jQnoC9(window).height() ) { // если див #table_wrap окажется больше окна браузера - то div #sidebar становится фиксированным var newcss = (topPos < window.pageYOffset) ? 'top:0px; position: fixed;' : 'position:static;'; block.setAttribute( 'style', newcss ); } } } </script> Также в таблице кнопкой скрываются и показываются строки, соответственно таблица меняет свою высоту, которая может оказаться больше или меньше окна браузера. Все работает - если таблица больше окна браузера, то соответсвено шапка таблицы при прокрутке вверх становится фиксированной. Скрываем кнопкой часть строк - таблица по высоте становится меньше и умещается в окно браузера, теперь при прокрутке вверх шапка не фиксируется. Но есть проблема, если div #sidebar при прокрутке вверх получает фиксированную позицию, а затем кнопкой скрыть часть строк (теперь таблица уместилась в окне браузера), то по условию #sidebar должен изменить позицию fixed на static, но этого не происходит. Пожалуйста, помогите решить проблему. Вот пример: http://www.glass-pgc.ru/Untitled-2.html |
Цитата:
block.style.cssText = newcss но раз используите jQuery так используйте по полной :cray: условие высота элемента больше высоты окна + прокрутка окна больше offsetTop элемента jQuery желательно новее чем 1.6.2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <div id="table_wrap"> <div id="sidebar"> <table width="1000" border="1" cellpadding="0" cellspacing="0"> <tr bgcolor="#00FFFF"><td> - прокрутите страницу вниз - шапка таблицы получит позицию fixed <br> - затем удалите часть строк (кнопка УДАЛИТЬ СТРОКИ)<br> - прокрутите страницу вверх <br><br> (теперь таблица уместилась в окне браузера), то по условию #sidebar должен изменить позицию fixed на static, но этого не происходит. <br>Как исправить?<br><br> Шапка таблицы<br> <input type="button" value="УДАЛИТЬ СТРОКИ" onclick="hideDiv();"> <input type="button" value="Показать ВСЕ строки" onclick="showDiv();"> </td></tr> </table> </div> <table width="1000" border="1" cellpadding="0" cellspacing="0"> <tr><td>1</td></tr> <tr><td>2</td></tr> <tr><td>3</td></tr> <tr class="show_hide"><td>4</td></tr> <tr class="show_hide"><td>5</td></tr> <tr class="show_hide"><td>6</td></tr> <tr class="show_hide"><td>7</td></tr> <tr class="show_hide"><td>8</td></tr> <tr class="show_hide"><td>9</td></tr> <tr class="show_hide"><td>10</td></tr> <tr class="show_hide"><td>11</td></tr> <tr class="show_hide"><td>12</td></tr> <tr class="show_hide"><td>13</td></tr> <tr class="show_hide"><td>14</td></tr> <tr class="show_hide"><td>15</td></tr> <tr class="show_hide"><td>16</td></tr> <tr class="show_hide"><td>17</td></tr> <tr class="show_hide"><td>18</td></tr> <tr class="show_hide"><td>19</td></tr> <tr class="show_hide"><td>20</td></tr> <tr class="show_hide"><td>21</td></tr> <tr class="show_hide"><td>22</td></tr> <tr class="show_hide"><td>23</td></tr> <tr class="show_hide"><td>24</td></tr> <tr class="show_hide"><td>25</td></tr> <tr class="show_hide"><td>4</td></tr> <tr class="show_hide"><td>5</td></tr> <tr class="show_hide"><td>6</td></tr> <tr class="show_hide"><td>7</td></tr> <tr class="show_hide"><td>8</td></tr> <tr class="show_hide"><td>9</td></tr> <tr class="show_hide"><td>10</td></tr> <tr class="show_hide"><td>11</td></tr> <tr class="show_hide"><td>12</td></tr> <tr class="show_hide"><td>13</td></tr> <tr class="show_hide"><td>14</td></tr> <tr class="show_hide"><td>15</td></tr> <tr class="show_hide"><td>16</td></tr> <tr class="show_hide"><td>17</td></tr> <tr class="show_hide"><td>18</td></tr> <tr class="show_hide"><td>19</td></tr> <tr class="show_hide"><td>20</td></tr> <tr class="show_hide"><td>21</td></tr> <tr class="show_hide"><td>22</td></tr> <tr class="show_hide"><td>23</td></tr> <tr class="show_hide"><td>24</td></tr> <tr class="show_hide"><td>25</td></tr> </table> </div> <br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br> <script type="text/javascript"> var jQnoC9 = jQuery.noConflict(); // query ноконфликт function hideDiv() { jQnoC9('.show_hide').hide(); jQnoC9(window).scroll()} function showDiv() { jQnoC9('.show_hide').show(); jQnoC9(window).scroll()} if (jQnoC9('#sidebar').length) { var topPos = jQnoC9('#sidebar').offset().top; jQnoC9(window).scroll(function() { var newcss = (topPos < jQnoC9(window).scrollTop() && jQnoC9('#table_wrap').height() >= jQnoC9(window).height()) ? { position: 'fixed', top: 0 } : { position: 'static' }; jQnoC9('#sidebar').css(newcss) }) } </script> |
рони, спасибо, но при прокрутке страницы, в зависимости от высоты окна браузера и высоты элемента #table_wrap - содержимое дива table_wrap дергается
тестировал в Mozilla, Opera, Google Chrome, IE вот запись с экрана: http://youtu.be/J78u8_2MHjc вот страница с вашем JS: http://www.glass-pgc.ru/Untitled-4.html ну и на сайте также: http://www.glass-pgc.ru/price/test5.html |
sashgera,
может смена класса у вас быстрее сработает ... больше вариантов у меня пока нет ... это лучше к специалистам по css. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <style type="text/css"> .fix{ position: fixed; top: 0 ; } </style> <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> <div id="table_wrap"> <div id="sidebar"> <table width="1000" border="1" cellpadding="0" cellspacing="0"> <tr bgcolor="#00FFFF"><td> - прокрутите страницу вниз - шапка таблицы получит позицию fixed <br> - затем удалите часть строк (кнопка УДАЛИТЬ СТРОКИ)<br> - прокрутите страницу вверх <br><br> (теперь таблица уместилась в окне браузера), то по условию #sidebar должен изменить позицию fixed на static, но этого не происходит. <br>Как исправить?<br><br> Шапка таблицы<br> <input type="button" value="УДАЛИТЬ СТРОКИ" onclick="hideDiv();"> <input type="button" value="Показать ВСЕ строки" onclick="showDiv();"> </td></tr> </table> </div> <table width="1000" border="1" cellpadding="0" cellspacing="0"> <tr><td>1</td></tr> <tr><td>2</td></tr> <tr><td>3</td></tr> <tr class="show_hide"><td>4</td></tr> <tr class="show_hide"><td>5</td></tr> <tr class="show_hide"><td>6</td></tr> <tr class="show_hide"><td>7</td></tr> <tr class="show_hide"><td>8</td></tr> <tr class="show_hide"><td>9</td></tr> <tr class="show_hide"><td>10</td></tr> <tr class="show_hide"><td>11</td></tr> <tr class="show_hide"><td>12</td></tr> <tr class="show_hide"><td>13</td></tr> <tr class="show_hide"><td>14</td></tr> <tr class="show_hide"><td>15</td></tr> <tr class="show_hide"><td>16</td></tr> <tr class="show_hide"><td>17</td></tr> <tr class="show_hide"><td>18</td></tr> <tr class="show_hide"><td>19</td></tr> <tr class="show_hide"><td>20</td></tr> <tr class="show_hide"><td>21</td></tr> <tr class="show_hide"><td>22</td></tr> <tr class="show_hide"><td>23</td></tr> <tr class="show_hide"><td>24</td></tr> <tr class="show_hide"><td>25</td></tr> <tr class="show_hide"><td>4</td></tr> <tr class="show_hide"><td>5</td></tr> <tr class="show_hide"><td>6</td></tr> <tr class="show_hide"><td>7</td></tr> <tr class="show_hide"><td>8</td></tr> <tr class="show_hide"><td>9</td></tr> <tr class="show_hide"><td>10</td></tr> <tr class="show_hide"><td>11</td></tr> <tr class="show_hide"><td>12</td></tr> <tr class="show_hide"><td>13</td></tr> <tr class="show_hide"><td>14</td></tr> <tr class="show_hide"><td>15</td></tr> <tr class="show_hide"><td>16</td></tr> <tr class="show_hide"><td>17</td></tr> <tr class="show_hide"><td>18</td></tr> <tr class="show_hide"><td>19</td></tr> <tr class="show_hide"><td>20</td></tr> <tr class="show_hide"><td>21</td></tr> <tr class="show_hide"><td>22</td></tr> <tr class="show_hide"><td>23</td></tr> <tr class="show_hide"><td>24</td></tr> <tr class="show_hide"><td>25</td></tr> </table> </div> <br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br><br><br><br><br><br><br> <br><br><br><br><br> <script type="text/javascript"> var jQnoC9 = jQuery.noConflict(); // query ноконфликт function hideDiv() { jQnoC9('.show_hide').hide(); jQnoC9(window).scroll() } function showDiv() { jQnoC9('.show_hide').show(); jQnoC9(window).scroll() } if (jQnoC9('#sidebar').length) { var topPos = jQnoC9('#sidebar').offset().top; jQnoC9(window).scroll(function() { jQnoC9('#sidebar').toggleClass('fix',(topPos < jQnoC9(window).scrollTop() && jQnoC9('#table_wrap').height() >= jQnoC9(window).height())) }) } </script> |
рони, с вашим новым вариантом таблица также дергается при прокрутке, но все равно спасибо!
- если окно браузера сделать чуть меньше по высоте содержимого дива table_wrap, срабатывает условие js - шапка получает позицию fixed. Но при этом шапка при прокрутке "дергается" - быстро меняется с fixed на static - если окно браузера сделать еще меньше, пикселей на ~200 - то все нормально, шапка перестает "дергаться" http://www.glass-pgc.ru/Untitled-6.html |
Вопрос решен
|
Цитата:
|
Цитата:
<script type="text/javascript"> var jQnoC8 = jQuery.noConflict(); // query ноконфликт if (jQnoC8('#sidebar').length) { var tableSF_elem = jQnoC8('#sf'); var heightTableWrap = jQnoC8('#table_wrap').height(); var heightTable_Sf = tableSF_elem.height(); var topPos = jQnoC8('#sidebar').offset().top; jQnoC8(window).scroll(function() { var newcss = (topPos < jQnoC8(window).scrollTop() && (heightTableWrap - ( heightTable_Sf - tableSF_elem.height() )) >= jQnoC8(window).height()) ? { position: 'fixed', top: 0 } : { position: 'static' }; jQnoC8('#sidebar').css(newcss) }) } </script> в работе выглядит так: [url]http://www.glass-pgc.ru/price/test5.html[/url] |
Часовой пояс GMT +3, время: 13:08. |