ugrás a tartalomhoz

táblázatban hover-"szerű" sorkijelölés :)

Anonymous · 2006. Szep. 24. (V), 21.46
Sziasztok!

CSS-ben a táblázatsort-t érintő hover-el megoldott kurzorkövető sorszínezést, hogyan tudom böngészőfüggetlenül megvalósítani? (ff,ie,op)
kell valami js-es bűvészkedés? ie-t, hogyan tudom rávenni legegyszerűbben?
nem csicsa lenne, hanem fontos használhatóságot segítő funkció. sokoszlopos széles táblázatom van sok hasonló adattal, ahol látni kell mi van mivel egysorban.
 
1

Javascript-el

Fekete Ferenc GDA · 2006. Szep. 24. (V), 22.19
Sajnos az IE csak a linkkere engedi a hover-t, ezért én javascript-el szoktam megoldani. Írsz egy vüggvényt, amely vár egy id-t és az objektum (amit az id jelöl) hátterét beállítja más színűre, a tr-re pedig raksz egy onmouseovert, ami meghívja ezt a függvényt és átadja neki az id-t. onmouseout-ra uyganez. Aztán ha működik, átírod event handlerekre és nem lesz a kódban a sok onmousexxx:)
  1. function setBG(id){  
  2. $(id).style.background = '#f00';  
  3. }  
ja, ez a példa feltételezi a prototype használatát. egyébként $(id) helyett getElemetByID
3

kis kötözködés :)

toxin · 2006. Szep. 25. (H), 08.03
Element.setStyle(id,{background:'#f00'});


szerencsésebb a fenti használata, emigyen :)

igazából így kéne
$(id).setStyle({background:'#f00'});


ez az új szintaxis, csak IE alatt (még?) nem megy :S

üdv t
2

Csshover

Anonymous · 2006. Szep. 24. (V), 23.03
<attach event="ondocumentready" handler="parseStylesheets" />
<script language="JScript">
/**
 * Pseudos - V1.30.050121 - hover & active
 * ---------------------------------------------
 * Peterned - http://www.xs4all.nl/~peterned/
 * (c) 2005 - Peter Nederlof
 *
 * Credits  - Arnoud Berendsen
 *         - Martin Reurings
 *             - Robert Hanson
 *
 * howto: body { behavior:url("csshover.htc"); }
 * ---------------------------------------------
 */

var currentSheet, doc = window.document, activators = {
onhover:{on:'onmouseover', off:'onmouseout'},
onactive:{on:'onmousedown', off:'onmouseup'}
}

function parseStylesheets()
{
var sheets = doc.styleSheets, l = sheets.length;
for(var i=0; i<l; i++)
parseStylesheet(sheets[i]);
}

function parseStylesheet(sheet)
{
if(sheet.imports) {
try {
var imports = sheet.imports, l = imports.length;
for(var i=0; i<l; i++) parseStylesheet(sheet.imports[i]);
} catch(securityException){}
}

try {
var rules = (currentSheet = sheet).rules, l = rules.length;
for(var j=0; j<l; j++) parseCSSRule(rules[j]);
} catch(securityException){}
}

function parseCSSRule(rule)
{
var select = rule.selectorText, style = rule.style.cssText;
if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i).test(select) || !style) return;

var pseudo = select.replace(/[^:]+:([a-z-]+).*/i, 'on$1');
var newSelect = select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo);
var className = (/\.([a-z0-9_-]*on(hover|active))/i).exec(newSelect)[1];
var affected = select.replace(/:hover.*$/, '');
var elements = getElementsBySelect(affected);

currentSheet.addRule(newSelect, style);
for(var i=0; i<elements.length; i++)
new HoverElement(elements[i], className, activators[pseudo]);
}

function HoverElement(node, className, events)
{
if(!node.hovers) node.hovers = {};
if(node.hovers[className]) return;
node.hovers[className] = true;
node.attachEvent(events.on,
function() { node.className += ' ' + className; });
node.attachEvent(events.off,
function() { node.className =
node.className.replace(new RegExp('\\s+'+className, 'g'),''); });
}

function getElementsBySelect(rule)
{
var parts, nodes = [doc];
parts = rule.split(' ');
for(var i=0; i<parts.length; i++) {
nodes = getSelectedNodes(parts[i], nodes);
} return nodes;
}

