整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          16個超牛逼的HTML5和JavaScript特效

          用說, Flash的效果大家都清楚。實際上,HTML5和JavaScript擁有很多新屬性,可以用它們來替代Flash。W3Cschool精選16個超牛逼的HTML5和JavaScript特效,看了這些特效,未來的Web發展前途無量。

          1.特效:FlowerPower

          創作者使用花朵作為畫刷,以貝茲曲線方式繪圖。

          2.特效:Breathing Galaxies

          動態變換直徑及顏色,可通過鼠標或鍵盤產生新形狀,這個效果不錯!

          3.特效:Noise Field

          移動鼠標可改變粒子運動,點擊可隨機生成不同粒子效果。

          4.特效:HTML5 Canvas粒子效果文字動畫特效

          W3Cschool利用HTML5,制造出了粒子效果文字動畫特效。只要你輸入框中輸入想要展示的文字,回車后即可在canvas上繪制出粒子效果的文字動畫,相當酷的動畫效果。

          5.特效:Swirling Tentacles

          三維脈沖效果,沿著脈沖線有運動的顏色漸變模塊。

          6.特效:Keylight

          雙擊生成兩個以后的鍵即可發出聲音,移動鍵的位置可產生不同的聲音效果。W3Cschool上面有很多這樣的教程,有興趣可以去看一下!

          7.特效:Rotating Spiral

          旋轉的螺旋效果,單擊可以控制開始和停止旋轉,是不是覺得高大上?

          8.Blob

          拖動水滴有重力效果,雙擊可以分離,小水滴碰到大水滴會合并。

          9.Trail

          彩色顆粒跟隨鼠標運動效果,帶尾巴淡出效果。

          10.Graph Layout

          一種交互的力向圖布局效果,刷新三觀。

          11.Typographic Effects

          使用HTML5 Canvas實現的文本特性,效果超過Flash。

          12.Crazy Tentacles

          移動鼠標可以進行涂鴉,點擊鼠標可以清除畫布,看著確實瘋狂。

          13.Nebula

          吸引眼球的粒子系統,目的是測試WebGL性能,如果滑動鼠標,可以產生絢麗效果。

          14.WebGL Globe

          WebGL Globe 是一個開放的地理數據可視化平臺,我們鼓勵你復制代碼,添加自己的數據,創建自己的應用。

          15.Particle Playground

          用鼠標和粒子進行交互,能發現不一樣的精彩。

          16.Surface

          使用WebGL實現的水面特效實驗,可放入一張照片,使用鼠標觸動水面會有奇特效果。

          上面的HTML5和JavaScript特效,簡直趕超Flash。W3Cschool上面有很多用戶留言稱HTML5和JavaScriptit將替代Flash,不過對于這種說法,也不知道怎么去評判。畢竟這些用戶說的也是很有道理,你認為JavaScriptit會替代Flash嗎?很想知道你的答案!

          公眾號:w3c技術教程

          提供專業的web技術教程、手冊、工具。

          態調整web系統主題? 看這一篇就夠了

          一種構建靈活的系統頁面主題方案

          前置技術點

          閱讀此篇文章前,最好有下列知識

          1. css 基礎知識

          2. dart-sass 預處理器編程

          3. webpack 以及 postcss

          4. tailwindcss 含有 jitv2/v3

          前言

          我們在日常生活中,不論是訪問網站,手機App,還是小程序,時常會用到 切換主題 這個功能。它能夠為用戶提供一定的自定義顯示界面的能力,同時手機系統級別的主題也能夠更換,比如 light(明亮模式)dark(黑暗模式)

          那么如何讓我們編寫的應用,在改動不大的情況下,能夠快速的適配多個主題呢?

          這就需要設計一個方案了。

          方案設計

          方案參考

          這里我們以程序員們最熟悉的 Github 為例,它的主題切換是這樣做的:

          它在 根元素 那預設了幾套 css 變量值, 然后通過 js 去動態修改 html 根元素上的 data-color-modedata-dark-theme 這些屬性的值,從而讓不同的 css 選擇器選中這個根元素,并以此來動態的切換 :root 中的 css 變量的值。

          同時這些變量都被廣泛的使用在各種的 原子化的 class@apply 中,一旦變量一換,所有使用到這些class的控件和布局都收到影響,自然整個主題就改變了。

          1. 提煉css變量

          首先我們第一步要做的就是提煉css變量,這些主要由設計師提供。

          這里以顏色為例,主要包含 同個顏色的多態控件各個狀態的顏色提示警告錯誤字體中,標題,副標題,正文,提示的顏色 等等。當然像字體大小,陰影這類也是同樣的。

          這方面就不細說了,在提取到變量之后我們就可以開始進行命名工作:

          // constants.scss // 這是一個 scss 的 map數據結構,保存默認的初始值 $root-vars:(   --color-fg-default: #adbac7,   --color-fg-muted: #768390,   --color-fg-subtle: #545d68,   --color-fg-on-emphasis: #cdd9e5,   --color-scale-gray-0: #cdd9e5,   --color-scale-gray-1: #adbac7,   --color-scale-gray-2: #909dab,   --color-scale-gray-3: #768390,   // ... )

          可以注意到,在維護的變量中,顏色占了絕大部分,而且我們保存的都是顏色的hex格式,并沒有按照rgba的格式,把透明度(opacity)保存下來, 這是為什么? 答案會在后面揭曉。

          接著,維護完這個sass:map ,我們編寫一個工具類 util.scss 來把顏色變量轉化為字符串:

          // util.scss @use 'sass:color'; @use 'sass:meta'; @function getRgbString($color) {   @if (meta.type-of($color) == color) {     @return color.red($color) color.green($color) color.blue($color);   } @else {     @return $color;   } }

          然后在全局樣式 global.scss 中添加:

          // global.scss @use './constants.scss' as C; @use './util.scss' as Util; :root {   @each $var, $color in C.$root-vars {     #{$var}: Util.getRgbaString($color);   } }

          這樣我們的那些變量默認值字符串就添加進了 :root 根元素中:

          /* result */ :root{   --color-canvas-default-transparent: 34 39 46;   --color-marketing-icon-primary: 108 182 255;   --color-marketing-icon-secondary: 49 109 202;   --color-diff-blob-addition-num-text: 173 186 199;   --color-diff-blob-addition-fg: 173 186 199;   --color-diff-blob-addition-num-bg: 87 171 90;   --color-diff-blob-addition-line-bg: 70 149 74;   --color-diff-blob-addition-word-bg: 70 149 74;   --color-diff-blob-deletion-num-text: 173 186 199;   ... }

          這里注意全局變量中存儲的是字符串,并不是顏色變量本身。

          但是有了這些,沒有對應的 classscss 變量,我們還是很不好使用這些變量的,那么怎么進行工程化來提升我們的開發效率呢?接下來重點來了。

          2. scss 與 js通信,動態生成 scss 變量與原子化 class

          首先編寫 export.scss 用于暴露對象給 js 使用:

          // export.scss @use './constants.scss' as C; @use './util.scss' as Util; :export {   @each $var, $color in C.$root-vars {     #{$var}: Util.getRgbaString($color);   } }

          然后利用 webpack sass-loaderjsscss 的通信方法,就可以生成:

          • variables.scss (全局scss變量文件)

          • extendColors.cjs (tailwindcss colors 配置文件)

          // generator.js 生成器 import variables from '@/assets/scss/export.scss' // 簡易的去除前綴 removeColorPrefix(str) {   return str.substring(8) } // 此時的 variables 是一個 object // 那么scss全局變量的模板生成為: scssFilterShadow(str) {   return `rgb(var(${str}))` } // scss模板為 ${{ removeColorPrefix(k) }}:{{ scssFilterShadow(k) }}; // 此時 原子化的 `tailwindcss colors` 文件生成為: jsFilterShadow(str) {   return `withOpacityValue('${str}')` } // tailwindcss模板為 '{{ removeColorPrefix(k) }}':{{ jsFilterShadow(k) }},

          通過這種方式,我們把生成的結果寫入 variables.scssextendColors.cjs 文件內,從而便捷把第一步中維護的如此之多的 css變量,全部快速方便的轉化為同等的 scss變量tailwindcss 配置

          3. 全局scss文件變量注入

          生成 variables.scss后,我們可以配置一下 sass-loader 來讓其中的變量無需顯式引入,即可在全局生效:

          // sass-loader {   additionalData: '@use "@/assets/scss/variables.scss"  *;', }

          這樣我們就可以在任意的 vue <style>, 或者 .scss 文件內使用到所有 variables.scss 中聲明的變量了。

          4. 原子化的 class 生成

          生成 extendColors.cjs 后,我們在里面添加:

          function withOpacityValue(variable) {   return ({ opacityValue }) => {     if (opacityValue === undefined) {       return `rgb(var(${variable}))`     }     return `rgb(var(${variable}) / ${opacityValue})`   } }

          這是為了結合 jit引擎,來動態的調整所有顏色的透明度。有了它,我們就能編寫出以下的代碼:

          h1{   @apply text-header-text;    // 等價于   // color: rgb(var(--color-header-text)) } h2{   @apply text-header-text/70;   // 等價于   // color: rgb(var(--color-header-text) / 0.7) }

          這也是我們要給根元素中的 css變量 賦值為 R G B 格式的原因了!

          本質上講,是我們在利用原生 cssrgb(rgbargb的別名) 構造方法來創建顏色變量:

          /* rgb的函數Syntax */ rgb(255,255,255) /* white */ rgb(255,255,255,.5) /* white with 50% opacity */ rgb(255 255 255) /* CSS Colors 4 space-separated values */ rgb(255 255 255 / .5); /* white with 50% opacity, using CSS Colors 4 space-separated values */

          從上面這段代碼片段中,我們可以看到,列出的 rgb(R G B / A)就是現在使用的方案。

          當然我們也可以更改上述的 getRgbStringwithOpacityValue 這2個方法,把 , 這個分隔符加入進去,再把 / 去除,從而使用它 rgb(R,G,B,A) 這個構造方式。

          這樣我們在使用時就可以生成出這樣的樣式:

          .neutral{   background-color: rgb(var(--color-neutral-muted));   &:hover{     background-color: rgb(var(--color-neutral-muted) / 0.4);   } }

          是不是非常的靈活?

          接下來只要把 extendColors.cjs 導入進 tailwind.config.js 配置中,就可以自動生成 classvscode 的智能提示了:

          // tailwind.config.js const extendColors = require('./client/theme/extendColors.cjs') const colors = require('tailwindcss/colors') module.exports = {   // ...   theme:{     extend:{       colors:{         ...extendColors.colors,       }       //...     },     colors:{       transparent: 'transparent',       current: 'currentColor',       black: colors.black,       white: colors.white,       gray: colors.gray,     },     // ...   }   // ...  }

          這樣,我們只需要把主題變更依賴的變量們,寫進各種控件,layout,容器中去,所有的 css 變量就生效了,切換主題就非常的方便。

          5. 動態修改根節點變量

          很多場景下我們的應用主題,不是從前端維護的幾套預設方案中進行選擇,而是由用戶自定義配置,保存在數據庫中,每次請求后端才能獲取到。

          這種獲取方式意味著前端這里,只保留一套默認的預設方案。所以我們通常會在獲取到后端給的主題數據后,動態的修改 css變量 的值。

          具體怎么做呢?本質上就是調用 CSSStyleDeclaration.setProperty(),來設置 document.documentElement 的變量值。

          為了讓它更好用,我們可以進行封裝,并建立一套瀏覽器本地的緩存機制,這些在此不再敘述,條條大道通羅馬。

          兼容性

          注意此方案是放棄 IE 的! (都上 tailwindcss 了),其余瀏覽器兼容良好。

          總結

          這種方式,實際上利用了很多的 css, sass, webpack,tailwindcss 的特性,筆者回過頭來看,發現這個方案在實現后,好用是非常好用的。

          變量,原子化class, 公共提取和智能提示一應俱全,就是要對上面一些技術點有比較充分的理解。

          如果您對此篇文章有建議或者更好的方案,也歡迎聯系筆者一起探討。

          筆者的聯系方式

          附錄

          源碼

          文來自 Advanced CSS Theming with Custom Properties and Javascript - (https://www.sitepoint.com/css-theming-custom-properties-javascript/)

          在關于CSS主題的本教程中,我們將使用CSS自定義屬性(也稱為CSS變量)來為簡單的HTML頁面實現動態主題。 我們將創建暗色和亮色的示例主題,然后編寫JavaScript在用戶點擊按鈕時在這兩者之間切換。

          就像在典型的編程語言中一樣,變量用于存儲值。 在CSS中,它們通常用于存儲顏色、字體名稱、字體大小、長度單位等。它們可以在樣式表中的多個位置重復使用。 大多數開發者都稱呼為“CSS變量”,但官方名稱是“自定義屬性”。

          CSS自定義屬性可以修改在整個樣式表中引用的變量。 以前,只有使用Sass等CSS預處理器才能實現這一點。

          理解 :root 和 var()

          在創建動態主題示例之前,讓我們先來了解一下自定義屬性的基礎知識。

          自定義屬性是一個名稱以兩個連字符( - )開頭的屬性,如--foo。 它們定義了可以使用var()來引用的變量。 讓我們看看下面的例子:

          在 :root 選擇器中定義自定義屬性意味著它們可以在全局文檔空間中應用于所有元素。 :root 是一個CSS偽類,它匹配文檔的根元素 - <html>元素。 它類似于html選擇器,但具有更高的特異性。

          你可以在文檔中的任何位置訪問 :root 自定義屬性的值:

          你也可以預設一個備用值,例如

          如果自定義屬性沒有定義的話,備用值將被使用。

          在除了:root或html選擇器之外的CSS選擇器內定義定義屬性可以使變量用于匹配元素及其子元素。

          CSS自定義屬性 VS 預處理器變量

          諸如Sass之類的CSS預處理器通常用于輔助前端Web開發。 預處理器的有用功能中就包括了變量。 但是Sass變量和CSS自定義屬性之間有什么區別呢?

          • CSS自定義屬性在現代瀏覽器中能原生地被解析。 預處理器變量則需要編譯進標準CSS文件里,并且所有變量都將轉換為值。
          • 自定義屬性能被JavaScript訪問和修改。 預處理器變量編譯一次之后,只有它們的最終值在客戶端上使用。

          寫一個簡單的HTML頁面

          讓我們開始給項目新建一個文件夾:

          接著,在文件夾中新建一個index.html:

          然后寫入以下代碼:

          我們添加了一個使用<nav>標簽的導航欄,一個頁腳和一個用<div>包裹著的按鈕(用于在明暗主題之間切換)還有一些虛擬的Lorem Ipsum文本。

          給HTML頁面添加基本的CSS樣式

          現在讓我們來寫樣式。在同一個文件的<head>里創建<style>標簽并添加以下代碼:

          CSS3的HSL(色調,飽和度,亮度)表示法用于定義顏色。 色調是色環上的角度,示例所使用的350表示紅色。 通過更改飽和度(顏色百分比)和亮度(百分比),所有頁面的顏色都會出現不同的變化。

          使用HSL能讓我們只需更改色調值,即可輕松嘗試主題的不同主色調。 我們還可以使用CSS變量作為色調值,并通過更改樣式表中的單個值或使用JavaScript來切換顏色主題。

          以下是這個頁面的截圖:

          讓我們使用CSS變量來保存頁面中所有顏色的色調值。 在<style>標簽的頂部添加一個:root選擇器來添加一個全局CSS變量:

          接下來,我們用-main-hue變量來替換掉所有hsl()中寫死的350值。 例如,這是導航選擇器:

          現在,如果你要指定除紅色以外的任何顏色,則只需將相應的值賦給--main-hue即可。 這是一些例子:

          我們定義了紅、藍、綠3種自定義屬性,然后把--red-hue賦值給--main-hue。

          以下是3種不同--main-hue值的頁面截圖:

          CSS的自定義屬性提供了這幾個好處:

          • 可以在單獨一個地方定義值。
          • 可以適當地命名該值有助于將來維護。
          • 可以使用JavaScript動態更改該值。 例如, - main-hue可以被設置為0到360之間的任何值。

          使用JavaScript從一組預定義值或用戶提交的hue值(它應該在0到360之間)中來動態設置--main-hue的值,我們可以為用戶提供許多彩色的主題。

          例如以下的代碼可以將--main-hue的值設置為240(藍色):

          添加一個CSS暗色主題

          現在,讓我們來為這個頁面提供一個暗色的主題。 為了更好地控制不同實體的顏色,我們需要添加更多的變量。

          通過頁面的樣式,我們可以在:root中定義相應顏色的自定義屬性后,用變量替換不同選擇器中的所有HSL顏色:

          使用適當的自定義屬性名稱。 例如, - nav-bg-color是指導航背景的顏色,而--nav-text-color是指導航前景/文本的顏色。

          現在復制粘貼:root選擇器及其內容,然后添加一個暗色的主題屬性:

          如果將具有暗色值的主題屬性添加到<html>元素,此主題就會被激活。

          我們現在可以手動地通過降低HSL顏色的亮度值來提供暗色主題,或者我們也可以使用其他技巧,例如invert( )和brightness( )等這些常用的CSS濾鏡來調整圖像的渲染,也可以與其他任何元素一起使用。

          將以下代碼添加到:root [theme ='dark']:

          invert( )濾鏡會反轉所選元素中的所有顏色(在例子中為每個元素)。 可以使用百分比或數字來指定反轉值。 值為100%或1時將完全反轉元素的色調、飽和度和亮度值。

          brightness( )濾鏡會使元素更亮或更暗。 值為0時會出現完全黑暗的元素。

          invert( )濾鏡會使一些元素非常明亮。 可以通過設置brightness(0.6)來調低亮度。

          不同暗度的暗色主題截圖:

          使用JavaScript來切換主題

          現在,當用戶點擊Dark / Light按鈕時,我們來使用JavaScript在暗色和亮色主題之間切換。 在index.html中,在<body>標簽的底部添加<script>內聯腳本,然后加入以下代碼:

          Document.documentElement指向文檔的根DOM元素 - 即<html>。 此代碼使用.hasAttribute( )方法檢查主題屬性是否存在,如果該屬性不存在則添加暗色值,然后就會切換到黑暗主題。 否則,它會刪除該屬性,從而切換到亮色主題。

          使用JavaScript來改變CSS自定義屬性

          通過使用JavaScript,我們可以訪問自定義屬性并動態更改其值。 在我們的示例中,我們將亮度值寫死了,但它可以被動態更改。 首先,在HTML中dart/light按鈕的旁邊添加滑塊:

          滑塊的初始值為1,允許用戶調到最低0.3。

          接下來,在:root[theme='dark']中添加一個暗度的自定義屬性,初始值為1:

          在brightness濾鏡中用此自定義屬性替換掉原先的固定值:

          最后,添加以下JavaScript代碼控制滑塊的值來動態地改變--theme-darkness的值:

          我們監聽滑塊的事件變化,并使用setProperty( )方法相應地設置--theme-darkness的值。

          我們還可以將brightness濾鏡應用于亮色主題。 在:root選擇器添加--theme-darkness自定義屬性:

          然后在同一個選擇器內添加brightness濾鏡:

          以下是暗色主題最終結果的截圖:

          還有亮色主題最終結果的截圖:

          結語

          在本教程中,我們已經了解了如何使用CSS自定義屬性來創建主題并在它們之間動態切換。 我們使用了HSL配色方案,它允許我們指定具有色調、飽和度和亮度值的顏色以及CSS濾鏡(invert和brightness)以創建亮色主題的暗色版本。


          主站蜘蛛池模板: 在线视频亚洲一区| 国产一区二区三区免费| 中文字幕人妻AV一区二区| 亚洲熟妇av一区二区三区| 国产亚洲综合精品一区二区三区| 亚洲AV日韩综合一区| 97久久精品无码一区二区天美| 亚洲av日韩综合一区在线观看| 爆乳熟妇一区二区三区| 国模精品一区二区三区| 中文字幕精品一区| 久久久一区二区三区| 亚洲日韩一区二区一无码| 精品国产免费观看一区 | 少妇特黄A一区二区三区| 91久久精品午夜一区二区| 精品国产一区二区三区| 精品视频在线观看一区二区三区| 国产福利一区二区在线视频| 久久国产精品亚洲一区二区| 亚洲AV噜噜一区二区三区| 人妻内射一区二区在线视频| 亚洲视频在线一区| 国产熟女一区二区三区五月婷| 精品人妻少妇一区二区三区| 亚洲av无码一区二区三区天堂古代 | 国产精品亚洲一区二区麻豆 | 国产怡春院无码一区二区| 国产精品福利区一区二区三区四区| 国产精品日本一区二区在线播放| 毛片一区二区三区| 国产成人AV一区二区三区无码| 少妇一夜三次一区二区| 国产精品视频一区二区三区无码| 日本一区中文字幕日本一二三区视频| 中文字幕在线一区| 精品视频一区在线观看| 日韩美一区二区三区| 97久久精品无码一区二区| 亚洲福利视频一区| 国产高清视频一区三区|