不久看到这样一个很有趣的效果,它的滚动条是沿着圆角边缘滚动的,效果如下
你可以查看原链接来体验一下
https://codepen.io/jh3y/pen/gOEgxbd
这是如何实现的呢?
原效果中由于为了兼容不支持CSS滚动驱动的浏览器,特意用 JS做了兼容,所以看着比较复杂,其实核心非常简单,下面我将用最简短的 CSS 来复刻这一效果,一起看看吧
从本质上来讲,其实是一个 SVG 路径动画。
具体如何实现呢?
首先,我们通过设计软件绘制一个这样的路径
注意设置描边的大小还有端点的类型,比如下面是round效果
然后导出SVG,可以得到这样一段代码
<svg viewBox="0 0 31 433" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 4C9.96737 4 15.6903 6.37053 19.9099 10.5901C24.1295 14.8097 26.5 20.5326 26.5 26.5V406.5C26.5 412.467 24.1295 418.19 19.9099 422.41C15.6903 426.629 9.96737 429 4 429" stroke="black" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
然后,如何让这段SVG动起来呢?
很简单,现在SVG是一段实线,我们可以通过stroke-dasharray设置成虚线,比如
path{
stroke-dasharray: 80
}
这样会得到一个实线和虚线间隔都是80的虚线
如果希望虚线空白的地方更大一点,该怎么设置呢?很简单,继续往后加
path{
stroke-dasharray: 80 120
}
效果如下
所以,这种写法其实相当于把当前的值无限重复,示意如下
当然,我们这里不需要设置的这么复杂,只需要一小段实线就够了,所以是实现加上一段足够长的虚线(超过路径本身就行),实现如下
path{
stroke-dasharray: 80 1000
}
这样就得到了一小段实线
那么,如何让他动起来呢?很简单,改变一下偏移就可以,这个可以用stroke-dashoffset来实现
比如,我们
@keyframes scroll {
to {
stroke-dashoffset: -370
}
}
path{
stroke-dasharray: 80 1000;
animation: scroll 3s alternate-reverse infinite;
}
效果如下
是不是有点像呢?
我们再调整一下起始偏移量,让它出去一点
@keyframes scroll {
0% { stroke-dashoffset: 75; }
100% { stroke-dashoffset: -445; }
}
这样就更接近我们想要的效果了
整个运动原理就是这样了,接着往下看
接下来需要通过滚动驱动动画将容器滚动与CSS动画「联动」起来。
关于CSS 滚动驱动可以参考我之前写的这篇文章:CSS 滚动驱动动画终于正式支持了~
简单来讲,「CSS 滚动驱动动画」指的是将「动画的执行过程由页面滚动」进行接管,也就是这种情况下,「动画只会跟随页面滚动的变化而变化」,也就是滚动多少,动画就执行多少,「时间不再起作用」。
先简单布局一下
<div class="list">
<div class="item" id="item_1">1</div>
<div class="item" id="item_2">2</div>
<div class="item" id="item_3">3</div>
<div class="item" id="item_4">4</div>
<div class="item" id="item_5">5</div>
<div class="item" id="item_6">6</div>
<div class="item" id="item_7">7</div>
</div>
美化一下
然后,我们将默认的滚动条隐藏,用我们这个 SVG路径来代替,由于需要绝对定位,我们再套一层父级
<div class="wrap">
<div class="list">
<div class="item" id="item_1">1</div>
<div class="item" id="item_2">2</div>
<div class="item" id="item_3">3</div>
<div class="item" id="item_4">4</div>
<div class="item" id="item_5">5</div>
<div class="item" id="item_6">6</div>
<div class="item" id="item_7">7</div>
<!--滚动条-->
<svg class="scroller" viewBox="0 0 31 433" fill="none" xmlns="http://www.w3.org/2000/svg">
<path class="scroller_thumb" d="M4 4C9.96737 4 15.6903 6.37053 19.9099 10.5901C24.1295 14.8097 26.5 20.5326 26.5 26.5V406.5C26.5 412.467 24.1295 418.19 19.9099 422.41C15.6903 426.629 9.96737 429 4 429" stroke="black" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
</div>
相关CSS如下
.wrap{
position: relative;
}
.scroller {
position: absolute;
top: 0;
bottom: 0;
right: 0;
pointer-events: none;
height: -webkit-fill-available;
margin: 5px;
}
.scroller_thumb{
stroke: hsl(0 0% 100% / 0.5);
stroke-dasharray: 80 450;
stroke-width: 8px;
animation: scroll both 5s linear;
}
这样结构就搭好了,只是滚动条会自动播放
接下来就是最关键的一步,加上滚动驱动动画
.scroller_thumb{
animation: scroll both 5s linear;
animation-timeline: scroll();
}
但是这样是不起作用的,直接使用scroll()会自动寻找它的相对父级,也就是.wrap,但实际滚动的其实是.list,所以这种情况下我们需要具名的滚动时间线,实现如下
.list{
scroll-timeline: --scroller;
}
.scroller_thumb{
animation: scroll both 5s linear;
animation-timeline: --scroller;
}
这样SVG路径动画就能跟随容器滚动而运动了
原效果中还有一个滚动回弹的效果,当滚动到容器边缘时,会自动回弹到起始位置。
其实只需要用到 CSS scroll snap 就可以了
https://developer.mozilla.org/zh-CN/docs/Web/CSS/scroll-snap-type
实现很简单,给滚动容器添加scroll-snap-type属性,表示这是个允许滚动吸附的容器
.list{
scroll-snap-type: y mandatory;
}
然后就指定需要吸附的点了,由于需要回弹的效果,所以滚动容器的首尾需要一个空白的容器,这里直接用两个伪元素来生成
.list::before,
.list::after{
content: '';
height: 50px;
flex-shrink: 0;
}
效果如下
然后我们设置滚动吸附点就行了,设置第一个元素顶部和最后一个元素底部,其他元素居中就行了
.item{
scroll-snap-align: center;
}
.item:first-child{
scroll-snap-align: start;
}
/*最后一个元素是 SVG,所以这里用倒数第二个元素*/
.item:nth-last-child(2){
scroll-snap-align: end;
}
这样就实现了文章开头的效果了
完整代码可以查看以下链接(无任何 JS)
总的来说,CSS滚动驱动在滚动交互上带来了无限可能,很多以前必须借助 JS来实现的都可以轻易实现,下面总结一下
作者:XboxYan
来源:微信公众号:前端侦探
出处:https://mp.weixin.qq.com/s/GaakgWhXm6jpY4PfISNHZQ
现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示:
滚动的文字
适当的运用<marquee>标签的参数,可以表现出不同的效果,请看下面的几个例子:
1、左右弹来弹去的跑马灯
弹来弹去跑马灯! 实现的方法就是在IE的标签上稍微多加了几个参数产生了更加丰富的变化。设置behavior=alternate表示双向移动,direction= left表示运动方向向左。marquee的宽度可以使用绝对象素值,例如width=200等这个值限定了跑马灯滚动的范围。需要说明的是该效果在 Netscape下是看不到的。
源码粘贴框:
<marquee width=400 behavior=alternate direction=left align=middle>弹来弹去跑马灯!</marquee>
2、跑的很快的跑马灯
跑的很快跑马灯! 只要在<marquee>标签后面加上“scrollamount=15”即可,修改=后边的数字参数即可限制文字移动的速度。
3、带有超级链接的跑马灯
带超级链接的跑马灯!点我试试? 还有一条呢!点我试试? 实现的方法很简单,把整个<marquee></marquee>语句包含在超链接中就行,你看看下面的代码就清楚了。当然你也可以把包含在<marquee></marquee>中的各条内容分别加上不同的链接,这样的跑马灯就可用来发布滚动新闻或是做站点导航了。
如果你想给跑马灯的文字加上颜色,换用不同的字体(默认是宋体,换体就要加代码),只要在文字前加上<FONT face=楷体_GB2312 color=#ff0000 size=3>就行了,你可在“face=”后边换上你喜欢的字体,在“color=”后边换上你喜欢的字颜色,在“size=”后边换上适合的字号,如果想让字体加粗,就再加上<STRONG>。
请看一下效果: 带超级链接的跑马灯!点我试试? 还有一条呢!点我试试? 上面效果的代码码如下:
<marquee width=400 scrollamount=2> <a href=http://www.taobaojp5.tk><FONT face=楷体_GB2312 color=#ff0000 size=3><STRONG>带有超链接的跑马灯!点我试试?</a> <a href=http://954872988.qzone.qq.com/;还有一条呢!点我试试?</FONT></STRONG></a> </marquee>
以上几个例子都是<marquee>标签参数的应用,下面把所有可以利用的参数列在表中供你参考,不过还是要提醒你,<marquee>标签只被IE所支持,使用Netscape浏览器是看不到的噢。
参数用法介绍behavior=scroll, slide, alternate跑马方式:循环绕行,只跑一次就停住,来回往复运动direction=left,right跑马方向:从左向右,从右向左loop=100跑马次数:循环100次,如不写默认为一直循环width=100%,height=200跑马范围:宽为100%,高为200像素scrollamount=20跑马速度:数越大越快scrolldelay=500跑马延时:毫秒数,利用它可实现跃进式滚动hspace=20,vspace=20跑马区域与其它区域间的空白大小bgcolor=#00FFCC跑马区域的背景颜色face=楷体_GB2312跑马灯文字字体color=#ff0000跑马灯文字颜色size=3跑马灯文字字号STRONG跑马灯文字加粗
你已经看到,尽管<marquee>参数不少,但毕竟不能实现复杂的和自定义的特殊跑马灯效果,而且还有浏览器限制,所以我们更多情况下会采用JavaScript来实现跑马灯。
avascript中制作滚动代码的常用属性
1.网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offsetWidth (包括边线的宽); 网页可见区域高: document.body.offsetHeight (包括边线的宽); 网页正文全文宽: document.body.scrollWidth; 网页正文全文高: document.body.scrollHeight; 网页被卷去的高: document.body.scrollTop; 网页被卷去的左: document.body.scrollLeft; 网页正文部分上: window.screenTop; 网页正文部分左: window.screenLeft; 屏幕分辨率的高: window.screen.height; 屏幕分辨率的宽: window.screen.width; 屏幕可用工作区高度: window.screen.availHeight;
2.假设 obj 为某个 HTML 控件。
obj.offsetTop 指 obj 距离上方或上层控件的位置,整型,单位像素。 obj.offsetLeft 指 obj 距离左方或上层控件的位置,整型,单位像素。 obj.offsetWidth 指 obj 控件自身的宽度,整型,单位像素。 obj.offsetHeight 指 obj 控件自身的高度,整型,单位像素。
我们对前面提到的“上方或上层”与“左方或上层”控件作个说明。 例如:
“提交”按钮的 offsetTop 指“提交”按钮距“tool”层上边框的距离,因为距其上边最近的是 “tool” 层的上边框。 “重置”按钮的 offsetTop 指“重置”按钮距“tool”层上边框的距离,因为距其上边最近的是 “tool” 层的上边框。 “提交”按钮的 offsetLeft 指“提交”按钮距“tool”层左边框的距离,因为距其左边最近的是 “tool” 层的左边框。 “重置”按钮的 offsetLeft 指“重置”按钮距“提交”按钮右边框的距离,因为距其左边最近的是“提交”按钮的右边框。
以上属性在 FireFox 中也有效。
3.offsetTop 与 style.top 的区别
预备知识:offsetTop、offsetLeft、offsetWidth、offsetHeight 我们知道 offsetTop 可以获得 HTML 元素距离上方或外层元素的位置,style.top 也是可以的,二者的区别是:
(1)offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px。 (2)offsetTop 只读,而 style.top 可读写。 (3)如果没有给 HTML 元素指定过 top 样式,则 style.top 返回的是空字符串。
offsetLeft 与 style.left、offsetWidth 与 style.width、offsetHeight 与 style.height 也是同样道理。 offsetWidth与style.width属性的区别在于:如对象的宽度设定值为百分比宽度,则无论页面变大还是变小,style.width都返回此百分比,而offsetWidth则返回在不同页面中对象的宽度值而不是百分比值
4.scrollLeft : 对象的最左边到对象在当前窗口显示的范围内的左边的距离. 即是在出现了横向滚动条的情况下,滚动条拉动的距离. scrollTop 对象的最顶部到对象在当前窗口显示的范围内的顶边的距离. 即是在出现了纵向滚动条的情况下,滚动条拉动的距离.
*请认真填写需求信息,我们会在24小时内与您取得联系。