function getSelectedNodes(select, elements)
{
var result, node, nodes = [];
var classname = (/\.([a-z0-9_-]+)/i).exec(select);
var identify = (/\#([a-z0-9_-]+)/i).exec(select);
var tagName = select.replace(/(\.|\#|\:)[a-z0-9_-]+/i, '');
for(var i=0; i<elements.length; i++) {
result = tagName? elements[i].all.tags(tagName):elements[i].all;
for(var j=0; j<result.length; j++) {
node = result[j];
if((identify && node.id != identify[1]) || (classname && !(new RegExp('\\b' +
classname[1] + '\\b').exec(node.className)))) continue;
nodes[nodes.length] = node;
}
} return nodes;
}
</script>


Kimásol->beilleszt->elment csshover.htc néven

Használata: css fájlban

body { behavior:url("csshover.htc"); }


Ha gond, hogy kiakad tőle a validator, akkor If IE-z!

Így az IE is minden elemre tudni fogja a hovert.

Arra figyelj, az IE a csshover.htc fájl elérését nem a css fájltól, hanem a html fájltól nézi!
4

Csatlakozom

oky · 2006. Szep. 25. (H), 14.22
Én is a csshover.htc-t javasolnám.
CSS->be:
  1. #szinestabla tr:hover>td{background:szin;}  
5

csshover, yoo

TeeCee · 2006. Szep. 25. (H), 16.21
Igen, a csshover az jo, de kevéd ID-re alkalmazva, különben 'villog' az elem, amin hover-ezni szeretnél.
Egyébként van már belőle 1.42-es verzió itt http://www.xs4all.nl/~peterned/csshover.html
A másik, amire figyelni kell, hogy az IE nagyon allergiás az XSS-re, ezért ha valami.hu/csshover.htc-ként hívod meg, akor nem lehetsz a www.valami.hu alatt, mert hmm... nem tölti be, legalábbis nekem meggyűlt vele a bajom...
Illetve, hogy a WinXP SP2 óta a htc-fájlok csak megfelelő headerrel kiadva fogadja el az IE, ezt meg néhány apache nem tartalmazza. Ha nem a Tied a szerver, akkor vagy .htaccess a megdolás (ha engedélyezett), vagy egy lehetséges és egyszerű 'workaround': (a http://www.hoeben.net/node/83 oldalon van még más is, meg nem csak PHPs is, de az alján az enyém, amit ide bemásolok ;) )
  1. <?php  
  2. ob_start();  
  3. ?>  
  4. [Copy here the orginal HTC file content]  
  5. <?php  
  6. header("Content-type: text/x-component");  
  7. header("Content-Length: ".ob_get_length());  
  8. header("Content-Disposition: inline; filename=csshover.htc");  
  9. ob_end_flush();  
  10. ?>  
természetesen ezekután nem csshover.htc, hanem mondjk csshover.htc.php néven kell elmenteni, illetve hivatkozni rá...

És végül, de nem utolsó sorban (sörben) az alternatív megoldás:
http://dean.edwards.name/IE7/ Ez a (szerintem nagyon is fantasztikus javascipt-kollekció az IE7 alatti IE-ket javascripttel veszi rá a megfelelő CSS-kezelésre (meg PNG, és egybeket is tud, ráadásul külön fájlan vannak a külön részhez tartozó javascriptes 'patch'-ek, így nem kell az egészet fölöslegesen betölteni).

Tudok mutatni példákat is (mindkettő működik IE alatt gyönyörűen, és nem utdolsó sorban önreklámnak sem utolsó :) ):
- csshover.htc: SZTE ÁJTK HÖK weboldala
- IE7 : Euromenedzser weboldala
==> észrevételeket szívesen fogadok a weblapokkal kapcsolatban...
6

document.domain-t

toxin · 2006. Szep. 25. (H), 16.55
A másik, amire figyelni kell, hogy az IE nagyon allergiás az XSS-re, ezért ha valami.hu/csshover.htc-ként hívod meg, akor nem lehetsz a www.valami.hu alatt, mert hmm... nem tölti be, legalábbis nekem meggyűlt vele a bajom...


kell átállítani, nem túl sok változtatást tesz lehetővé, de www. előtag még belefér, bővebben

http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/domain.asp

ill. gugli, sokat nem játsztam vele, mert ha átraktam meg más problémáim lettek tőle, de azért szólok :)

üdv t
7

fx 1.5.x , opera9.x ie6 alatt néztem

toxin · 2006. Szep. 25. (H), 17.44
http://toxin.hu/weblabor/tableRow/tableRow.html
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />  
  5. <title>tableRowColorizer</title>  
  6. <script src="./scripts/prototype.js" type=""></script>  
  7. <script src="./scripts/scriptaculous.js?loader=builder" type=""></script>  
  8.   
  9. <script language="javascript" type="text/javascript">  
  10.   
  11. var myTable =   
  12.   
  13.     Class.create();  
  14.     myTable.prototype = {  
  15.           
  16.         initialize : function(wrapper,id,rowNum){  
  17.               
  18.             this.wrapper = $(wrapper);  
  19.             this.table   = Builder.node('table', {id:id,style:'margin: 0 auto',width:'95%',cellpadding:'0',cellspacing:'0',border:'1'});  
  20.             this.tbody   = Builder.node('tbody');  
  21.             this.rowNum  = rowNum;  
  22.              
  23.             this.table.appendChild(this.tbody);   
  24.             this.wrapper.appendChild(this.table);  
  25.   
  26.                      
  27.         },  
  28.                
  29.         addRow : function(rowDatas){  
  30.             this.tr = Builder.node('tr',{id:rowDatas.shift(),className:'data'});             
  31.             if (this.tr.id == 'id') Element.addClassName(this.tr,'firstRow');  
  32.               
  33.             rowDatas.each(  
  34.                 function(rowData){  
  35.                   var td = Builder.node('td',[ Builder.node('strong',rowData)]);  
  36.                   this.tr.appendChild(td);    
  37.                   delete td;  
  38.                 }.bind(this)  
  39.             )  
  40.               
  41.             for (var i=rowDatas.length;i<this.rowNum;i++)  
  42.             {  
  43.                 var td = Builder.node('td',[ Builder.node('strong',' ')]);   
  44.                 this.tr.appendChild(td);    
  45.             }  
  46.                                     
  47.             this.tbody.appendChild(this.tr);    
  48.                         
  49.          },  
  50.            
  51.          removeRow : function(rowId){  
  52.              if ($(rowId)) Element.remove(rowId)  
  53.          },  
  54.            
  55.          reset : function(){  
  56.             Element.update(this.tbody,'');               
  57.          }  
  58.            
  59. };  
  60.   
  61. var myTable_Row_Colorizer =   
  62.   
  63.     Class.create();  
  64.     myTable_Row_Colorizer.prototype = {  
  65.          
  66.        initialize : function(tableId){  
  67.                          
  68.            $$('#'+tableId+' tr').each(  
  69.                 function(tr,index){  
  70.                   Event.observe(tr,'mouseover',  
  71.                     function(){   
  72.                        Element.setStyle(this,{background:'yellow'})   
  73.                    }.bind(tr),true);  
  74.                     
  75.                   Event.observe(tr,'mouseout',function(){  
  76.                       Element.setStyle(this,{background:'blue'})   
  77.                   }.bind(tr),true);  
  78.                     
  79.                   Element.setStyle(tr,{background:'blue'});                                          
  80.                 }  
  81.            )   
  82.        }  
  83.           
  84.     }  
  85.          
  86.           
  87. window.onload = function(){  
  88.     oTestTable = new myTable('tableWrapper','testTable',15);  
  89.     for (var i=1;i<30;i++)      
  90.     oTestTable.addRow([i,i]);  
  91.       
  92.     new myTable_Row_Colorizer('testTable');  
  93. }  
  94.   
  95.   
  96. </script>  
  97.   
  98.  </head>  
  99.  <body>  
  100.   
  101.  <div id="tableWrapper"></div>  
  102.   
  103. </body>  
  104. </html>  
  105.    
kaptok ajándékba egy tábla generáló class-t :) IE megint megduplázta a fejlesztési időt 5percről 10percre, kezd nagyon idegesítení mostmár az a böngésző :P :)

üdv t
8

javascript-tel

Anonymous · 2006. Okt. 4. (Sze), 13.09
Hali!

Én így oldottam meg:
  1. <tr bgcolor="#alapszín" onmouseover="this.bgColor='#másikszín'" onmouseout="this.bgColor='#akármilyenszín'">  
A sor színe alaphelyzetben #alapszín, egéret fölé csúsztatva #másikszín, egér távozás után ismét #alapszín.