使用 hover 伪类 和 盒子模型实现 米哈游官网 导航栏的动画效果。
需求,图标本身没有特效,当鼠标放上去时浮现出周围的蓝色边框,并且鼠标变成选中样式,那怎么做呢?
关键点:主要是鼠标悬停时改变样式。需要边框,但边框不是紧挨着图标的。
使用 hover 来触发悬停时增加样式,使用transtition增加过渡效果
案例分析
可以看到,在原本的img图标外还有一个盒子,其具有内外边距和一个透明的边框。必须要设置一个透明边框,因为如果本来没有边框的宽度,新增边框的话会额外增加像素,造成塌缩。
分析:
- 需要用img标签导入图标,可以将img设置成块级block(img原生是行内块级)
- 需要在img外套一个盒子,并且由于该图标是导航栏效果,不能使用块级元素(因为块级会独占一行),可以使用代表导航栏的标签 nav(nav默认是块级元素,所以需要将其修改为浮动flex元素或者行内块元素)或者使用div并将div修改为行内块元素即可。
- 需要将nav盒子的宽高设置为和图标的大小一样,即盒子紧贴图标(这样做的好处是增加内边距时图标会默认保持在盒子中间,而不会偏移)然后通过增加内边距padding将盒子撑开,让之后的边框远离图标,形成需要的效果。
- 给nav盒子设置一个透明的实线边框,为之后边框变色预留位置,避免造成塌陷。
- 设置hover伪类,修改边框的颜色,边框的宽度必须和盒子预留的相同,避免造成塌陷。
- 给nav盒子添加一个transition属性,指定边框为变化元素,并设置过渡时间300ms(米哈游官网是300ms)
- 给 hover 伪类 设置一个 cursor 游标属性,将其值设置为pointer,即可改变鼠标指针的样式。
- 设置box-sizing为contentbox,这样修改内外边距或者边框的宽度时会修改内容content的高宽,而不会向外延申或者偏离,避免造成塌陷。
- 需要将nav的显示模式修改为浮动flex或者行内块元素line-block,如果使用flex的话还需要给定额外的参数,本例中使用较为简单的line-block
- 以上了解了,就可以开干了。
前提要点:
要习惯css的前置步骤:
- 将网页原生的内外边距清零。
- 习惯设置盒子在网页中水平居中(margin: 0 auto;)
- 必须给父亲盒子设置overflow:hidden或者添加边框,让子元素能以父元素为坐标,而不会溢出父元素(不是以整个网页为坐标)
开干!
<!-- 我们这里使用类选择器,当然也可以直接用nav选择器 -->
<nav class="bh3">
<img src="./bh3.png" alt="YoHo">
</nav>
<style>
* {
margin: 0;
padding: 0;
}
html {
/* 给网页设置默认的字体大小,之后子元素的字体、圆角等属性都可以用rem来设置以父元素字体大小为基础的比例 */
font-size: 14px;
}
body {
/* rem单位表示父元素字体大小的倍数,0.24则表示父元素字体大小的0.24倍,即 14px 乘 0.24 */
font-size: 0.24rem
}
.bh3 {
/*将nav修改为行内块元素,可以存放多个导航图标,而不是独占一行*/
display: inline-block;
width: 140px;
height: 140px;
margin: 0 auto;
margin-bottom: 50px;
padding: 4px;
/* overflow: hidden; */
text-align: center;
border-radius: 0.6rem;
/* 这里需要预设一个透明的边框,不然在hover中添加边框时会因为额外多出了边框的像素而造成页面塌陷 */
border: 4px solid transparent;
/* 设置过渡元素和过渡时间 */
transition: border 300ms;
/* 修改鼠标(游标)指针的样式为手指 */
cursor: pointer;
}
.bh3:hover {
/* 这里设置的borde必须与父亲中的border宽度一样,才不会出现塌陷 */
border: 4px solid #3778e5;
}
nav img {
display: block;
border-radius: 0.6rem;
}
</style>