2012-11-20 14 views
6

Próbuję odtworzyć promień obramowania CSS3 w obszarze roboczym.Promień obramowania CSS3 na płótno HTML5

Łatwo narysować zaokrąglony prostokąt, ale w CSS wartość każdej krawędzi może być wysoka.

Na przykład:
HTML

<div class="normal_radius"></div> 
<div class="high_radius"></div> 
<div class="high2_radius"></div> 

CSS

div { height:50px;width:50px;position:absolute;top:10px; } 
.normal_radius { 
    border: 1px solid black; 
    border-radius: 5px 5px 10px 15px; 
    left: 10px; 
} 
.high_radius { 
    border: 1px solid red; 
    border-radius: 5000px 500px 100px 150px; 
    left: 80px; 
} 
.high2_radius { 
    border: 1px solid blue; 
    border-radius: 2500px 250px 50px 75px; 
    left: 160px; 
} 

tu jsfiddle

Czarny, normalna wartość promienia granica, mogę odtworzyć tego. Czerwona, wysoka wartość dla promienia obramowania, nie wiem, jak to odtworzyć. I niebieska, wysoka wartość podzielona przez 2, taki sam wynik czerwony.

Moje pytanie jest proste, jak odtworzyć czerwony i niebieski na płótnie?

Pozdrawiamy.

+0

Myślę, że trzeba użyć metod ścieżki, aby narysować krzywą przez siebie. https://developer.mozilla.org/en-US/docs/Canvas_tutorial/Drawing_shapes przewiń w dół do "moveTo" i "Krzywe Beziera i kwadratowe" – Mic

+0

Po prostu pytanie: po co używać tych wielkich wartości dla 'border-radius' w swoim CSS, gdy 'border-radius: 100% 10% 0 0;' daje ten sam efekt? Http: //jsfiddle.net/fAJ9t/66/ – Ana

+0

Cześć, dziękuję za odpowiedź, ale znam metodę narysowania zaokrąglonego prostokąta, Chcę, aby algorytm/formuła narysować zaokrąglony prostokąt, jeśli użytkownik wprowadza wysoką wartość. – kran

Odpowiedz

2

tutaj rozwiązania:

CanvasRenderingContext2D.prototype.roundRect=function(x,y,width,height,tl,tr,br,bl) { 
    var x1,x2,x3,x4,y1,y2,y3,y4,radii,ratio=0,CURVE2KAPPA=0.5522847498307934; 
    ratio=Math.min(Math.min(width/(tl+tr),width/(br+bl)),Math.min(height/(tl+bl),height/(tr+br))); 
    if ((ratio>0)&&(ratio<1)) { 
    tl*=ratio; 
    tr*=ratio; 
    bl*=ratio; 
    br*=ratio; 
    } 
    xw=x+width; 
    yh=y+height; 
    x1=x+tl; 
    x2=xw-tr; 
    x3=xw-br; 
    x4=x+bl; 
    y1=y+tr; 
    y2=yh-br; 
    y3=yh-bl; 
    y4=y+tl; 
    this.beginPath(); 
    this.moveTo(x1,y); 
    this.lineTo(x2,y); 
    radii=CURVE2KAPPA*tr; 
    this.bezierCurveTo(x2+radii,y,xw,y1-radii,xw,y1); 
    this.lineTo(xw,y2); 
    radii=CURVE2KAPPA*br; 
    this.bezierCurveTo(xw,y2+radii,x3+radii,yh,x3,yh); 
    this.lineTo(x4,yh); 
    radii=CURVE2KAPPA*bl; 
    this.bezierCurveTo(x4-radii,yh,x,y3+radii,x,y3); 
    this.lineTo(x,y4); 
    radii=CURVE2KAPPA*tl; 
    this.bezierCurveTo(x,y4-radii,x1-radii,y,x1,y); 
    this.stroke(); 
} 

ctx.roundRect(0,0,50,50,5,5,10,15); 
ctx.strokeStyle="red"; 
ctx.roundRect(0,0,50,50,5000,500,100,150); 
ctx.strokeStyle="blue"; 
ctx.roundRect(0,0,50,50,2500,250,50,75); 

Live demo

bawić.

4

Poniższa funkcja jest całkiem blisko. Chociaż jeśli użyjesz wartości większych niż szerokość i wysokość, będziesz mieć problemy.

Live Demo

function canvasRadius(x, y, w, h, tl, tr, br, bl){ 
    var r = x + w, 
     b = y + h; 

    ctx.beginPath(); 
    ctx.moveTo(x+tl, y); 
    ctx.lineTo(r-(tr), y); 
    ctx.quadraticCurveTo(r, y, r, y+tr); 
    ctx.lineTo(r, b-br); 
    ctx.quadraticCurveTo(r, b, r-br, b); 
    ctx.lineTo(x+bl, b); 
    ctx.quadraticCurveTo(x, b, x, b-bl); 
    ctx.lineTo(x, y+tl); 
    ctx.quadraticCurveTo(x, y, x+tl, y); 
    ctx.stroke(); 

} 

canvasRadius(10,10,50,50,5,5,10,15); 
ctx.strokeStyle = "red"; 
canvasRadius(80,10,50,50,47,3,0,0); 
ctx.strokeStyle = "blue"; 
canvasRadius(160,10,50,50,47,3,0,0); 
+0

Witam, na stronie internetowej W3C znalazłem: http://www.w3.org/TR/css3-background/#corner-overlap Ale nie rozumiem. – kran

Powiązane problemy