【问题标题】:transparent shape with arrow in upper corner上角带箭头的透明形状
【发布时间】:2015-05-03 07:33:33
【问题描述】:

请看下图。

我想在 div 的右上角添加一个箭头,我将其视为可编辑输入框。 请帮助我如何使用 CSS 实现这一目标。 我不能使用 SVG,因为我需要它作为 div 来在其上显示表情符号。

<div placeholder="Your message" id="Message">
...
</div>

【问题讨论】:

  • 你的背景是纯色的还是透明的?
  • 是的,会有帮助的人

标签: html css css-shapes curve


【解决方案1】:

你可以像下面的 sn-p 那样做。实现形状的方法如下:

  • 主要的div 元素只有一个顶部、底部和左侧边框。右边框无效,因为元素及其箭头需要是透明的。使用透明箭头,如果存在右边框,也会显示。
  • 右侧的箭头是使用相对于形状右边缘放置的skewed 元素实现的。
  • 形状的右边框是通过使用另一个伪元素来实现的,该伪元素的大小与整个容器的高度相同——箭头伪元素的高度。此元素相对于形状的右下角定位。

您可以根据需要调整高度和边框半径。我已经设置了定位,即使父级的高度/宽度发生变化也不会影响它。

div.shape {
  position: relative;
  width: 300px;
  height: 100px;
  padding: 4px;
  margin-top: 20px;
  border: 2px solid gray;
  border-right: none; /* not required as the shape needs to be transparent */
  border-radius: 8px; /* not required as the right border is done through pseudo element */
  border-top-right-radius: 0px;
  border-bottom-right-radius: 0px;
}
div.shape:before {
  position: absolute;
  content: '';
  top: -2px; /* equal to border top of parent - no need to change*/
  right: -6px; /* for positioning - no need to change*/
  height: 15%; /* should be changed depending on height of arrow */
  width: 10%; /* should be changed depending on width of arrow */
  border-top: 2px solid gray;
  border-right: 3px solid gray; /* thicker border because skew makes it thin */

  /* to achieve the arrow like shape */ 
  -webkit-transform-origin: bottom right;
  -webkit-transform: skew(-45deg);
  -moz-transform: skew(-45deg);
  transform: skew(-45deg);
}
div.shape:after {
  position: absolute;
  content: '';
  right: -6px; /* for positioning - no need to change*/
  height: 85%; /* height of parent - height of arrow */
  width: 2%; /* no need to change */
  bottom: -2px; /* equal to border bottom of parent - no need to change*/
  border-right: 2px solid gray;
  border-bottom: 2px solid gray;
  border-bottom-right-radius: 8px; /* for producing curve on bottom right */
}

/* Just for demo */

body {
  background: -webkit-linear-gradient(0deg, crimson, indianred, purple);
  background: -moz-linear-gradient(90deg, crimson, indianred, purple);
  background: linear-gradient(90deg, crimson, indianred, purple);
}
<div class="shape">
  Lorem Ipsum Dolor Sit Amet...
</div>

箭头可以通过改变定位属性和倾斜方向(从正角到负角)添加到左侧,如下面的sn-p。

div.shape {
  position: relative;
  width: 300px;
  height: 100px;
  padding: 4px;
  margin-top: 20px;
  margin-left: 20px;
  border: 2px solid gray;
  border-left: none; /* not required as the shape needs to be transparent */
  border-radius: 8px; /* not required as the right border is done through pseudo element */
  border-top-left-radius: 0px;
  border-bottom-left-radius: 0px;
}
div.shape:before {
  position: absolute;
  content: '';
  top: -2px; /* equal to border top of parent - no need to change*/
  left: -6px; /* for positioning - no need to change*/
  height: 15%; /* should be changed depending on height of arrow */
  width: 10%; /* should be changed depending on width of arrow */
  border-top: 2px solid gray;
  border-left: 3px solid gray; /* thicker border because skew makes it thin */

  /* to achieve the arrow like shape */ 
  -webkit-transform-origin: bottom right;
  -webkit-transform: skew(45deg);
  -moz-transform: skew(45deg);
  transform: skew(45deg);
}
div.shape:after {
  position: absolute;
  content: '';
  left: -6px; /* for positioning - no need to change*/
  height: 85%; /* height of parent - height of arrow */
  width: 2%; /* no need to change */
  bottom: -2px; /* equal to border bottom of parent - no need to change*/
  border-left: 2px solid gray;
  border-bottom: 2px solid gray;
  border-bottom-left-radius: 8px; /* for producing curve on bottom right */
}

/* Just for demo */

body {
  background: -webkit-linear-gradient(0deg, crimson, indianred, purple);
  background: -moz-linear-gradient(90deg, crimson, indianred, purple);
  background: linear-gradient(90deg, crimson, indianred, purple);
}
<div class="shape">
  Lorem Ipsum Dolor Sit Amet...
</div>

【讨论】:

    【解决方案2】:

    过滤器:阴影()

    兼容性是limited

    但效果还是很酷的:P

    .inputcontainer {
      display: inline-block;
      position: relative;
      filter: drop-shadow(0px 0px 5px black);
      -webkit-filter: drop-shadow(0px 0px 1px black);
    }
    .input {
      display: inline-block;
      border: none;
      border-radius: 10px;
      border-top-right-radius: 0px;
      width: 280px;
      height: 50px;
      background-color: white;
      padding-left: 20px;
      font-size: 20px;
    }
    .input:focus {
      outline: none;
    }
    .arrow {
      position: absolute;
      display: inline-block;
      top: 0;
      right: -5px;
      width: 20px;
      height: 20px;
      background-color: white;
      transform: skew(-45deg);
      z-index: -1;
    }
    <div class="inputcontainer">
      <input type="text" class="input" placeholder="Your message"/>
      <div class="arrow"></div>
    </div>

    盒子阴影:

    这里的兼容性是a lot better

    .inputcontainer {
      display: inline-block;
      position: relative;
      filter: drop-shadow(0px 0px 5px black);
    }
    .input {
      display: inline-block;
      border: none;
      border-radius: 10px;
      border-top-right-radius: 0px;
      width: 280px;
      height: 50px;
      background-color: white;
      padding-left: 20px;
      font-size: 20px;
      box-shadow: 0px 0px 0px 2px gray;
    }
    .input:focus {
      outline: none;
    }
    .arrow {
      position: absolute;
      display: inline-block;
      top: 0;
      right: -8px;
      width: 20px;
      height: 20px;
      background-color: white;
      transform: skew(-45deg);
      box-shadow: 2px -2px 0px 0px gray;
    }
    <div class="inputcontainer">
      <input type="text" class="input" placeholder="Your message"/>
      <div class="arrow"></div>
    </div>

    【讨论】:

      猜你喜欢
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多