A 标签有趣的样式

在网上看到很多对 <a> 标签样式的设计,觉得很有趣,做了个实现原理和 demo 的整理收集。

浏览器默认,Hover 状态有下划线

c9a7017c249a61f51a0a580f3e34d88b.png

实现原理

A 标签在浏览器默认样式下是有下划线的,可以通过 text-decoration 属性进行设置,当值为 none 时隐藏。常见网站的处理都是隐藏它,但为了突出它是一个超链接, 会给它一个区别其它文本的颜色。

样式代码

a {
  color: #383c93;
  text-decoration: none;
}

CSS 自带属性实现波纹效果

8735b866dbd13af41f4e1448bf82c51a.png

实现原理

超链接 text-decoration 下面自带有属性 linecolorstylethickness 等属性,还可以通过 text-underline-offset 设置文本装饰距离文本的距离。

样式代码

a:hover {
  text-underline-offset: 6px;
  text-decoration-thickness: 2px;
  text-decoration-style: wavy;
}

底部边框,Hover 状态移动遮罩效果

4bd870fc4bdca894382d09795b87fd0a.png

实现原理

第一步:清除 A 标签默认下划线和 Hover 状态下的下划线样式。将它的颜色继承和其它文本颜色一致。这里会利用样式让它区别于其它文本;

第二步:然后利用伪元素 :after 设置特殊背景色,相较于 <a> 元素做绝对定位,模拟出位于底部的边框;

第三步:鼠标移动上去的时候,改变 :after 形成的颜色边框的位置,然后利用 transition 增加过度动画,让它有一个移动拉伸的效果。

样式代码

a {
  position: relative;
  white-space: nowrap;
  text-decoration: none;
  color: inherit;
}
a:hover {
  text-decoration: none;
}
a:after {
  content: '';
  position: absolute;
  z-index: -1;
  top: 68%;
  left: -0.1em;
  right: -0.1em;
  bottom: 0;
  transition: top 200ms cubic-bezier(0, 0.8, 0.13, 1);
  background-color: #4d52bb;
}
a:hover::after {
  top: 0%;
}

底部边框向右伸展效果

041c62340f8b154388ea83258606ae12.png

实现原理

第一步:清除 A 标签默认下划线和 Hover 状态下的下划线样式。将它的颜色继承和其它文本颜色一致。这里会利用样式让它区别于其它文本;

第二步:然后利用伪元素 ::before 设置特殊背景色,相较于 <a> 元素做绝对定位,模拟出位于底部的边框;

第三步:鼠标移动上去的时候,改变 ::before 形成的颜色边框在X轴方向进行伸展,然后利用 transition 增加过度动画,让它有一个移动拉伸的效果。

样式代码

