国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
主元素樣式(星形)
滑塊樣式(選中值)
半星評(píng)分
使用鍵盤(pán)調(diào)整評(píng)分
更多示例!
結(jié)論
文章系列
首頁(yè) web前端 css教程 僅CSS的星級(jí)等級(jí)組件等等! (第1部分)

僅CSS的星級(jí)等級(jí)組件等等! (第1部分)

Mar 07, 2025 pm 04:38 PM

A CSS-Only Star Rating Component and More! (Part 1)

構(gòu)建星級(jí)評(píng)分組件是Web開(kāi)發(fā)中的經(jīng)典練習(xí),已使用多種技術(shù)反復(fù)實(shí)現(xiàn)。通常需要少量JavaScript代碼,但僅使用CSS實(shí)現(xiàn)呢?是的,可以!

這是一個(gè)僅使用CSS實(shí)現(xiàn)的星級(jí)評(píng)分組件演示。您可以點(diǎn)擊更新評(píng)分。

很酷,對(duì)吧?除了僅使用CSS外,HTML代碼只是一個(gè)單一元素:

<input type="range">

范圍輸入元素是理想的選擇,因?yàn)樗试S用戶在兩個(gè)邊界(最小值和最大值)之間選擇數(shù)值。我們的目標(biāo)是設(shè)計(jì)這個(gè)原生元素,將其轉(zhuǎn)換為星級(jí)評(píng)分組件,無(wú)需額外的標(biāo)記或任何腳本!我們還將在最后創(chuàng)建更多組件,敬請(qǐng)關(guān)注。

注意: 本文僅關(guān)注CSS部分。雖然我盡力考慮了UI、UX和可訪問(wèn)性方面,但我的組件并不完美。它可能有一些缺點(diǎn)(錯(cuò)誤、可訪問(wèn)性問(wèn)題等),因此請(qǐng)謹(jǐn)慎使用。

<input type="range"> 元素

您可能知道,由于所有默認(rèn)的瀏覽器樣式以及不同的內(nèi)部結(jié)構(gòu),設(shè)計(jì)原生元素(如輸入元素)有點(diǎn)棘手。例如,如果您檢查范圍輸入元素的代碼,您會(huì)在Chrome(或Safari、Edge)和Firefox之間看到不同的HTML。

幸運(yùn)的是,我們有一些共同的部分,我將依賴(lài)這些部分。我將定位兩個(gè)不同的元素:主元素(輸入本身)和滑塊元素(您使用鼠標(biāo)滑動(dòng)以更新值的那個(gè)元素)。

我們的CSS主要如下所示:

input[type="range"] {
  /* 主元素樣式 */
}

input[type="range"][i]::-webkit-slider-thumb {
  /* Chrome、Safari和Edge的滑塊樣式 */
}

input[type="range"]::-moz-range-thumb {
  /* Firefox的滑塊樣式 */
}

唯一的缺點(diǎn)是我們需要重復(fù)滑塊元素的樣式兩次。不要嘗試執(zhí)行以下操作:

input[type="range"][i]::-webkit-slider-thumb,
input[type="range"]::-moz-range-thumb {
  /* 滑塊樣式 */
}

這不起作用,因?yàn)檎麄€(gè)選擇器無(wú)效。Chrome等不理解::-moz-*部分,而Firefox不理解::-webkit-*部分。為簡(jiǎn)單起見(jiàn),在本文中,我將使用以下選擇器:

input[type="range"]::thumb {
  /* 滑塊樣式 */
}

但是演示包含帶有重復(fù)樣式的真實(shí)選擇器。介紹足夠了,讓我們開(kāi)始編碼吧!

主元素樣式(星形)

我們首先定義大小:

input[type="range"] {
  --s: 100px; /* 控制大小 */

  height: var(--s);
  aspect-ratio: 5;

  appearance: none; /* 刪除默認(rèn)瀏覽器樣式 */
}

如果我們認(rèn)為每顆星都位于一個(gè)正方形區(qū)域內(nèi),那么對(duì)于5星級(jí)評(píng)分,我們需要寬度等于高度的五倍,因此使用aspect-ratio: 5。

該5值也定義為輸入元素的max屬性的值。

<input type="range" max="5">

因此,我們可以依靠新增強(qiáng)的attr()函數(shù)(目前僅限Chrome)來(lái)讀取該值,而不是手動(dòng)定義它!

