Ik probeer een grid te ontwikkelen, waarbij de table header absolute is gepositioneerd. Deze header is een aparte table, en de data zit ook in een losse table. De cellen van de header, moeten dus handmatig op de gewenste breedte worden gebracht waarbij de celbreedte in het data gedeelte bepalend is voor de cellen van de header.
Waar ik tegenaan loop is dat in IE 6 standards mode, en Opera 9 het geheel perfect wordt geschaald maar FireFox 1.5 er een potje van maakt. Wat me verder opvalt is dat er wel heel vreemde waardes terugkomen van zowel FireFox als Opera met betrekking tot clientWidth. clientWidth zou de viewport van het element moeten returnen, en niet de offsetWidth - (borders+padding). Op zich is dit niet een probleem omdat ik de waardes niet gebruik, maar het viel me wel op. Misschien is mijn definitie van clientWidth te veel geeikt op wat IE er onder verstaat, namelijk het aantal pixels zichtbare gedeelte van een element zonder scrollbar.
Als ik kijk naar de offsets die worden verkregen dan kloppen deze wel in alle browsers. De offset die terugkomt is netjes opgehoogd met 2, omdat er een border links en een border rechts van het cell element zit.
Het wordt echter pas echt bizar als ik de code die is gegenereerd naar een los document plak, daar exact dezelfde stylesheet op los laat, en FireFox opeens wel de boel goed renderd. Ben ik dus op een bug gestuit waarbij het renderen niet goed gaat als via Javascript de elementen worden gewijzigd?
De cellen krijgen wel de goede breedte als het door Javascript wordt gewijzigd, maar als niet de table een width krijgt.
this.grid.header.table.style.width = offset + 'px';
Alleen heeft FireFox een width nodig op een table om overflow:hidden te kunnen gebruiken op een cell. Dus ik kan niet zonder, en op zich zou dit ook geen probleem moet zijn want dezelfde source in een testcase doet het wel goed met een breedte op de table.
De code verantwoordelijk voor het resizen waarbij grid.sizes en precalculated array is met offsetWidths van de cellen in de data table. Elke cell krijgt de offsetWidth uit de array, en om boxmodel issues te voorkomen krijgen ook de data cellen waarmee de array initieel is gevuld, ipv hun oude width hier hun originele offsetWidth als nieuwe width. De css voor alle cellen is identiek, behalve dat de header een backgroundimage krijgt.
De html die wordt gegenereerd:
In de demos onder zijn er aan de rechterkant de berekende waardes getoond. De clientWidth is hier opvallend in zowel FireFox als Opera.
En het resultaat live:
http://www.mschopman.demon.nl/grid/
En als de gegenereerde sourcecode die indien niet gegenereerd wel door FireFox goed wordt getoond:
http://www.mschopman.demon.nl/grid/testcase.htm
Waar ik tegenaan loop is dat in IE 6 standards mode, en Opera 9 het geheel perfect wordt geschaald maar FireFox 1.5 er een potje van maakt. Wat me verder opvalt is dat er wel heel vreemde waardes terugkomen van zowel FireFox als Opera met betrekking tot clientWidth. clientWidth zou de viewport van het element moeten returnen, en niet de offsetWidth - (borders+padding). Op zich is dit niet een probleem omdat ik de waardes niet gebruik, maar het viel me wel op. Misschien is mijn definitie van clientWidth te veel geeikt op wat IE er onder verstaat, namelijk het aantal pixels zichtbare gedeelte van een element zonder scrollbar.
Als ik kijk naar de offsets die worden verkregen dan kloppen deze wel in alle browsers. De offset die terugkomt is netjes opgehoogd met 2, omdat er een border links en een border rechts van het cell element zit.
Het wordt echter pas echt bizar als ik de code die is gegenereerd naar een los document plak, daar exact dezelfde stylesheet op los laat, en FireFox opeens wel de boel goed renderd. Ben ik dus op een bug gestuit waarbij het renderen niet goed gaat als via Javascript de elementen worden gewijzigd?
De cellen krijgen wel de goede breedte als het door Javascript wordt gewijzigd, maar als niet de table een width krijgt.
this.grid.header.table.style.width = offset + 'px';
Alleen heeft FireFox een width nodig op een table om overflow:hidden te kunnen gebruiken op een cell. Dus ik kan niet zonder, en op zich zou dit ook geen probleem moet zijn want dezelfde source in een testcase doet het wel goed met een breedte op de table.
De code verantwoordelijk voor het resizen waarbij grid.sizes en precalculated array is met offsetWidths van de cellen in de data table. Elke cell krijgt de offsetWidth uit de array, en om boxmodel issues te voorkomen krijgen ook de data cellen waarmee de array initieel is gevuld, ipv hun oude width hier hun originele offsetWidth als nieuwe width. De css voor alle cellen is identiek, behalve dat de header een backgroundimage krijgt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| view_details.prototype.redraw = function(){
// resize data cells
var cells = this.grid.rows[0].cells;
for(var i=0;i<cells.length;i++){
cells[i].element.style.width = this.grid.sizes[i] + 'px';
}
// resize header cells
var offset = 0;
cells = this.grid.header.cells;
for(var i=0;i<cells.length;i++){
cells[i].element.style.width = this.grid.sizes[i] + 'px';
offset += cells[i].element.offsetWidth;
}
// resize tables zodat overflow hidden gebruikt kan worden
this.grid.table.style.width = offset + 'px';
this.grid.header.table.style.width = offset + 'px';
// zet breedte van header parentNode
this.grid.header.element.style.width = this.grid.element.clientWidth + 'px';
}; |
De html die wordt gegenereerd:
code:
1
| <div class="detail"><table style="margin-bottom: 200px; width: 561px;" class="data" border="0" cellspacing="0"><colgroup span="5"><col><col><col><col><col></colgroup><tbody><tr><td style="width: 286px;"><nobr>This is a long string which should cause an overflow</nobr></td><td style="width: 37px;"><nobr>580KB</nobr></td><td style="width: 83px;"><nobr>XML Document</nobr></td><td style="width: 91px;"><nobr>29-Nov-02 19:31</nobr></td><td style="width: 19px;"><nobr>xml</nobr></td></tr></tbody></table></div><div style="overflow: hidden; width: 1000px;" class="header-wrap"><table style="width: 561px;" class="header" border="0" cellspacing="0"><tbody><tr><td style="width: 286px;">Name2</td><td style="width: 37px;">Size</td><td style="width: 83px;">Type</td><td style="width: 91px;">Last Modified</td><td style="width: 19px;">Extension</td></tr></tbody></table></div> |
In de demos onder zijn er aan de rechterkant de berekende waardes getoond. De clientWidth is hier opvallend in zowel FireFox als Opera.
En het resultaat live:
http://www.mschopman.demon.nl/grid/
En als de gegenereerde sourcecode die indien niet gegenereerd wel door FireFox goed wordt getoond:
http://www.mschopman.demon.nl/grid/testcase.htm
[ Voor 15% gewijzigd door Verwijderd op 14-01-2006 17:59 ]