Utilisation de CSS td width absolu, position

103

S'il vous plaît voir ce JSFIDDLE

td.rhead { width: 300px; }

Pourquoi la largeur CSS ne fonctionne-t-elle pas?

<table>
<thead>
<tr>
<td class="rhead">need 300px</td>
<td colspan="7">Week #0</td>
<td colspan="7">Week #1</td>
<!-- etc..-->
</tr>
<tr>
<td class="rhead"></td>
<td>S</td><td>M</td><td>T</td><td>W</td><td>T</td><td>F</td><td>S</td>
<td>S</td><td>M</td><td>T</td><td>W</td><td>T</td><td>F</td><td>S</td>
<!-- etc... -->
</tr>
<thead>
</table>

En outre, quels sont les effets de la position: fixe, absolue, etc. sur les largeurs de td, le cas échéant? Je cherche une raison plus qu'une solution. J'espère comprendre comment cela fonctionne.

la largeur du td n'est pas de 300 px comme souhaité

Jake
la source
display: table-cellne respecte pas width(de la même manière que cela ne fonctionnerait pas display: inline). Je ne comprends pas ce que vous demandezposition fixed|absolute
Explosion Pills
@ExplosionPills parce que dans mon code actuel, j'ai la table fixe. Comme vous pouvez le deviner, j'essaie de réaliser une chronologie en haut de la page. Donc, je précise simplement que l'attribut de position cas affecte les largeurs.
Jake
duplication possible de la largeur de la table CSS td - fixe, non flexible
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

144

Ce n'est peut-être pas ce que vous voulez entendre, mais display: table-cellne respecte pas la largeur et sera réduit en fonction de la largeur de l'ensemble du tableau. Vous pouvez contourner cela facilement simplement en ayant un display: blockélément à l'intérieur de la cellule du tableau lui-même dont vous spécifiez la largeur, par exemple

<td><div style="width: 300px;">wide</div></td>

Cela ne devrait pas faire beaucoup de différence si le <table>lui-même est position: fixedou absolu, car la position des cellules est toutes statique par rapport au tableau.

http://jsfiddle.net/ExplosionPIlls/Mkq8L/4/

EDIT: Je ne peux pas prendre de crédit, mais comme le disent les commentaires, vous pouvez simplement utiliser à la min-widthplace de widthla cellule du tableau.

Pilules d'explosion
la source
31
+1 - J'ai déjà utilisé cette solution de contournement. Curieusement, min-widthsur le TDsemble fonctionner dans Chrome et FF: jsfiddle.net/Mkq8L/7
Tim Medora
2
En fait, comme toujours, après avoir posé la question, je découvre que ça min-width: 300pxmarche! (@TimMedora vous étiez quelques secondes plus vite!)
Jake
Je pense que la meilleure réponse est de mentionner l'affichage: le comportement des cellules de table. Merci!
Jake
Ce comportement a du sens pour moi: que doit-il se passer si vous définissez deux largeurs différentes pour deux cellules sur la même colonne? Avec min-widthil n'y a pas de problème cependant, prenez le plus gros.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
C'est un hack, je ne le recommande pas. La largeur td combinée dépasse la largeur de la table. C'est le problème. Vous ne devriez pas résoudre ce problème en ajoutant plus de structures HTML.
David
28

Vous feriez mieux d'utiliser table-layout: fixed

Auto est la valeur par défaut et avec de grandes tables, cela peut entraîner un léger décalage côté client lorsque le navigateur l'itère pour vérifier que toutes les tailles conviennent.

Fixed est bien meilleur et s'affiche plus rapidement sur la page. La structure du tableau dépend de la largeur hors tout des tableaux et de la largeur de chacune des colonnes.

Ici, il est appliqué à l'exemple d'origine: JSFIDDLE , vous remarquerez que les colonnes restantes sont écrasées et chevauchent leur contenu. Nous pouvons corriger cela avec un peu plus de CSS (tout ce que j'ai eu à faire est d'ajouter une classe au premier TR):

    table {
        width: 100%;
        table-layout: fixed;
    }

    .header-row > td {
        width: 100px;
    }

    td.rhead {
        width: 300px
    }

Vu en action ici: JSFIDDLE

Hugo Yates
la source
11