input[type="range"] {
  --s: 100px; /* 控制大小 */

  height: var(--s);
  aspect-ratio: attr(max type(<number>));

  appearance: none; /* 刪除默認(rèn)瀏覽器樣式 */
}</number>

現(xiàn)在您可以通過(guò)簡(jiǎn)單地調(diào)整max屬性來(lái)控制星星的數(shù)量。這很棒,因?yàn)?code>max屬性也被瀏覽器內(nèi)部使用,因此更新該值將控制我們的實(shí)現(xiàn)以及瀏覽器的行為。

這個(gè)增強(qiáng)的attr()版本目前僅在Chrome中可用,因此我所有的演示都包含一個(gè)后備方案來(lái)幫助不支持的瀏覽器。

下一步是使用CSS遮罩來(lái)創(chuàng)建星星。我們需要形狀重復(fù)五次(或更多次,取決于max值),因此遮罩大小應(yīng)等于var(--s) var(--s)var(--s) 100%或簡(jiǎn)化為var(--s),因?yàn)槟J(rèn)情況下高度將等于100%。

&lt;input type=&quot;range&quot;&gt;

您可能會(huì)問(wèn)mask-image屬性是什么?我想我告訴您它需要一些漸變并不奇怪,但它也可以是SVG。本文是關(guān)于創(chuàng)建星級(jí)評(píng)分組件的,但我希望星形部分保持通用性,以便您可以輕松地將其替換為任何您想要的形狀。這就是為什么我在這篇文章的標(biāo)題中說(shuō)“還有更多”。我們稍后將看到如何使用相同的代碼結(jié)構(gòu)獲得各種不同的變體。

這里有一個(gè)演示,展示了星形的兩種不同的實(shí)現(xiàn)方式。一種是使用漸變,另一種是使用SVG。

在這種情況下,SVG實(shí)現(xiàn)看起來(lái)更簡(jiǎn)潔,代碼也更短,但請(qǐng)記住這兩種方法,因?yàn)闈u變實(shí)現(xiàn)有時(shí)可以做得更好。

滑塊樣式(選中值)

現(xiàn)在讓我們關(guān)注滑塊元素。使用最后一個(gè)演示,然后單擊星星,并注意滑塊的位置。

好消息是,對(duì)于所有值(從最小值到最大值),滑塊始終位于給定星形的區(qū)域內(nèi),但每個(gè)星形的位置不同。如果位置始終相同,而不管值如何,那就更好了。理想情況下,為了保持一致性,滑塊應(yīng)始終位于星形的中心。

這是一張圖,用于說(shuō)明位置以及如何更新它。

這些線是每個(gè)值的滑塊位置。在左側(cè),我們有默認(rèn)位置,其中滑塊從主元素的左邊緣移動(dòng)到右邊緣。在右側(cè),如果我們通過(guò)在兩側(cè)添加一些空間來(lái)限制滑塊的位置到較小的區(qū)域,我們將獲得更好的對(duì)齊方式。該空間等于一顆星大小的一半,或var(--s)/2。我們可以為此使用填充:

input[type="range"] {
  /* 主元素樣式 */
}

input[type="range"][i]::-webkit-slider-thumb {
  /* Chrome、Safari和Edge的滑塊樣式 */
}

input[type="range"]::-moz-range-thumb {
  /* Firefox的滑塊樣式 */
}

它更好,但并不完美,因?yàn)槲覜](méi)有考慮滑塊大小,這意味著我們沒(méi)有真正的居中。這不是問(wèn)題,因?yàn)槲覍⑹褂玫扔?px的寬度使滑塊的大小非常小。

input[type="range"][i]::-webkit-slider-thumb,
input[type="range"]::-moz-range-thumb {
  /* 滑塊樣式 */
}

滑塊現(xiàn)在是一條細(xì)線,位于星形的中心。我使用紅色來(lái)突出顯示位置,但在現(xiàn)實(shí)中,我不需要任何顏色,因?yàn)樗鼘⑹峭该鞯摹?/p>

您可能認(rèn)為我們距離最終結(jié)果還很遠(yuǎn),但我們快完成了!缺少一個(gè)屬性來(lái)完成這個(gè)難題:border-image

border-image屬性允許我們使用其outset功能在元素外部繪制裝飾。為此,我使滑塊變小且透明。著色將使用border-image完成。我將使用具有兩種純色的漸變作為源:

