如何旋转伪元素css

How to rotate pseudo element css

我想使用 css 伪元素(作为切换指示器)重新创建此图标:

我使用 ::after, ::before 创建了必要的伪元素,并尝试使用 transform: rotate(90deg) 旋转它们。

如何让他们绕着自己的中心旋转?我试过 transform-origin: 50% 50%; ,但没有用。现在,两个伪元素都得到了相同的 right: 10px; 但它们并没有放在彼此之上,而是彼此相邻。

你可以检查这个JS FIDDLE来说明问题。

将#pseudo::after的样式修改为right: 0;

#div {
  background: blue;
  width: 80px;
  height: 80px;
  transform: rotate(45deg);
}

/* tested but not working */
#pseudo::after,
#pseudo::before {
  /* transform-origin: 50% 50%; */
}


#pseudo::after {
  content: '›';
  font-size: 50px;
  color: green;
  right: 0;
  position: absolute;
  transform: rotate(90deg);
  top: 40px;
}

#pseudo::before {
  content: '›';
  font-size: 50px;
  position: absolute;
  color: green;
  right: 10px;
  top: 10px;
  transform: rotate(-90deg);
}
<div id="div"></div>

<div id="pseudo"></div>

首先你可以使用 :before:after 伪元素并创建这样的形状 DEMO

之后,您可以旋转 45deg 的父元素并获得所需的结果。

.el {
  margin: 50px;
  position: relative;
  transform: rotate(45deg);
  display: inline-block;
}
.el:before,
.el:after {
  content: '';
  width: 30px;
  height: 30px;
  position: absolute;
}
.el:before {
  border-top: 4px solid black;
  border-left: 4px solid black;
  top: -10px;
  left: -10px;
}
.el:after {
  border-bottom: 4px solid black;
  border-right: 4px solid black;
  top: 10px;
  left: 10px;
}
<div class="el"></div>

更新:您还可以像这样在:hover上添加一些过渡

.el {
  margin: 50px;
  position: relative;
  transform: rotate(45deg);
  display: inline-block;
  cursor: pointer;
}
.el:before,
.el:after {
  content: '';
  width: 30px;
  height: 30px;
  position: absolute;
  transition: all 0.3s ease-in;
}
.el:before {
  border-top: 4px solid black;
  border-left: 4px solid black;
  top: -10px;
  left: -10px;
}
.el:after {
  border-bottom: 4px solid black;
  border-right: 4px solid black;
  top: 10px;
  left: 10px;
}
.el:hover:before {
  top: -15px;
  left: -15px;
}
.el:hover:after {
  top: 15px;
  left: 15px;
}
<div class="el"></div>

transform-origin 工作正常,只是

a) 50% 50%(对象的中心)是默认值,并且

b) 您必须将框的内容居中。这有点棘手,因为您使用的图标不需要完整的行高。尝试添加

::before, ::after {
  padding-bottom: .17em;
}