La raison pour laquelle cela ne fonctionne pas dans le lien que vous avez fourni est que vous essayez d'afficher une colonne de 300 pixels PLUS 52 colonnes de 7 colonnes chacune. Réduisez le nombre de colonnes et cela fonctionne. Vous ne pouvez pas en mettre autant à l'écran.

Si vous voulez forcer les colonnes à s'adapter, essayez de régler:

body {min-width:4150px;}

voir mon jsfiddle: http://jsfiddle.net/Mkq8L/6/ @mike Je ne peux pas encore commenter.

Matthew Brown
la source
2
+1 pour découvrir que le seuil de largeur de table augmente avec la largeur du corps.
Jake
8

La raison est que vous n'avez pas spécifié la largeur du tableau et que tout votre tas de td déborde.

Ceci par exemple , j'ai donné au tableau une largeur de 5000px, ce qui, selon moi, répondrait à vos besoins.

table{
    width:5000px;
}

C'est exactement le même code que vous avez fourni, que j'ai simplement ajouté dans la largeur du tableau.

Je crois que ce qui se passe, c'est que vos TD dépassent largement la largeur de table par défaut. Ce que vous pourriez voir, si vous retirez environ 45 de vos td dans chaque tr, (c'est-à-dire le code que vous avez fourni dans votre question, pas jsfiddle) cela fonctionne parfaitement

He Hui
la source
2
+1 pour avoir mentionné qu'il existe un seuil de largeur de table. Le problème est parfois que nous ne connaissons pas la largeur totale à l'avance. Quelle est la largeur de table par défaut?
Jake
Je ne sais vraiment pas. Tout ce que je sais, c'est que si vous avez trop de colonnes, la table se réduira, rendant toutes les largeurs de nœuds enfants inutiles. J'ai déjà rencontré ce problème, mais je n'ai pas encore trouvé la valeur par défaut. Je devrais peut-être poser cette question en tant que question.
He Hui
Je crois avoir résolu ce problème stackoverflow.com/questions/14767459/...
He Hui
C'est la vraie réponse, au lieu de celle qui est hautement cotée. La largeur ne peut être définie que si le contenu ne dépasse pas toute la largeur du tableau.
David
5

Essayez ceci, cela fonctionne.

<table>
<thead>
<tr>
<td width="300">need 300px</td>
amirali shahinpour
la source
1
HOU LA LA! Merci ♥
ivahidmontazer
Veuillez ajouter quelques explications sur pourquoi / comment ce code aide l'OP. Cela aidera à fournir une réponse dont les futurs téléspectateurs pourront tirer des leçons. Voir cette question Meta et ses réponses pour plus d'informations.
Heretic Monkey
1
Notez que l'attribut width de est obsolète dans HTML5.
simhumileco
5

Essayez d'utiliser

table {
  table-layout: auto;
}

Si vous utilisez Bootstrap, la classe tablea table-layout: fixed;par défaut.

sambrmg
la source
4

Utilisez la propriété de mise en page du tableau et la valeur «fixe» sur votre table.

table {
   table-layout: fixed;
   width: 300px; /* your desired width */
}

Après avoir configuré toute la largeur du tableau, vous pouvez maintenant configurer la largeur en% des td.

td:nth-child(1), td:nth-child(2) {
   width: 15%;  
}

Vous pouvez en savoir plus sur ce lien: http://www.w3schools.com/cssref/pr_tab_table-layout.asp

Cyan Baltazar
la source
3

Ma solution folle.)

$(document).ready(function() {
    $("td").each(function(index) { 
    var htmlText = "<div style='width:300px;'>" + $(this).text() +"</div>";
    $(this).html(htmlText);
  });
});
mathewsun
la source
2

Si la largeur du tableau est par exemple de 100%, essayez d'utiliser un pourcentage de largeur sur td tel que 20%.

Dally S
la source
2

Enveloppez le contenu de la première cellule en div, par exemple comme ça:

HTML:

<td><div class="rhead">a little space</div></td>

CSS:

.rhead {
  width: 300px;
}

Voici un jsfiddle .

simhumileco
la source
1

Vous pouvez aussi utiliser:

.rhead {
    width:300px;
}

mais ce ne sera qu'avec certains navigateurs, si je me souviens bien, IE8 ne le permet pas. Dans l'ensemble, il est plus sûr de simplement mettre l' width=""attribut en <td>lui - même.

KernelCurry
la source