input[type="range"]::thumb {
  /* 滑塊樣式 */
}

我們編寫(xiě)如下內(nèi)容:

&lt;input type=&quot;range&quot;&gt;

上述內(nèi)容意味著我們將border-image的區(qū)域從元素的每一側(cè)擴(kuò)展100px,并且漸變將填充該區(qū)域。換句話說(shuō),漸變的每種顏色將覆蓋該區(qū)域的一半,即100px。

你明白邏輯了嗎?我們?cè)诨瑝K的每一側(cè)創(chuàng)建了一種溢出的著色——一種將邏輯地跟隨滑塊的著色,因此每次單擊一顆星時(shí),它都會(huì)滑入到位!

現(xiàn)在,讓我們使用一個(gè)非常大的值而不是100px:

我們快完成了!著色填充了所有星星,但我們不希望它位于中間,而是位于整個(gè)選定星形上。為此,我們稍微更新一下漸變,而不是使用50%,我們使用50% var(--s)/2。我們添加一個(gè)等于星形寬度一半的偏移量,這意味著第一種顏色將占據(jù)更多空間,我們的星級(jí)評(píng)分組件就完美了!

我們?nèi)匀豢梢陨晕?yōu)化代碼,而不是為滑塊定義高度,我們將它保持為0,并且考慮border-image的垂直outset來(lái)擴(kuò)展著色。

input[type="range"] {
  /* 主元素樣式 */
}

input[type="range"][i]::-webkit-slider-thumb {
  /* Chrome、Safari和Edge的滑塊樣式 */
}

input[type="range"]::-moz-range-thumb {
  /* Firefox的滑塊樣式 */
}

我們也可以使用圓錐漸變來(lái)不同地編寫(xiě)漸變:

input[type="range"][i]::-webkit-slider-thumb,
input[type="range"]::-moz-range-thumb {
  /* 滑塊樣式 */
}

我知道border-image的語(yǔ)法不容易理解,我對(duì)解釋有點(diǎn)快。但我有一篇非常詳細(xì)的文章發(fā)表在Smashing Magazine上,我在其中用很多例子剖析了這個(gè)屬性,我邀請(qǐng)您閱讀,以便更深入地了解該屬性的工作原理。

我們組件的完整代碼如下:

input[type="range"]::thumb {
  /* 滑塊樣式 */
}
input[type="range"] {
  --s: 100px; /* 控制大小 */

  height: var(--s);
  aspect-ratio: 5;

  appearance: none; /* 刪除默認(rèn)瀏覽器樣式 */
}

就是這樣!幾行CSS代碼,我們就得到了一個(gè)漂亮的星級(jí)評(píng)分組件!

半星評(píng)分

如何將評(píng)分粒度設(shè)置為半星?這很常見(jiàn),我們可以通過(guò)進(jìn)行一些調(diào)整來(lái)完成之前的代碼。

首先,我們將輸入元素更新為以半步而不是全步遞增:

<input type="range" max="5">

默認(rèn)情況下,步長(zhǎng)等于1,但我們可以將其更新為.5(或任何值),然后也將最小值更新為.5。在CSS方面,我們將填充從var(--s)/2更改為var(--s)/4,并且對(duì)漸變中的偏移量也執(zhí)行相同的操作。

input[type="range"] {
  --s: 100px; /* 控制大小 */

  height: var(--s);
  aspect-ratio: attr(max type(<number>));

  appearance: none; /* 刪除默認(rèn)瀏覽器樣式 */
}</number>

兩種實(shí)現(xiàn)方式之間的差異是一個(gè)二分之一的因子,這也是步長(zhǎng)值。這意味著我們可以使用attr()并創(chuàng)建適用于這兩種情況的通用代碼。

input[type="range"] {
  --s: 100px; /* 控制大小 */

  height: var(--s);
  aspect-ratio: attr(max type(<number>));

  appearance: none; /* 刪除默認(rèn)瀏覽器樣式 */

  mask-image: /* ... */;
  mask-size: var(--s);
}</number>

這是一個(gè)演示,其中修改步長(zhǎng)是您需要做的所有事情來(lái)控制粒度。不要忘記,您還可以使用max屬性來(lái)控制星星的數(shù)量。

使用鍵盤(pán)調(diào)整評(píng)分

