div旋转,但div的剪切框没有

时间:2013-12-18 17:50:49

标签: android css rotation overflow hidden

Related fiddle

尝试在没有JS库(如Raphael)的情况下构建这个整洁的小仪表,我想出了一个问题here。经过多次挫折之后,我想到了另一种布局,可以让这个仪表工作(也可以解决一个单独的已知Chrome错误),这可以在上面的小提琴上看到。

<div id="clipper">
    <div id="round">
    </div>
    <div id="clipper2">
        <div id="meter"></div>
    </div>
</div>

但是,这创建了一个完全新的Android(至少4.0.4)浏览器缺陷。剪切框div元素按预期旋转。但是,实际计算的剪切框具有水平和垂直边界,其包含可见形状。从本质上讲,它意味着子元素总是被剪裁成方形,而不是沿着元素的旋转边缘。

仪表本身有一些不寻常的要求,否则这样做会更容易:它不是一个完整的半圆,而是一个圆弧顶部的切片。它还必须围绕此切片的点底部中心旋转,而不是圆的中心。

2 个答案:

答案 0 :(得分:3)

尝试使用SVG:http://jsfiddle.net/8fsS2/4/

HTML:

<svg id="generate" version="1.1" xmlns="http://www.w3.org/2000/svg"
    width="500px" height="120px" viewBox="0 0 200 120" preserveAspectRatio="none">
        <g id="chart"></g>
</svg>

使用Javascript:

function deg2rad(deg) {
        return deg * Math.PI / 180;
    }

    function annularSector(centerX, centerY, startAngle, endAngle, innerRadius, outerRadius) {
        startAngle = deg2rad(startAngle + 180);
        endAngle = deg2rad(endAngle + 180);

        var p = [
                [centerX + innerRadius * Math.cos(startAngle),  centerY + innerRadius * Math.sin(startAngle)]
            , [centerX + outerRadius * Math.cos(startAngle),    centerY + outerRadius * Math.sin(startAngle)]
            , [centerX + outerRadius * Math.cos(endAngle),      centerY + outerRadius * Math.sin(endAngle)]
            , [centerX + innerRadius * Math.cos(endAngle),      centerY + innerRadius * Math.sin(endAngle)]
            ];

        var angleDiff = endAngle - startAngle
            , largeArc = (angleDiff % (Math.PI * 2)) > Math.PI ? 1 : 0;

        var commands = [];

        commands.push("M" + p[0].join());
        commands.push("L" + p[1].join());
        commands.push("A" + [outerRadius, outerRadius].join() + " 0 " + largeArc + " 1 " + p[2].join());
        commands.push("L" + p[3].join());
        commands.push("A" + [innerRadius, innerRadius].join() + " 0 " + largeArc + " 0 " + p[0].join());
        commands.push("z");

        return commands.join(" ");
    }

    function create(type, attr, parent) {
        var element = document.createElementNS("http://www.w3.org/2000/svg", type);
        if (attr) for (var name in attr) element.setAttribute(name, attr[name]);
        if (parent) parent.appendChild(element);
        return element;
    }
    var svg = document.querySelector("svg#generate g#chart");
    create("path", {
        fill: "#FF0000",
        d: annularSector(80, 80, 0, 180, 0, 80)
    }, svg);


    create("path", {
        fill: "#00FF00",
        d: annularSector(80, 80, 0, 65, 0, 80)
    }, svg);

调整viewBox以进行缩放。

答案 1 :(得分:1)

Android真的,真的不喜欢transform: translateZ(0);。完全没有。无处不在。如果此属性位于该树中的任何元素上,则整个操作将失败。

更新的小提琴有效: http://jsfiddle.net/FB6rf/15/

如果有人对此行为有解释,我会全力以赴。因为否则* poof *,我出100分。也许如果有些用户向我展示了一些爱情,那就不会有如此大的损失。