tenstar tenstar - 9 days ago 5
CSS Question

CSS Border rotation

In css can i rotate the border alone, instead of rotating the whole element?
something like this:

I basically wanna create a slanting border for my video player.

enter image description here

I wanna do something like the accepted answer of this post: click here

except that instead of slanting the top and bottom it slants only the right side.

I've tried this, but it slants both left and right sides:

html:

<div class="skew-neg">
<p>Hello World.</p>
<p>My name is Jonathan.</p>
<p>This box is skewed.</p>
<p>In supported browsers.</p>
</div>‚Äč


css:

html {
background: #FFF;
color: lightblue;
font: 16px 'Arial';
line-height: 150%;
}

div {
background: blue;
margin: 50px auto 0;
padding: 20px;
width: 200px;
box-sizing: border-box;
box-shadow: 0 0 20px rgba(0,0,0,.9);
border-radius: 25px;
}

.skew-neg {
-webkit-transform: skewX(-50deg);
-moz-transform: skewX(-50deg);
-ms-transform: skewX(-50deg);
-o-transform: skewX(-50deg);
transform: skewX(-50deg);
}

.skew-neg > * {
-webkit-transform: skewX(50deg);
-moz-transform: skewX(50deg);
-ms-transform: skewX(50deg);
-o-transform: skewX(50deg);
transform: skewX(50deg);
}

K3N K3N
Answer

A solution that require JavaScript and canvas, but offers great versatility -

Result:

Snapshot

ONLINE DEMO

Code:

function makeBorder(id, bw, rSkew, radius) {

    var el = document.getElementById(id),
        canvas = document.createElement('canvas'),
        ctx = canvas.getContext('2d'),

        bwh = bw / 2,
        w = parseInt(getComputedStyle(el).getPropertyValue('width'), 10),
        h = parseInt(getComputedStyle(el).getPropertyValue('height'), 10);

    canvas.width = w;
    canvas.height = h;

    /// draw border        
    ctx.beginPath();
    roundedRect(ctx, bwh, bwh, w - bwh, h - bwh, radius, rSkew);
    ctx.lineWidth = bw;
    ctx.stroke();

    /// set as background
    el.style.background = 'url(' + canvas.toDataURL() + ') no-repeat top left';
}

The add this for creating the rounded rectangle (with mod. for skew):

function roundedRect(ctx, x, y, w, h, rul, skew) {
    //modification to fit purpose here

    var rur = rul,
        rbr = rul,
        rbl = rul,
        dul = rul * 2,
        dur = rul * 2,
        dbr = rul * 2,
        dbl = rul * 2,
        _x, _y,
        ww = x + w,
        hh = y + h,
        rr,
        pi = Math.PI,
        pi15 = Math.PI * 1.5,
        pi05 = Math.PI * 0.5;

    //Upper Left    
    rr = [x, y, dul, dul];
    _x = rr[0] + rr[2] / 2;
    _y = rr[1] + rr[3] / 2;
    ctx.arc(_x, _y, rul, pi, pi15);

    //Upper right
    rr = [ww - dur, y, dur, dur];
    _x = rr[0] + rr[2] / 2;
    _y = rr[1] + rr[3] / 2;
    ctx.arc(_x, _y, rur, pi15, 0);

    ctx.lineTo(ww - skew, h);

    //Bottom left
    rr = [x, hh - dbl, dbl, dbl];
    _x = rr[0] + rr[2] / 2;
    _y = rr[1] + rr[3] / 2;
    ctx.arc(_x, _y - 1, rbl, pi05, pi);
    ctx.closePath();
}

Then you just call this function with ID of element, border width and how many pixels you want to skew the right side with:

makeBorder('demo', 2, 50, 7);