如您所知,我們可以使用鍵盤(pán)調(diào)整范圍滑塊輸入的值,因此我們也可以使用鍵盤(pán)來(lái)控制評(píng)分。這是一件好事,但有一個(gè)警告。由于使用了mask屬性,我們不再具有指示鍵盤(pán)焦點(diǎn)的默認(rèn)輪廓,這對(duì)依賴(lài)鍵盤(pán)輸入的用戶來(lái)說(shuō)是一個(gè)可訪問(wèn)性問(wèn)題。

為了獲得更好的用戶體驗(yàn)并使組件更易于訪問(wèn),最好在焦點(diǎn)時(shí)顯示輪廓。最簡(jiǎn)單的解決方案是添加一個(gè)額外的包裝器:

&lt;input type=&quot;range&quot;&gt;

當(dāng)內(nèi)部的輸入具有焦點(diǎn)時(shí),這將具有輪廓:

input[type="range"] {
  /* 主元素樣式 */
}

input[type="range"][i]::-webkit-slider-thumb {
  /* Chrome、Safari和Edge的滑塊樣式 */
}

input[type="range"]::-moz-range-thumb {
  /* Firefox的滑塊樣式 */
}

嘗試在下面的示例中使用鍵盤(pán)來(lái)調(diào)整這兩個(gè)評(píng)分:

另一個(gè)想法是考慮更復(fù)雜的遮罩配置,該配置使元素周?chē)男^(qū)域保持可見(jiàn)以顯示輪廓:

input[type="range"][i]::-webkit-slider-thumb,
input[type="range"]::-moz-range-thumb {
  /* 滑塊樣式 */
}

我更喜歡使用最后一種方法,因?yàn)樗3至藛卧貙?shí)現(xiàn),但也許您的HTML結(jié)構(gòu)允許您在父元素上添加焦點(diǎn),您可以保持遮罩配置簡(jiǎn)單。這完全取決于您!

更多示例!

正如我之前所說(shuō),我們制作的不僅僅是一個(gè)星級(jí)評(píng)分組件。您可以輕松更新遮罩值以使用任何您想要的形狀。

這是一個(gè)示例,我使用的是心的SVG而不是星形。

為什么不是蝴蝶?

這次我使用PNG圖像作為遮罩。如果您不習(xí)慣使用SVG或漸變,則可以使用透明圖像。只要您有SVG、PNG或漸變,您就可以使用此方法做任何形狀的事情。

我們可以進(jìn)一步定制并創(chuàng)建一個(gè)像下面的音量控制組件:

在最后一個(gè)示例中,我沒(méi)有重復(fù)特定的形狀,而是使用復(fù)雜的遮罩配置來(lái)創(chuàng)建信號(hào)形狀。

結(jié)論

我們從一個(gè)星級(jí)評(píng)分組件開(kāi)始,最后得到了許多很酷的示例。標(biāo)題本可以是“如何設(shè)計(jì)范圍輸入元素”,因?yàn)檫@就是我們所做的。我們?cè)跊](méi)有任何腳本或額外標(biāo)記的情況下升級(jí)了一個(gè)原生組件,并且只使用了幾行CSS代碼。

你呢?你能想到另一個(gè)使用相同代碼結(jié)構(gòu)的漂亮組件嗎?在評(píng)論區(qū)分享您的示例!

文章系列

  1. 僅CSS的星級(jí)評(píng)分組件及更多?。ǖ谝徊糠郑?/li>
  2. 僅CSS的星級(jí)評(píng)分組件及更多?。ǖ诙糠郑?3月7日推出!

以上是僅CSS的星級(jí)等級(jí)組件等等! (第1部分)的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

什么是'渲染障礙CSS”? 什么是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會(huì)阻塞頁(yè)面渲染是因?yàn)闉g覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量?jī)?nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢(xún)樣式。1.提取關(guān)鍵CSS并內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過(guò)JavaScript;3.使用media屬性?xún)?yōu)化加載如打印樣式;4.壓縮合并CSS減少請(qǐng)求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過(guò)度拆分與復(fù)雜腳本控制。

什么是AutoPrefixer,它如何工作? 什么是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個(gè)根據(jù)目標(biāo)瀏覽器范圍自動(dòng)為CSS屬性添加廠商前綴的工具。1.它解決了手動(dòng)維護(hù)前綴易出錯(cuò)的問(wèn)題;2.通過(guò)PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項(xiàng)有不手動(dòng)加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

什么是圓錐級(jí)函數(shù)? 什么是圓錐級(jí)函數(shù)? Jul 01, 2025 am 01:16 AM

