代码之家  ›  专栏  ›  技术社区  ›  Oleg

使用基于JavaScript的SVG库的表标题中的垂直文本

  •  7
  • Oleg  · 技术社区  · 16 年前

    我将jqGrid与许多包含布尔信息的列一起使用,这些列在表中显示为复选框(请参见 http://www.ok-soft-gmbh.com/VerticalHeaders/TestFixedO.htm 例如)。为了更简洁地显示信息,我使用了垂直列标题。它工作得非常好,在所有浏览器中都可以在jqGrid中工作(参见我在jqGrid论坛中与tonytomov的讨论) http://www.trirand.com/blog/?page_id=393/feature-request/headers-with-vertical-orientation/ ),但在IE中,垂直文本是模糊的,看起来不够漂亮(打开IE中的链接,你就会明白我的意思)。有用户问我为什么文本显示得如此奇怪。所以我考虑使用一个基于JavaScript的SVG库,比如 ( http://code.google.com/p/svgweb/ )或者 ( http://raphaeljs.com/ ). SVG非常强大,很难找到一个好的例子。我只需要显示垂直文本(-90度,从底部向上)和使用,如果可能的话,没有在绝对定位模式工作。

    再问一次我的问题: 我需要有一个可能显示垂直文本(- )内部 <td> 表标题的元素。我想使用一个基于JavaScript的SVG库,比如 SVG网站 中缝 . 解决方案必须支持 IE6公司 . 有没有人有一个好的参考例子可以帮助我做到这一点?如果有人贴出问题的完整解决方案,我会很高兴的。

    .rotate 
    {
        -webkit-transform: rotate(-90deg);    /* Safari 3.1+, Chrome */
        -moz-transform: rotate(-90deg);    /* Firefox 3.5+ */
        -o-transform: rotate(-90deg); /* Opera starting with 10.50 */
        /* Internet Explorer: */
        filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); /* IE6, IE7 */
       -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)" /* IE8 */;
    }
    

    定义 RotateCheckboxColumnHeaders 功能

    var RotateCheckboxColumnHeaders = function (grid, headerHeight) {
        // we use grid as context (if one have more as one table on tnhe page)
        var trHead = $("thead:first tr", grid.hdiv);
        var cm = grid.getGridParam("colModel");
        $("thead:first tr th").height(headerHeight);
        headerHeight = $("thead:first tr th").height();
    
        for (var iCol = 0; iCol < cm.length; iCol++) {
            var cmi = cm[iCol];
            if (cmi.formatter === 'checkbox') {
                // we must set width of column header div BEFOR adding class "rotate" to
                // prevent text cutting based on the current column width
                var headDiv = $("th:eq(" + iCol + ") div", trHead);
                headDiv.width(headerHeight).addClass("rotate");
                if (!$.browser.msie) {
                    if ($.browser.mozilla) {
                        headDiv.css("left", (cmi.width - headerHeight) / 2 + 3).css("bottom", 7);
                    }
                    else {
                        headDiv.css("left", (cmi.width - headerHeight) / 2);
                    }
                }
                else {
                    var ieVer = jQuery.browser.version.substr(0, 3);
                    // Internet Explorer
                    if (ieVer !== "6.0" && ieVer !== "7.0") {
                        headDiv.css("left", cmi.width / 2 - 4).css("bottom", headerHeight / 2);
                        $("span", headDiv).css("left", 0);
                    }
                    else {
                        headDiv.css("left", 3);
                    }
                }
            }
        }
    };
    

    RotateCheckboxColumnHeaders(grid, 110); 在创建jqGrid之后。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Milimetric    15 年前

    这是一个可以工作的jsfiddle。它应该在ie6中工作,我只使用jquery和raphaeljs。我为raphael绘图区域和文本制作了静态尺寸,但您当然可以做一点数学来计算动态尺寸:

    http://jsfiddle.net/UYj58/9/

    如果包含jquery和raphael,代码如下所示:

    $(document).ready(function(){
        var font = {font: '12px Helvetica, Arial'};
        var fill = {fill: "hsb(120deg, .5, 1)"}
        $('tr th div').each(function (index, div){
            R = Raphael($(div).attr('id'), 20, 100);
            R.text(4, 50, $(div).find('span').text())
                .attr(font)
                .attr(fill)
                .rotate(-90, true);
            $(div).find('span').hide();
        });
    });
    

    HTML如下所示:

    <table>
        <thead>
            <tr>
                <th><div id="columnOne"><span>heading one</span></div></th>
                <th><div id="columnTwo"><span>heading two</span></div></th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>2</td>
            </tr>
            <tr>
                <td>4</td>
                <td>5</td>
            </tr>
        </tbody>
    </table>
    

    哦,我举了个例子: http://raphaeljs.com/text-rotation.html

        2
  •  0
  •   Ali Habibzadeh    16 年前

                <!--[if IE]><script type="text/javascript" src="../excanvas.js"></script><![endif]-->
    <script type="text/javascript" src="../canvas.text.js"></script>
    <script type="text/javascript" src="../faces/dejavu_sans-normal-normal.js"></script>
    <script type="text/javascript" src="../faces/dejavu_sans-bold-normal.js"></script>
        </head>
        <body>
                <canvas width="500" height="300" id="test-canvas" style="font-size: 16px;"></canvas>
    
                <script type="text/javascript">
                    function initCanvas(canvas) {
                        if (window.G_vmlCanvasManager && window.attachEvent && !window.opera) {
                            canvas = window.G_vmlCanvasManager.initElement(canvas);
                        }
                        return canvas;
                    }
    
                    window.onload = function() {
                        var canvas = initCanvas(document.getElementById("test-canvas")),
                                    ctx = canvas.getContext('2d');
    
                        ctx.strokeStyle = "rgba(255,0,0,1)";
                        ctx.fillStyle = "rgba(0,0,0,1)";
                        ctx.lineWidth = 1;
                        ctx.font = "20pt Verdana, sans-serif";
                        ctx.strokeStyle = "#000";
                        ctx.rotate(Math.PI / 2);
                        ctx.fillText('Vertical', 0, 0);
                        ctx.restore();
                    }
                </script>
        </body>
    

    推荐文章