摘要:用批量生成刻度線因?yàn)榭潭染€有很多條,為了減少代碼量,我們用來批量創(chuàng)建刻度線。同時修改屬性和函數(shù),讓它們引用這個變量的值。繪制指針指針是由個三角形組成的,對于這種成對的元素,通常都用偽元素繪制。最后,加一點(diǎn)動畫效果,讓指針像指南針那樣轉(zhuǎn)動。
效果預(yù)覽
按下右側(cè)的“點(diǎn)擊預(yù)覽”按鈕可以在當(dāng)前頁面預(yù)覽,點(diǎn)擊鏈接可以全屏預(yù)覽。
https://codepen.io/comehope/pen/rgmPLR
可交互視頻此視頻是可以交互的,你可以隨時暫停視頻,編輯視頻中的代碼。
請用 chrome, safari, edge 打開觀看。
https://scrimba.com/p/pEgDAM/c2LBPPtg
源代碼下載每日前端實(shí)戰(zhàn)系列的全部源代碼請從 github 下載:
https://github.com/comehope/front-end-daily-challenges
代碼解讀 容器基本屬性Safari 瀏覽器的 LOGO 是一個指南針的形狀,它的主要元素有 2 個,一個是圍繞在表盤周圍的刻度線,一個是中間的指針。所以我們定義 dom 結(jié)構(gòu)如下,其中 .marks 代表刻度線,.pointer 代表指針。.marks 中有 4 個 元素,它們代表刻度線,實(shí)際的刻度線有幾十條,這里只定義 4 條,目的是便于書寫樣式,等樣式寫好后,接下來會用 JavaScript 批量生成刻度線:
讓作品顯示在頁面正中,頁面背景為黑色:
body { margin: 0; height: 100vh; display: flex; align-items: center; justify-content: center; background-color: black; }
LOGO 容器是一個白色的圓角正方形。作品將使用 em 作為長度單位,如果想修改 LOGO 的尺寸,只要修改這里的 font-size 屬性就可以了。用 flex 布局令其中的子元素 .marks 和 .pointer 都居中顯示:
.safari { font-size: 10px; width: 15em; height: 15em; background-color: snow; border-radius: 25%; padding: 1em; display: flex; align-items: center; justify-content: center; }繪制刻度線
先繪制出刻度線所在的表盤,用線性漸變填充上藍(lán)色漸變色:
.marks { width: inherit; height: inherit; background-image: linear-gradient( hsl(191, 98%, 55%), hsl(220, 88%, 53%) ); border-radius: 50%; }
再繪制出刻度線。圍繞著一個圓周繪圖的技巧是先令一組元素逐個旋轉(zhuǎn)較小的角度(用 rotate() 函數(shù)實(shí)現(xiàn)),再讓這些元素向旋轉(zhuǎn)的方向移動(用 translate() 函數(shù)實(shí)現(xiàn))。這里用變量 --rotate-deg 存儲旋轉(zhuǎn)的角度:
.marks { display: flex; align-items: center; justify-content: center; } .marks span { position: absolute; width: 0.1em; height: 0.9em; background-color: snow; transform: rotate(var(--rotate-deg)) translateY(6em); } .marks span:nth-child(1) {--rotate-deg: 0deg;} .marks span:nth-child(2) {--rotate-deg: 90deg;} .marks span:nth-child(3) {--rotate-deg: 180deg;} .marks span:nth-child(4) {--rotate-deg: 270deg;}
現(xiàn)在可以看到 4 條刻度線分別定位到表盤的上、下、左、右的邊緣位置了。
用 Javascript 批量生成刻度線因?yàn)榭潭染€有很多條,為了減少代碼量,我們用 JavaScript 來批量創(chuàng)建刻度線。
在此之前,先刪除掉 html 中的聲明 元素的 4 行代碼:
再刪除 css 中設(shè)置刻度線角度的代碼:
/* .marks span:nth-child(1) {--rotate-deg: 0deg;} .marks span:nth-child(2) {--rotate-deg: 90deg;} .marks span:nth-child(3) {--rotate-deg: 180deg;} .marks span:nth-child(4) {--rotate-deg: 270deg;} */
然后用 js 來批量創(chuàng)建 60 條刻度線:
const MARKS_COUNT = 60 Array(MARKS_COUNT).fill("").forEach((x, i) => { let span = document.createElement("span") span.style.setProperty("--rotate-deg", i * 360 / MARKS_COUNT + "deg") document.querySelector(".marks").appendChild(span) })
這里稍復(fù)雜的是表達(dá)式 i * 360 / MARKS_COUNT + "deg",其中 360 / MARKS_COUNT 是把一個圓周的 360 度分成若干份(也就是刻度線數(shù)量那么多的份數(shù))之后每一份的角度,再用每一份的下標(biāo)值 i 去乘它,就得到每條刻度線應(yīng)旋轉(zhuǎn)的角度了。
接下來設(shè)置刻度線的細(xì)節(jié),令刻度線長短交錯。代表刻度線長度的變量是 --h,長線長 0.9em,短線長 0.5em,為了讓刻度線對齊,再用變量 --y 存儲偏移量,令長線偏移 6em,短線偏移 6.2em。同時修改 height 屬性和 translateY() 函數(shù),讓它們引用這 2 個變量的值。因?yàn)榭潭染€長短交錯,所以用 :nth-child(odd) 和 :nth-child(even) 來設(shè)置 2 組不同的參數(shù)值:
.marks span { height: var(--h); transform: rotate(var(--rotate-deg)) translateY(var(--y)); } .marks span:nth-child(odd) {--h: 0.9em; --y: 6em;} .marks span:nth-child(even) {--h: 0.5em; --y: 6.2em;}
至此,刻度線繪制完成。
繪制指針指針是由 2 個三角形組成的,對于這種成對的元素,通常都用偽元素繪制。先確定一下指針的尺寸,用 flex 令它的子元素(也就是 2 個偽元素)縱向排列:
.pointer { position: absolute; width: 1.4em; height: 12em; display: flex; flex-direction: column; }
繪制三角形的技巧是令容器的尺寸為 0 寬 0 高,然后用 3 條邊框構(gòu)成三角形,要是看不懂這段代碼的話,動手試試就明白了。這里也定義了一個變量 --c,用于存儲 2 個三角形的顏色,分別是紅色和白色:
.pointer::before, .pointer::after { content: ""; border-bottom: 6em solid var(--c); border-left: 0.7em solid transparent; border-right: 0.7em solid transparent; } .pointer::after { transform: rotate(180deg); } .pointer::before {--c: crimson;} .pointer::after {--c: snow;}
到這里,指針繪制完成,整個 LOGO 的形狀也已經(jīng)完成了。
最后,加一點(diǎn)動畫效果,讓指針像指南針那樣轉(zhuǎn)動。原理很簡單,就是讓指針在 30 度到 50 度之間來回擺動:
.pointer { transform: rotate(30deg); animation: rotate 1s ease-in-out infinite alternate; } @keyframes rotate { to { transform: rotate(50deg); } }
大功告成!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/114654.html
摘要:用批量生成刻度線因?yàn)榭潭染€有很多條,為了減少代碼量,我們用來批量創(chuàng)建刻度線。同時修改屬性和函數(shù),讓它們引用這個變量的值。繪制指針指針是由個三角形組成的,對于這種成對的元素,通常都用偽元素繪制。最后,加一點(diǎn)動畫效果,讓指針像指南針那樣轉(zhuǎn)動。 showImg(https://segmentfault.com/img/bVbsTZD?w=400&h=399); 效果預(yù)覽 按下右側(cè)的點(diǎn)擊預(yù)覽按...
摘要:用批量生成刻度線因?yàn)榭潭染€有很多條,為了減少代碼量,我們用來批量創(chuàng)建刻度線。同時修改屬性和函數(shù),讓它們引用這個變量的值。繪制指針指針是由個三角形組成的,對于這種成對的元素,通常都用偽元素繪制。最后,加一點(diǎn)動畫效果,讓指針像指南針那樣轉(zhuǎn)動。 showImg(https://segmentfault.com/img/bVbsTZD?w=400&h=399); 效果預(yù)覽 按下右側(cè)的點(diǎn)擊預(yù)覽按...
摘要:過往項(xiàng)目年月份項(xiàng)目匯總共個項(xiàng)目年月份項(xiàng)目匯總共個項(xiàng)目年月份項(xiàng)目匯總共個項(xiàng)目年月份項(xiàng)目匯總共個項(xiàng)目年月份項(xiàng)目匯總共個項(xiàng)目年月份項(xiàng)目匯總共個項(xiàng)目年月至年月發(fā)布的項(xiàng)目前端每日實(shí)戰(zhàn)專欄每天分解一個前端項(xiàng)目,用視頻記錄編碼過程,再配合詳細(xì)的代碼解讀, 過往項(xiàng)目 2018 年 9 月份項(xiàng)目匯總(共 26 個項(xiàng)目) 2018 年 8 月份項(xiàng)目匯總(共 29 個項(xiàng)目) 2018 年 7 月份項(xiàng)目匯總(...
閱讀 1382·2021-11-15 18:11
閱讀 2512·2021-08-19 10:56
閱讀 677·2021-08-09 13:42
閱讀 793·2019-08-30 15:53
閱讀 2086·2019-08-30 10:55
閱讀 3142·2019-08-29 17:18
閱讀 1435·2019-08-29 13:45
閱讀 545·2019-08-29 13:15