使用 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>
