【问题标题】:CSS transform from hamburger icon to cross to arrowCSS从汉堡图标转换为十字箭头
【发布时间】:2016-02-25 20:24:06
【问题描述】:

我正在尝试使用 CSS 转换将三行汉堡菜单中的图标设置为动画以跨越到向右箭头。第一个转换效果很好,但我坚持第二个:交叉箭头。

这是一个小提琴:

https://jsfiddle.net/v0fgvdg2/25

以及SCSS中的相关样式:

.threebar {
  cursor: pointer;
  margin-top: 33px;
  margin-left: 33px;
  .bar {
    width: 70px;
    height: 22px;
    background: #000;
    margin-bottom: 11px;
    transition: all 0.5s ease;
    &:nth-child(1) {
      transform-origin: 50%;
    }
    &:nth-child(2) {
      transform-origin: 50%;
    }
  }
  &.cross {
    .bar:nth-child(1) {
      transform: translateY(75%)  rotate(45deg);
    }
    .bar:nth-child(2) {
      transform: translateY(-75%) rotate(-45deg);
    }
    .bar:nth-child(3) {
      opacity: 0;
    }
  }
  &.arrow {
    .bar:nth-child(1) {
      background: red;
      transform: scaleX(0.5) translateY(50%) rotate(45deg);
    }
    .bar:nth-child(2) {
      background: blue;
      transform: scaleX(0.5) translateY(50%) rotate(-45deg);
    }
    .bar:nth-child(3) {
      opacity: 0;
    }
  }
}

我无法真正理解如何将转换应用于箭头状态。

我希望右箭头类似于十字的左侧,因此是 scaleX(0.5),但这会产生扭曲形状的效果,而不是像我希望的那样简单地将其减半。

有人对如何思考这个问题有任何建议吗?

非常感谢您的帮助!

