2009-12-28 4 views
0

J'ai une table comme suit:HTML CSS padding-bottom 0 ne fonctionne pas sur firefox

<table> 
<tr> 
<td> 
*PROBLEMATIC CELL* 
</td> 
<td rowspan="2"> 
</td> 
<td rowspan="3"> 
</td> 
</tr> 

<tr> 
<td> 
</td> 
</tr> 

<tr> 
<td colspan="2"> 
</td> 
</tr> 
</table> 

La première cellule de la première rangée, a un rembourrage au fond. Eh bien, ce n'est pas vraiment un rembourrage, mais ça ressemble à du rembourrage et à l'utilisation d'un firebug, je ne trouve pas l'espace qui s'y trouve réellement.

Je pense que ce qui se passe est que, firefox ajuste automatiquement le remplissage inférieur du premier td dans le premier tr avec le haut de remplissage du premier et seulement td du second tr.

p.s. fonctionne parfaitement bien dans Chrome. Fondamentalement, ce que j'essaye de réaliser est pour la hauteur du premier td dans le premier tr, être seulement aussi grand que nécessaire mais pas plus grand de sorte que le contenu de cette cellule se termine au même endroit où le td se termine sans aucun espace entre eux.

L'URL du site est: http://mmamail.com/

Il semble avoir quelque chose à voir avec le padding-top placé au premier TD de la deuxième TR. La chose étrange est que cela fonctionne bien sur le chrome.

+1

Veuillez fournir un lien vers un exemple de site ou publier la source HTML problématique (y compris les CSS pertinents). –

+0

Je ne vois pas un tel rembourrage. – cletus

+0

Les tables HTML sont rarement problématiques sans contenu. Vos échantillons n'ont pas de contenu et vous ne décrivez donc pas le problème dans son intégralité. –

Répondre

1

si vous faites référence à l'espace entre les cases « sondage mensuel » et « magazine mensuel », il ne résulte pas de rembourrage ...

Ce qui se passe est le td contenant la vidéo flash est trop grand, et parce qu'il a une rowspan de 2, les deux td s sur la gauche sont ajustées à la hauteur de la plus haute td (aka la boîte vidéo)

une solution consiste à ajouter un autre tr en dessous du premier 2 rangées,
laisser avoir un vide td,
changer la rowspan de la boîte vidéo à 3

Et puis l'espace redondant vous voyez entre les 2 premières cases seront transférés à la td vide que vous venez de créer.

OU

Je vous suggère de mordre la balle et commencer à utiliser CSS plutôt que des tables pour la mise en page, uniquement parce que:

  1. Nous sommes dans la deuxième décennie du 21e siècle
  2. il est beaucoup plus souple à utiliser CSS
  3. il sera beaucoup plus facile pour vous changer l'apparence du site e avenir, sans toucher le balisage.
  4. Ce sera beaucoup mieux pour les moteurs de recherche à indexer votre contenu du site
  5. Les logiciels d'aide tels que les lecteurs d'écran peuvent voir votre contenu dans l'ordre où ils sont censés être vu
  6. Vous serez un développeur heureux à la fin
1

Le contrôle du remplissage des cellules d'une table avec css peut être difficile. Essayez d'ajouter ces deux règles CSS:

table { border-spacing: 0; } 
table td { padding: 0; } 

Malheureusement, la règle est border-spacing pas pris en charge par tous les navigateurs, de sorte que vous pouvez avoir à ajouter cellpadding="0" et cellspacing="0" comme un attribut à la table.

+1

Vous ne devriez pas avoir besoin d'inclure cellpadding/cellspacing pour la valeur '0' dans ce siècle. Le problème IE6-7 avec 'border-spacing' ne fonctionne pas avec le style' border-collapse: collapse'. – bobince

0

J'ai essayé avec le code HTML suivant qui est simplement une version plus complète de votre fragment de code. Cependant, je ne vois pas de rembourrage comme vous l'avez décrit. Donc, ma meilleure supposition est qu'elle est causée par d'autres règles CSS que vous avez définies ailleurs.

<!doctype html> 
<html> 
<head> 
</head> 
<body> 
<table> 
<tr> 
<td> 
*PROBLEMATIC CELL* 
</td> 
<td rowspan="2"> 
&nbsp; 
</td> 
<td rowspan="3"> 
&nbsp; 
</td> 
</tr> 

<tr> 
<td> 
&nbsp; 
</td> 
</tr> 

<tr> 
<td colspan="2"> 
&nbsp; 
</td> 
</tr> 
</table> 
</body> 
</html> 
+0

le site Web est l'URL est http://mmamail.com/ – John

+0