theconic-Gradient()functionIncsscreatesCircularGradientsThatRotateColorStopSaroundAcentralPoint.1.IsidealForPieCharts,ProgressIndicators,colordichers,colorwheels和decorativeBackgrounds.2.itworksbysbysbysbydefindefingincolordefingincolorstopsatspecificains off.

CSS教程,用于創(chuàng)建粘性標(biāo)頭或頁(yè)腳 CSS教程,用于創(chuàng)建粘性標(biāo)頭或頁(yè)腳 Jul 02, 2025 am 01:04 AM

TocreatestickyheadersandfooterswithCSS,useposition:stickyforheaderswithtopvalueandz-index,ensuringparentcontainersdon’trestrictit.1.Forstickyheaders:setposition:sticky,top:0,z-index,andbackgroundcolor.2.Forstickyfooters,betteruseposition:fixedwithbot

CSS自定義屬性的范圍是什么? CSS自定義屬性的范圍是什么? Jun 25, 2025 am 12:16 AM

CSS自定義屬性的作用域取決于其聲明的上下文,全局變量通常定義在:root中,而局部變量則定義在特定選擇器內(nèi),以便組件化和隔離樣式。例如,定義在.card類(lèi)中的變量?jī)H對(duì)匹配該類(lèi)的元素及其子元素可用。最佳實(shí)踐包括:1.使用:root定義全局變量如主題色;2.在組件內(nèi)部定義局部變量以實(shí)現(xiàn)封裝;3.避免重復(fù)聲明同一變量;4.注意選擇器特異性可能引發(fā)的覆蓋問(wèn)題。此外,CSS變量區(qū)分大小寫(xiě),且應(yīng)在使用前定義以避免錯(cuò)誤。若變量未定義或引用失敗,則會(huì)采用回退值或默認(rèn)值initial。調(diào)試時(shí)可通過(guò)瀏覽器開(kāi)發(fā)者工

CSS教程專(zhuān)注于移動(dòng)優(yōu)先設(shè)計(jì) CSS教程專(zhuān)注于移動(dòng)優(yōu)先設(shè)計(jì) Jul 02, 2025 am 12:52 AM

Mobile-firstCSSdesignrequiressettingtheviewportmetatag,usingrelativeunits,stylingfromsmallscreensup,optimizingtypographyandtouchtargets.First,addtocontrolscaling.Second,use%,em,orreminsteadofpixelsforflexiblelayouts.Third,writebasestylesformobile,the

CSS教程,用于創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫(huà) CSS教程,用于創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫(huà) Jul 07, 2025 am 12:07 AM

創(chuàng)建CSS加載旋轉(zhuǎn)器的方法有三種:1.使用邊框的基本旋轉(zhuǎn)器,通過(guò)HTML和CSS實(shí)現(xiàn)簡(jiǎn)單動(dòng)畫(huà);2.使用多個(gè)點(diǎn)的自定義旋轉(zhuǎn)器,通過(guò)不同延遲時(shí)間實(shí)現(xiàn)跳動(dòng)效果;3.在按鈕中添加旋轉(zhuǎn)器,通過(guò)JavaScript切換類(lèi)來(lái)顯示加載狀態(tài)。每種方法都強(qiáng)調(diào)了設(shè)計(jì)細(xì)節(jié)如顏色、大小、可訪問(wèn)性和性能優(yōu)化的重要性,以提升用戶體驗(yàn)。

如何創(chuàng)建本質(zhì)上響應(yīng)的網(wǎng)格布局? 如何創(chuàng)建本質(zhì)上響應(yīng)的網(wǎng)格布局? Jul 02, 2025 am 01:19 AM

要?jiǎng)?chuàng)建內(nèi)在響應(yīng)式網(wǎng)格布局,核心方法是使用CSSGrid的repeat(auto-fit,minmax())模式;1.設(shè)置grid-template-columns:repeat(auto-fit,minmax(200px,1fr))讓瀏覽器自動(dòng)調(diào)整列數(shù)并限制每列最小和最大寬度;2.使用gap控制格子間距;3.容器應(yīng)設(shè)為相對(duì)單位如width:100%、配合box-sizing:border-box避免寬度計(jì)算錯(cuò)誤并用margin:auto居中;4.可選設(shè)置行高與內(nèi)容對(duì)齊方式提升視覺(jué)一致性,如row

See all articles