不久看到這樣一個很有趣的效果,它的滾動條是沿著圓角邊緣滾動的,效果如下
你可以查看原鏈接來體驗一下
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小時內與您取得聯系。