Le problème n'a rien à voir avec le remplissage. Au lieu de cela, c'était la hauteur du fieldset qui ne dépasse pas la cellule de la table. – shinkou

2

Vous avez présenté le navigateur avec un problème de mise en page incomplète. Vous avez une grille de trois par trois, dont aucune des colonnes ou des lignes n'a de taille fixe. Le problème est donc que vous vous retrouvez avec une première rangée plus grande que vous le vouliez, car le navigateur tente d'allouer la hauteur «de rechange» causée par le rowspan dans la deuxième colonne parmi les cellules de la première colonne.

Il n'y a pas un algorithme normalisé pour cela; Les navigateurs font des choses différentes, incluant souvent des choses désagréables comme regarder le nombre brut d'octets de balisage dans chaque cellule. Vous ne voulez pas vous fier à ce comportement. Cela ralentit également le rendu de la page et peut donner des effets de distorsion de page vraiment étranges quand il y a une très petite ou grande quantité de contenu. Si vous avez besoin d'utiliser des tables pour la mise en page, assurez-vous d'utiliser table-layout: fixed avec des largeurs explicites pour les colonnes de taille fixe, et définir des hauteurs explicites pour les cellules quand il y a rowspans, pour éviter toute ambiguïté.

Mais une prolifération de rowspan/colspan est souvent une indication que vous devriez regarder à une autre forme de mise en page. Cet exemple est beaucoup plus facile à réaliser en utilisant CSS à la place. par exemple .:

<div id="ads"> 
    <script type="text/javascript">//...google stuff...</script> 
    ... 
</div> 
<div id="content"> 
    <div id="video"><fieldset> 
     <legend>...</legend> 
     <object ...> 
    </fieldset></div> 
    <form id="poll" method="post" action="..."><fieldset> 
     <legend>...</legend> 
     ...options... 
    </fieldset></form> 
    <form id="subscribe" method="post" action="..."><fieldset> 
     <legend>...</legend> 
     ...fields... 
    </fieldset></form> 
    <div id="about"> 
     ... 
    </div> 
</div> 

avec des styles quelque chose comme:

#ads { position: absolute; right: 0; width: 160px; } 
#content { margin-right: 160px; } 
#video { float: right; width: 440px; } 
#poll, #subscribe { margin: 0 440px 0 0; } 
#about { clear: right; } 

Je voudrais aussi vous conseille de déplacer la logique JavaScript à partir du gestionnaire d'événements en ligne vous attribue avez actuellement pour séparer les blocs JavaScript (soit embedded <script> blocs ou scripts externes liés). En particulier pour les gestionnaires d'événements multi-lignes: en dehors de l'horrible maintenabilité des scripts de mélange dans le balisage, en HTML/XML, les retours à la ligne des attributs ne sont pas conservés. Cela signifie que vos sauts de ligne dans le code JS sont convertis en espaces, donc si vous manquez un point-virgule votre script casser ou se comporter bizarrement (où habituellement dans un bloc de script ou d'un script externe, l'auto-newline-points-virgules fallback vous sauverait).

ie.

onsubmit=" 
    var inputs = this.getElementsByTagName('input'); 
    var checkedValue; 
    for(var i = 0; i < inputs.length; i++) 
    { 
     if(inputs[i].getAttribute('type') == 'radio' && inputs[i].checked) 
     { 
      checkedValue = inputs[i].value; 
     } 
    } 
    /*makeAjaxPostRequest('/poll/ajax-vote.php', 'vote='+checkedValue, processAjaxResponse);*/ 
    makeAjaxGetRequest('/poll/ajax-vote.php?vote='+checkedValue, processAjaxResponse); 
    return false;" 

à la place:

<form id="pollForm" method="post" action="/poll/form-vote.php> 
    ... 
</form> 
<script type="text/javascript"> 
    document.getElementById('pollForm').onsubmit= function() { 
     var checkedValue= getRadioValue(this.elements.vote); 
     makeAjaxPostRequest('/poll/ajax-vote.php', 'vote='+encodeURIComponent(checkedValue), processAjaxResponse); 
     return false; 
    }; 

    function getRadioValue(fields) { 
     for (var i= fields.length; i-->0;) 
      if (fields[i].checked) 
       return fields.value; 
     return ''; 
    }; 
</script> 

Toujours autoriser uniquement les requêtes POST pour des formes actives qui font quelque chose de positif. Utilisez toujours encodeURIComponent lors de la création de chaînes de requête. N'utilisez pas getAttribute car cela ne fonctionne pas correctement dans IE. utilisez plutôt les propriétés HTML DOM directes du niveau 1, par exemple. input.type.