css利用transform skewX制作平行四边形导航菜单

所属分类: 网页制作 / CSS 阅读数: 1591
收藏 0 赞 0 分享

平行四边形其实是矩形的超集:它的各条边是两两平行的,但各个角则不一定都是直角。在视觉设计中,平行四边形往往可以传达出一种动感。

让我们试着用 CSS 创建一个按钮状的平行四边形链接。我们的起点就是一个普通的块状按钮,辅以一些简单的样式,然后,我们可以通过 skew() 的变形属性来对这个矩形进行斜向拉伸:

transform: skewX(-45deg);

但是,这导致它的内容也发生了斜向变形,这很不好看,而且难读。有没有办法只让容器的形状倾斜,而保持其内容不变呢?

很多人会想到嵌套元素方案,那么我们可以对内容再应用一次反向的 skew() 变形,从而抵消容器的变形效果,最终产生我们所期望的结果。不幸的是,这意味着我们将不得不使用一层额外的 HTML 元素来包裹内容,比如用一个 span:

<a href="www.jb51.net" class="button">
 <span>www.jb51.net</span>
</a>

.button { transform: skewX(-45deg); }
.button > span { transform: skewX(45deg); }

我们可以看到,这个方法的表现很不错,但它也意味着我们不得不添加额外的 HTML 元素。如果结构层的变更是不允许的,或者你希望严格保持结构层的纯净度,别担心,我们还有一个纯 CSS 的解决方案。

伪元素方案

另一种思路是把所有样式(背景、边框等)应用到伪元素上,然后再对伪元素进行变形。因为我们的内容并不是包含在伪元素里的,所以内容并不会受到变形的影响。下面来看看这个技巧能否得到与前面相同的链接样式。

我们希望伪元素保持良好的灵活性,可以自动继承其宿主元素的尺寸,甚至当宿主元素的尺寸是由其内容来决定时仍然如此。一个简单的办法是给宿主元素应用 position: relative 样式,并为伪元素设置 position:absolute,然后再把所有偏移量设置为零,以便让它在水平和垂直方向上都被拉伸至宿主元素的尺寸。代码看起来是这样的:

.button {
 position: relative;
 /* 其他的文字颜色、内边距等样式…… */
}
.button::before {
 content: '';
 position: absolute;
 top: 0; right: 0; bottom: 0; left: 0;
}

此时,用伪元素生成的方块是重叠在内容之上的,一旦给它设置背景,就会遮住内容。为了修复这个问题,我们可以给伪元素设置z-index: -1 样式,这样它的堆叠层次就会被推到宿主元素之后。现在我们要做的最后一步,就是尽情地对它设置变形样式,并享受美好的结果。最终版的代码如下所示,它产生的视觉效果跟前文所述技巧是完全一致的:

.button {
 position: relative;
 /* 其他的文字颜色、内边距等样式…… */
}
.button::before {
 content: ''; /* 用伪元素来生成一个矩形 */
 position: absolute;
 top: 0; right: 0; bottom: 0; left: 0;
 z-index: -1;
 background: #58a;
 transform: skew(45deg);
}

这个技巧不仅对 skew() 变形来说很有用,还适用于其他任何变形样式,当我们想变形一个元素而不想变形它的内容时就可以用到它。举个例子,我们把这个技巧针对 rotate() 变形样式稍稍调整一下,再用到一个正方形元素上,就可以很容易地得到一个菱形。

这个技巧的关键在于,我们利用伪元素以及定位属性产生了一个方块,然后对伪元素设置样式,并将其放置在其宿主元素的下层。这种思路同样可以运用在其他场景中,从而得到各种各样的效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

奇妙的 CSS 属性 MASK详解

这篇文章主要介绍了奇妙的 CSS 属性 MASK,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

css3实现小箭头各种图形效果

这篇文章主要介绍了css3实现小箭头各种图形效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

CSS让子容器超出父元素(子容器悬浮在父容器效果)

这篇文章主要介绍了CSS让子容器超出父元素(子容器悬浮在父容器效果),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

div自适应高度自动填充剩余高度

这篇文章主要介绍了div自适应高度自动填充剩余高度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

css实现图片自适应容器的几种方式(小结)

这篇文章主要介绍了css实现图片自适应容器的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

CSS 实现 10 种现代布局的代码

这篇文章主要介绍了CSS 实现 10 种现代布局的代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

CSS实现鼠标移入时图片的放大效果及缓慢过渡效果的示例代码

这篇文章主要介绍了CSS实现鼠标移入时图片的放大效果及缓慢过渡效果的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

CSS届的绘图板CSS Paint API简介

这篇文章主要介绍了CSS届的绘图板CSS Paint API简介,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值需要的朋友可以参考下
收藏 0 赞 0 分享

使用 CSS Paint API 动态创建与分辨率无关的可变背景效果

这篇文章主要介绍了使用 CSS Paint API 动态创建与分辨率无关的可变背景效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

在CSS网格布局中的列中填充项目的实现方法

这篇文章主要介绍了在CSS网格布局中的列中填充项目的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多