a {
  position: relative;
}
a:hover {
  text-decoration: none;
}
a::before {
  content: '';
  width: 80%;
  position: absolute;
  top: 68%;
  left: 0;
  bottom: 0;
  z-index: -1;
  background: linear-gradient(45deg, #ee2d29, #f8ae2c);
  transition: transform 0.8s cubic-bezier(0.2,1,0.3,1);
  transform: scale3d(1,1,1);
  transform-origin: 0 0;
}
a:hover::before {
  transition: transform 0.8s cubic-bezier(0.2,1,0.3,1);
  transform: scale3d(1.2,1,1);
}

Hover 状态滑动的下划线

dc2949b407fb5523f5bcbee8b27a3753.png

实现原理

第一步:清除 A 标签默认下划线和 Hover 状态下的下滑线显示,设置有别于其它文本的颜色做区分;

第二步:利用伪元素 :before 把它设置成和字体颜色一致的底部边框,然后将它的长度通过 scale 变换设置成 0;

第三步:增加鼠标移动上去的样式,将边框的长度恢复,再增加个过度效果,模拟出动态伸展的效果。

样式代码

a {
  position: relative;
}
a:hover {
  text-decoration: none;
}
a::before {
  content: "";
  position: absolute;
  display: block;
  width: 100%;
  height: 2px;
  bottom: 5%;
  left: 0;
  background-color: #4d52bb;
  transform: scaleX(0);
  transition: transform 0.3s ease;
}
a:hover::before {
  transform: scaleX(1);
}

波纹效果下划线

53f7feaee9e83f27d8079b10a9f25b7d.png

实现原理

原理讲解参考 https://www.cnblogs.com/coco1s/p/11910097.html

样式代码

@function fact($number) {
  $value: 1;
  @if $number>0 {
      @for $i from 1 through $number {
          $value: $value * $i;
      }
  }
  @return $value;
}

@function pow($number, $exp) {
  $value: 1;
  @if $exp>0 {
      @for $i from 1 through $exp {
          $value: $value * $number;
      }
  }
  @else if $exp < 0 {
      @for $i from 1 through -$exp {
          $value: $value / $number;
      }
  }
  @return $value;
}

@function rad($angle) {
  $unit: unit($angle);
  $unitless: $angle / ($angle * 0 + 1);
  @if $unit==deg {
      $unitless: $unitless / 180 * pi();
  }
  @return $unitless;
}

@function pi() {
  @return 3.14159265359;
}

@function sin($angle) {
  $sin: 0;
  $angle: rad($angle);
  // Iterate a bunch of times.
  @for $i from 0 through 15 {
      $sin: $sin + pow(-1, $i) * pow($angle, (2 * $i + 1)) / fact(2 * $i + 1);
  }
  @return $sin;
}

@function shadowSetColor($vx, $vy, $direction, $count, $color) {
  $shadow : 0 0 0 0 $color;
  
  @for $i from 0 through $count { 
      
      $color: lighten($color, .5);
      
      $x: sin($i / 8) * $vx * $direction;
      $y: $i * $vy;
      
      $shadow: $shadow, #{$x} #{$y} 0 0 $color;
  }
  
  @return $shadow;
}
a {
  position: relative;
}
a:hover {
  text-decoration: none;
}

a::before {
  content: "";
  position: absolute;
  bottom: 2%;
  left: 0;
  display: block;
  width: 2px;
  height: 2px;
  background: var(--ifm-color-primary);
  border-radius: 50%;
  box-shadow: shadowSetColor(4px, 2px, -1, 60, green);
  transform: rotate(-90deg);
}

鼠标悬停波纹效果

4b48c2f816f2854fdaac3f9d229933e9.png

实现原理

清除 A 标签默认下划线和 Hover 状态下的下滑线显示,对 A 标签内容设置背景,长宽分别为 2px ,然后通过在横轴上重复形成一条直线;当鼠标悬停时将背景变换为一个 svg 格式的动态的波纹动画。

样式代码

a {
  background: linear-gradient(to bottom, #0087ca 0%, #0087ca 100%);
  background-position: 0 100%;
  background-repeat: repeat-x;
  background-size: 2px 2px;
  color: inherit;
  text-decoration: none;
}

a:hover {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 4'%3E%3Cstyle type='text/css'%3E.squiggle{animation:shift .3s linear infinite;}@keyframes shift {from {transform:translateX(0);}to {transform:translateX(-15px);}}%3C/style%3E%3Cpath fill='none' stroke='%230087ca' stroke-width='2' class='squiggle' d='M0,3.5 c 5,0,5,-3,10,-3 s 5,3,10,3 c 5,0,5,-3,10,-3 s 5,3,10,3'/%3E%3C/svg%3E");
  background-size: auto 4px;
  text-decoration: none;
}

向右展开的滑动的下划线

ada68f70c02ff7370a4c6a01e73a7316.png

实现原理

设置 A 元素的背景色,背景色的高度为元素高度的 40%,默认状态下的长度为 0, 当鼠标放上去的时候背景色大小做变换,长度变为 97%。

样式代码

a {
  padding-bottom: .2%;
  transition: background-size .6s ease-out;
  background: linear-gradient(var(--ifm-color-primary-lightest),
    var(--ifm-color-primary-lightest)) no-repeat left 123%/0 40%
}
a:hover {
  text-decoration: none;
  background-size: 97% 40%;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值