【问题标题】:CSS Border rotation [duplicate]CSS边框旋转[重复]
【发布时间】:2013-07-11 13:46:02
【问题描述】:

在 css 中我可以单独旋转边框,而不是旋转整个元素吗? 像这样:

我基本上想为我的视频播放器创建一个倾斜的边框。

我想做类似这篇文章的公认答案:click here

除了不倾斜顶部和底部,它只倾斜右侧。

这个我试过了,但是左右两边都倾斜了:

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);
}

【问题讨论】:

  • 您可以尝试使用 CSS 生成的箭头。在这里你有关于它们的很好的文档:yuiblog.com/blog/2010/11/22/…。我不相信这是解决方案,但它可能是其中之一。您可能会发现这个技巧很有帮助。
  • 好兄弟!我对您的评论投了赞成票,对 cme​​ts 的加票是否会改变声誉>
  • 如果这是您要找的,我会把它作为答案!
  • 不,没有达到我想要的效果,但仍然帮了很多忙,这就是我投票的原因,等一下,我也会投票给你的答案!
  • 哦,不是吗?那我就不应该这样做了……还是谢谢

标签: css rotation border


【解决方案1】:

需要 JavaScript 和画布的解决方案,但提供了极大的多功能性 -

结果:

ONLINE DEMO

代码:

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';
}

添加这个用于创建圆角矩形(带 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();
}

然后,您只需使用元素 ID、边框宽度以及要向右倾斜多少像素来调用此函数:

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

【讨论】:

  • 我可以为它设置圆角边框吗?如果是,我会接受你的回答(请给出代码)
  • @tenstar 老兄,这有点误导,但是是的,你可以有圆形边框和其他任何东西。
  • 我已经在你提到的链接中尝试了边框半径,但只对左上角进行了四舍五入。
  • 我试过这个:div { background-color: black; color:white; position: relative; width: 100px; } #demo:after { content: ' '; height: 0; position: absolute; width: 0; border: 10px solid transparent; border-top-color: black; border-left-color: black; left: 100px; }
  • @tenstar 你知道,我们不应该为你编写所有代码,我们是来帮助你解决问题的,我想我和其他人做了+一些.您需要自己做一些事情;)如果回答有帮助,请不要忘记投票/接受。
【解决方案2】:

按照这里解决这个问题:)

click here

希望对你有帮助

.b-border{
    display: inline-block;
    position: relative;
    border: solid #333;
    border-width: 1px 1px 0px 1px;
    padding: 20px;
    margin-bottom: 100px;
}
.b-border.border-right{
  border-width: 1px 0 1px 1px;
}

.b-border.border-right:after{
    content: "";
    position: absolute;
    right: -30px;
    border-top: 1px solid #333;
     border-left: none medium;
    top: -1px;
    left: auto;
    width: 30px;
    height: 100%;
    background: linear-gradient(to top left, white calc(50% - 1px), #000 1px, white 50%);
}
.b-border:after{
    content: "";
    position: absolute;
    left: -1px;
    bottom: -15%;
    border-left: 1px solid #333;
    height: 15%;
    width: calc(100% + 1px);
    background: linear-gradient(to right bottom, white calc(50% - 1px), #000 1px, white 50%);
}
<div class="b-border border-right">
    Hello :)
</div>
<p></p>
<div class="b-border" style="width: 300px;">
    Lorem ipsum dolor sit amet, consectetur 
    Lorem ipsum dolor sit amet, consectetur
    Lorem ipsum dolor sit amet, consectetur
     Lorem ipsum dolor sit amet, consectetur 
     Lorem ipsum dolor sit amet, consectetur 
</div>

【讨论】:

    【解决方案3】:

    您可以尝试使用 CSS 生成的箭头。 Here is an overview 如何创建和使用它们。

    我不相信这是解决方案,但它可能是其中之一。您可能会发现这个技巧很有帮助。

    最好的

    【讨论】:

      【解决方案4】:

      你可以这样做:http://jsfiddle.net/py9Ze/

      HTML:

      <div id="vid-container">
          <span><embed>this is straight</embed></span>
      </div>
      

      CSS:

      #vid-container {
          border: 1px solid;
          height: 200px;
          -moz-transform: scale(1) rotate(10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
          -webkit-transform: scale(1) rotate(10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
          -o-transform: scale(1) rotate(10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
          -ms-transform: scale(1) rotate(10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
          transform: scale(1) rotate(10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
      }
      span {
          position: absolute;
          -moz-transform: scale(1) rotate(-10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
          -webkit-transform: scale(1) rotate(-10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
          -o-transform: scale(1) rotate(-10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
          -ms-transform: scale(1) rotate(-10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
          transform: scale(1) rotate(-10deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg);
      }
      

      基本上在父容器周围放一个边框并旋转x度,然后旋转子-x度。

      PS 我在防火墙后面,所以我看不到您发布的图片,所以这可能与您想要的有所不同。

      【讨论】:

      • 你能检查一下我所做的编辑吗,我提到了另一个 * 帖子并告诉了我想要什么
      • @tenstar 类似这样:jsfiddle.net/py9Ze/1?
      • 用代码检查我的编辑
      • @tenstar 看看这个:jsfiddle.net/py9Ze/2