【问题讨论】:

  • this 这样的东西会不会不好? (右侧有轻微错位

标签: css css-shapes css-transforms


【解决方案1】:

这是产生您正在寻找的效果的一种方法。我已经稍微改变了定位和其他内容,但基本想法与您原来的想法相同。我已经绝对定位了所有三个条形元素,并使用transform: translateY() 将它们放到原来的位置。当形状需要变成箭头时,我已经更改了transform-origin,然后应用了必要的变换。

SCSS 代码:

.threebar {
  cursor: pointer;
  position: relative;
  height: 88px; /* 22px * 3 + space between (11px * 2) */
  margin-top: 33px;
  margin-left: 33px;
  .bar {
    position: absolute;
    width: 70px;
    height: 22px;
    background: #000;
    top: 33px;
    transition: all 0.5s ease;
    &:nth-child(1) {
      transform: translateY(-150%);
    }
    &:nth-child(3) {
      transform: translateY(150%);
    }
  }
  &.cross {
    .bar:nth-child(1) {
      transform: rotate(45deg);
    }
    .bar:nth-child(3) {
      transform: rotate(-45deg);
    }
    .bar:nth-child(2) {
      opacity: 0;
    }
  }
  &.arrow {
    .bar:nth-child(1) {
      transform-origin: right center;
      transform: translateY(33%) rotate(45deg);
    }
    .bar:nth-child(3) {
      transform-origin: right center;
      transform: translateY(-33%) rotate(-45deg);
    }
    .bar:nth-child(2) {
      opacity: 0;
    }
  }
}

带有编译 CSS 的演示:

//Hamburger to cross

$(document).on('click', '.hamburger', function() {
  $('.threebar')
    .removeClass('hamburger')
    .addClass('cross');
});

// Cross to Arrow 
$(document).on('click', '.cross', function() {
  $('.threebar')
    .removeClass('cross')
    .addClass('arrow');
});

// Arrow to Hamburger 
$(document).on('click', '.arrow', function() {
  $('.threebar')
    .removeClass('arrow')
    .addClass('hamburger');
});
.threebar {
  cursor: pointer;
  position: relative;
  height: 88px; /* 22px * 3 + space between (11px * 2) */
  margin-top: 33px;
  margin-left: 33px;
}
.threebar .bar {
  position: absolute;
  width: 70px;
  height: 22px;
  background: #000;
  top: 33px;
  transition: all 0.5s ease;
}
.threebar .bar:nth-child(1) {
  transform: translateY(-150%);
}
.threebar .bar:nth-child(3) {
  transform: translateY(150%);
}
.threebar.cross .bar:nth-child(1) {
  transform: rotate(45deg);
}
.threebar.cross .bar:nth-child(3) {
  transform: rotate(-45deg);
}
.threebar.cross .bar:nth-child(2) {
  opacity: 0;
}
.threebar.arrow .bar:nth-child(1) {
  transform-origin: right center;
  transform: translateY(33%) rotate(45deg);
}
.threebar.arrow .bar:nth-child(3) {
  transform-origin: right center;
  transform: translateY(-33%) rotate(-45deg);
}
.threebar.arrow .bar:nth-child(2) {
  opacity: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='threebar hamburger'>
  <div class='bar'></div>
  <div class='bar'></div>
  <div class='bar'></div>
</div>

不同尺寸的演示:

输出似乎也相当敏感。下面是不同尺寸的条的演示。

//Hamburger to cross

$(document).on('click', '.hamburger', function() {
  $('.threebar')
    .removeClass('hamburger')
    .addClass('cross');
});

// Cross to Arrow 
$(document).on('click', '.cross', function() {
  $('.threebar')
    .removeClass('cross')
    .addClass('arrow');
});

// Arrow to Hamburger 
$(document).on('click', '.arrow', function() {
  $('.threebar')
    .removeClass('arrow')
    .addClass('hamburger');
});
.threebar {
  cursor: pointer;
  position: relative;
  height: 90px;
  margin-top: 33px;
  margin-left: 33px;
}
.threebar .bar {
  position: absolute;
  width: 75px;
  height: 25px;
  background: #000;
  top: 25px;
  transition: all 0.5s ease;
}
.threebar .bar:nth-child(1) {
  transform: translateY(-150%);
}
.threebar .bar:nth-child(3) {
  transform: translateY(150%);
}
.threebar.cross .bar:nth-child(1) {
  transform: rotate(45deg);
}
.threebar.cross .bar:nth-child(3) {
  transform: rotate(-45deg);
}
.threebar.cross .bar:nth-child(2) {
  opacity: 0;
}
.threebar.arrow .bar:nth-child(1) {
  transform-origin: right center;
  transform: translateY(33%) rotate(45deg);
}
.threebar.arrow .bar:nth-child(3) {
  transform-origin: right center;
  transform: translateY(-33%) rotate(-45deg);
}
.threebar.arrow .bar:nth-child(2) {
  opacity: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='threebar hamburger'>
  <div class='bar'></div>
  <div class='bar'></div>
  <div class='bar'></div>
</div>

带有与十字左半边完全一样的箭头的演示:

我最初的假设是您只需要将十字变成箭头(类似于十字的左半部分)。如果您想让它与左半部分完全相同(即按比例缩小),那么您可以使用下面的 sn-p。

//Hamburger to cross

$(document).on('click', '.hamburger', function() {
  $('.threebar')
    .removeClass('hamburger')
    .addClass('cross');
});

// Cross to Arrow 
$(document).on('click', '.cross', function() {
  $('.threebar')
    .removeClass('cross')
    .addClass('arrow');
});

// Arrow to Hamburger 
$(document).on('click', '.arrow', function() {
  $('.threebar')
    .removeClass('arrow')
    .addClass('hamburger');
});
.threebar {
  cursor: pointer;
  position: relative;
  height: 88px;
  margin-top: 33px;
  margin-left: 33px;
}
.threebar .bar {
  position: absolute;
  width: 70px;
  height: 22px;
  background: #000;
  top: 33px;
  transition: all 0.5s ease;
}
.threebar .bar:nth-child(1) {
  transform: translateY(-150%);
}
.threebar .bar:nth-child(3) {
  transform: translateY(150%);
}
.threebar.cross .bar:nth-child(1) {
  transform: rotate(45deg);
}
.threebar.cross .bar:nth-child(3) {
  transform: rotate(-45deg);
}
.threebar.cross .bar:nth-child(2) {
  opacity: 0;
}
.threebar.arrow .bar:nth-child(1) {
  transform-origin: right center;
  transform: translateX(-33.33%) translateY(33%) rotate(45deg) scaleX(0.66);
}
.threebar.arrow .bar:nth-child(3) {
  transform-origin: right center;
  transform: translateX(-33.33%) translateY(-33%) rotate(-45deg) scaleX(0.66);
}
.threebar.arrow .bar:nth-child(2) {
  opacity: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='threebar hamburger'>
  <div class='bar'></div>
  <div class='bar'></div>
  <div class='bar'></div>
</div>

【讨论】:

  • 非常感谢!特别是最后一个 sn-p 正是我想要完成的。
【解决方案2】:

您的示例中的问题是转换操作的顺序。您需要记住,首先执行最右边的操作,在您的情况下是旋转。只有这样才会应用缩放,这会导致您看到奇怪的角度。

所以,只要把顺序转一转,你会更清楚,你不需要改变原点或使用倾斜操作:

transform: translateY(50%) rotate(45deg) scaleX(0.5);

Simple DEMO(还需要调整翻译)

【讨论】:

  • 非常感谢您指出操作的顺序在这里起着至关重要的作用。将来会帮助我!
猜你喜欢
  • 1970-01-01
  • 2015-11-20
  • 2015-03-02
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多