33 votes

Rotation du texte de l'en-tête du tableau avec des transformations CSS

Il semble que cela devrait être possible avec ce qui suit :

.verticalText 
{           
    /* IE-only DX filter */
    writing-mode: tb-rl;
    filter: flipv fliph;

    /* Safari/Chrome function */
    -webkit-transform: rotate(270deg);

    /* works in latest FX builds */
    -moz-transform: rotate(270deg);
}

Cela fonctionne dans IE.

Le problème est étrange dans Safari, Chrome et FX : la taille de la cellule est calculée. avant le texte est tourné !

screenshot of bug

Voici une démo : http://jsfiddle.net/HSKws/

J'utilise des images dynamiques comme solution de contournement, bien que cela a aussi ses problèmes . Je me contente de cette solution de repli, mais il me semble qu'il devrait y avoir un moyen de faire fonctionner ce CSS - c'est presque le cas.

Quelqu'un connaît-il un moyen de faire en sorte que les cellules s'adaptent au contenu après l'application de la transformation ?

17voto

bobince Points 270740

La fonction "transform" modifie l'orientation de l'élément entier sur lequel elle est déclarée, et non le contenu textuel qu'il contient. C'est plus proche de la propriété "matrix" d'IE que de "writing-mode".

Il est important de noter que la transformation d'un élément ne change pas la façon dont la taille de son contenu est calculée (ni la façon dont la mise en page de son parent est affectée par cette taille). Les algorithmes CSS pour le dimensionnement vertical et horizontal sont différents et assez difficiles à mettre en œuvre pour être efficaces ; il n'y a pas de moyen cohérent de prendre en compte un contenu avec une rotation arbitraire. Ainsi, "transformer" revient à utiliser "position : relative" : cela change l'endroit où le contenu est rendu, mais n'a rien à voir avec la taille de la présentation.

Si vous voulez en inclure un dans un tableau, vous devrez définir explicitement la "hauteur" de la cellule pour tenir compte de la "largeur" pivotée. Si vous ne le savez pas à l'avance, vous pouvez éventuellement le modifier avec JavaScript.

Pour info : pour moi, sur Fx3.1b3, la portée est également tournée comme les autres. Cependant, sous Windows, avec son anticrénelage uniquement horizontal (ClearType), le rendu n'est pas très bon... une image bien rendue pourrait être bien meilleure.

9voto

otto.poellath Points 1594

Il est possible d'utiliser le SVG en ligne dans un document XHTML (j'ai seulement testé Safari et Firefox) :

<html xmlns="http://www.w3.org/1999/xhtml">
  <body>
    <table border="1">
        <tr>
            <td>&#160;</td>
            <td>
                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="150">
                  <text id="thetext" transform="rotate(270, 12, 0) translate(-140,0)">Example column header</text>
                </svg>
            </td>
            <td>
                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="150">
                  <text id="thetext" transform="rotate(270, 12, 0) translate(-140,0)">Example column header</text>
                </svg>
            </td>
            <td>
                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="150">
                  <text id="thetext" transform="rotate(270, 12, 0) translate(-140,0)">Example column header</text>
                </svg>
            </td>
        </tr>
        <tr>
            <td>Example row header</td>
            <td>1</td>
            <td>2</td>
            <td>3</td>
        </tr>
    </table>
  </body>
</html>

Malheureusement, vous devez définir explicitement la largeur et la hauteur des cellules de votre tableau et la traduction du texte rendu à l'aide de SVG. En outre, l'extension du fichier doit être xhtml .

7voto

Stephen Denne Points 17031

Webkit a ajouté :

-webkit-writing-mode:vertical-rl;

que vous pouvez appliquer à un div .

6voto

jobjorn Points 386

Comme je l'ai répondu sur une question similaire J'ai résolu le problème en utilisant un plugin jQuery par David Votrubec et le commentaire de Mike sous l'article du blog.

Mettez ça dans un fichier .js :

(function ($) {
  $.fn.rotateTableCellContent = function (options) {
  /*
Version 1.0
7/2011
Written by David Votrubec (davidjs.com) and
Michal Tehnik (@Mictech) for ST-Software.com
*/

var cssClass = ((options) ? options.className : false) || "vertical";

var cellsToRotate = $('.' + cssClass, this);

var betterCells = [];
cellsToRotate.each(function () {
var cell = $(this)
, newText = cell.text()
, height = cell.height()
, width = cell.width()
, newDiv = $('<div>', { height: width, width: height })
, newInnerDiv = $('<div>', { text: newText, 'class': 'rotated' });

newInnerDiv.css('-webkit-transform-origin', (width / 2) + 'px ' + (width / 2) + 'px');
newInnerDiv.css('-moz-transform-origin', (width / 2) + 'px ' + (width / 2) + 'px');
newDiv.append(newInnerDiv);

betterCells.push(newDiv);
});

cellsToRotate.each(function (i) {
$(this).html(betterCells[i]);
});
};
})(jQuery);

Et ceci en haut de votre page :

<script src="rotatetablecellcontent.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $('.yourtableclass').rotateTableCellContent();
    });
</script>

Et ceci dans votre CSS :

/* Styles for rotateTableCellContent plugin*/
table div.rotated {
    -webkit-transform: rotate(270deg);
    -moz-transform: rotate(270deg);
    writing-mode:tb-rl;
    white-space: nowrap;
}

thead th {
    vertical-align: top;
}

table .vertical {
    white-space: nowrap;
}

Assurez-vous ensuite que votre table a la classe "yourtableclass", et que tous les TDs que vous voulez faire pivoter ont la classe "vertical".

Voici une démo fonctionnant dans un jsFiddle .

J'espère que cela aidera quelqu'un, même si j'ai deux ans de retard !

3voto

doublejosh Points 974

Cet outil a fait tout le travail de réflexion pour moi...

http://www.boogdesign.com/examples/transforms/matrix-calculator.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X