利⽤SVG和CSS3来实现⼀个炫酷的边框动画
当⿏标经过⽹格元素时,会有⼀个微妙的动画发⽣——⽹格元素变得透明,每条边有个顺时针的动画,创造了⾮常好的效果。这种效果是通过JS给span标签的宽或者⾼做了动画。我们待会会⽤SVG和CSS渐变来完成。注意,这个技术还是实验性的。
⾸先,让我们来看看基本的概念,然后我们会朝着这个⽅向努⼒。
请注意,我们将在SVG上使⽤CSS过渡,可能⽆法得到所有浏览器的⽀持。
乍眼⼀看可能不明⽩这个效果是怎么完成的。我们先仔细看看上⾯的边就会发现,⽩⾊的边的宽度不断从右边往左边延伸,⽽⼀条稍微延时的边紧跟着⼀起移动。每条边都有这样的做法。看起来就像上⾯的边经过拐⾓移动到了左边,并以此类推。
不⽤SVG也能完成这样的效果,甚⾄只⽤伪元素。但是我们想探索⼀下怎样⽤CSS⽽不是JavaScript来控制SVG。js控制css3动画触发
现在,来思考⼀下要怎么创建出这样的效果。我们可以改变矩形的troke-dashoffset或者直接画线。我们尝试不⽤JavaScript的解决⽅案。我们发现,CSS过渡stroke-dashoffset 和 stroke-dasharray的值会触发很多BUG。所以我们要尝试不同的解决⽅案,利⽤线条和它们的动画,这在CSS⾥很容易理解和实现。
这也给我们更多机会去探索不同的动画效果。
新建⼀个前端学习qun438905713,在⾥⼤多数都是零基础学习者,⼤家相互帮助,相互解答,并且还准备很多学习资料,欢迎零基础的⼩伙伴来⼀起交流。
我们将要使⽤的线的特别之处是,它们在这个动画⾥将有三种状态。它们是⽅盒边长的三倍,其中中间⼀截是与边等长的间隙。我们将通过设置stroke-dashoffset的值来实现与⽅盒的边等长。现在,这个动画实现的关键在于线的位置转换:
SVG与⽅盒⼤⼩⼀致,就不会看到超出虚线的部分。
我们先完成第⼀条线:
CSS Code复制内容到剪贴板
1. <div>
2. <svg width="200" height="200">
3. <line x1="0" y1="0" x2="600" y2="0" />
4. </svg>
5. </div>
这个div长宽20px,和SVG⼀样。把SVG位置设为absolute,线宽度为10,stroke-dasharray为200。
CSS Code复制内容到剪贴板
div {
width: 200px;
height: 200px;
position: relative;
overflow: hidden;
background: #ddd;
}
svg {
position: absolute;
top: 0;
left: 0;
}
svg line {
stroke-width: 10;
stroke: #000;
fill: none;
stroke-dasharray: 200;
-webkit-transition: -webkit-transform .6s ease-out;
transition: transform .6s ease-out;
}
div:hover svg line {
-webkit-transform: translateX(-400px);
transform: translateX(-400px);
}
当数⿏标悬浮在div上时,线也有⼀个过渡。我们要把线移动到它的三分之⼆处,所以要在x轴上移动到-400px处,你可以看看这个效果。因为translation不能在这⾥⽤百分⽐做单位,所以⽤px。
接着添加其余三条线,gif效果:
我们需要实现以下效果:线的第⼀部分移出⽅盒后,旁边的线的最后⼀部分移动进来,,这将传进直线在转⾓处转弯的假象,
来看看坐标系的定义:
左边的线的坐标是(0,200) 到 (0,-400),底部的是(200,200) 到 (-400,200),右边的是right one (200,0) 到 (200,600): 给每条线加上不同的hover效果:
CSS Code复制内容到剪贴板
div:hover p {
-webkit-transform: translateX(-400px);
transform: translateX(-400px);
}
div:hover svg line.bottombottom {
-webkit-transform: translateX(400px);
transform: translateX(400px);
}
div:hover svg line.left {
-webkit-transform: translateY(400px);
transform: translateY(400px);
}
div:hover svg line.rightright {
-webkit-transform: translateY(-400px);
transform: translateY(-400px);
}
看看现在的效果。
现在⽅盒⼤⼩改为300 x 460,再给它添加⼀些内容:
CSS Code复制内容到剪贴板
新建⼀个前端学习qun438905713,在⾥⼤多数都是零基础学习者,⼤家相互帮助,相互解答,并且还准备很多学习资料,欢迎零基础的⼩伙伴来⼀起交流。
D
2012
Broccoli, Asparagus, Curry
为了实现Carl Philipe Brenner的⽹站上的效果,我们还要添加颜⾊过渡效果、盒⼦阴影等:
CSS Code复制内容到剪贴板
.box {
width: 300px;
height: 460px;
position: relative;
background: rgba(255,255,255,1);
display: inline-block;
margin: 0 10px;
cursor: pointer;
color: #2c3e50;
box-shadow: inset 0 0 0 3px #2c3e50;
-webkit-transition: background 0.4s 0.5s;
transition: background 0.4s 0.5s;
}
.box:hover {
background: rgba(255,255,255,0);
-webkit-transition-delay: 0s;
transition-delay: 0s;
}
给⽂字加上样式:
CSS Code复制内容到剪贴板
.box h3 {
font-family: "Ruthie", cursive;
font-size: 180px;
line-height: 370px;
margin: 0;
font-weight: 400;
width: 100%;
}
.box span {
display: block;
font-weight: 400;
text-transform: uppercase;
letter-spacing: 1px;
font-size: 13px;
padding: 5px;
}
.box h3,
.box span {
-webkit-transition: color 0.4s 0.5s; transition: color 0.4s 0.5s;
}
.box:hover h3,
.box:hover span {
color: #fff;
-webkit-transition-delay: 0s;
transition-delay: 0s;
}
给SVG和线条添加样式:
CSS Code复制内容到剪贴板
.box svg {
position: absolute;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论