Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 久久久久久免费视频,人人澡人人射,精品国产电影在线观看

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          你不知道的CSS濾鏡

          前言

          在日常開發(fā)中,對(duì)于圖像不同效果的處理,通常需要設(shè)計(jì)側(cè)的專業(yè)知識(shí)和技能,同時(shí)開發(fā)側(cè)也需要增加額外的圖片資源的請(qǐng)求。為了避免引入多個(gè)圖片資源且和增加一些額外的配置項(xiàng)去實(shí)現(xiàn)不同效果的處理,我們可以使用CSS的濾鏡屬性直接對(duì)元素進(jìn)行效果處理,而不需要對(duì)每個(gè)元素的不同效果引入相關(guān)的圖片文件,從而能提高更大的靈活性和可維護(hù)性。



          2 背景

          在開發(fā)過程中我們總會(huì)碰到這樣的場(chǎng)景:符合條件時(shí)按鈕或圖片高亮展示,不符合條件時(shí)按鈕或圖片置灰展示。

          我們可能很自然地就去想這無非就是用兩種樣式:高亮的和非高亮的樣式,兩種樣式對(duì)應(yīng)的按鈕顏色或者圖片路徑不同。那么要是每個(gè)按鈕或圖片都不一樣,我們就需要對(duì)每一個(gè)高亮的場(chǎng)景都去做一個(gè)灰色場(chǎng)景的處理,即便是走配置化的數(shù)據(jù),那么我們也都需要配置兩份數(shù)據(jù)去做展示,這樣不僅配置麻煩且工作效率較低。

          如果我們只想要配置一套數(shù)據(jù)的話,其實(shí)可以使用filter濾鏡去進(jìn)行實(shí)現(xiàn),我們可以利用其grayscale屬性,將配置好高亮圖片轉(zhuǎn)換為灰度圖像進(jìn)行實(shí)現(xiàn),參考效果如下圖所示。

          圖1 獎(jiǎng)勵(lì)領(lǐng)取置灰效果圖

          filter濾鏡就是css3新增的一個(gè)神奇功能,它可以對(duì)網(wǎng)頁中的圖片進(jìn)行類似Photoshop圖片處理的效果,但并不需要依賴于任何作圖軟件。同時(shí),filter濾鏡不僅可以對(duì)圖片添加濾鏡效果,還可以對(duì)網(wǎng)頁元素甚至視頻進(jìn)行濾鏡處理。



          3 基本概念

          filter屬性通過調(diào)整濾鏡函數(shù)的參數(shù),可以改變?cè)氐念伾⑼该鞫?、亮度、?duì)比度等視覺特性。

          • 作用對(duì)象:使用該屬性的元素本身。
          • 使用方式:filter函數(shù) <filter-function> 或使用url添加的svg濾鏡。
          filter: <filter-function> [<filter-function>]* | none
          filter: url(file.svg#filter-element-id)


          3.1 基礎(chǔ)函數(shù)

          3.1.1 blur

          blur(radius)函數(shù)將高斯模糊應(yīng)用到圖像。radius 定義了高斯函數(shù)的標(biāo)準(zhǔn)偏差值,或者屏幕上有多少像素相互融合,值越大模糊程度越高。若未設(shè)置值,默認(rèn)為 0。

          圖2 blur濾鏡效果對(duì)比圖


          3.1.2 brightness

          brightness(amount)函數(shù)讓圖像更明亮或更暗淡。值為 0% 將創(chuàng)建全黑圖像,值為 100% 會(huì)使輸入保持不變,值大于 100% 提供更明亮的結(jié)果。若未設(shè)置值,默認(rèn)為 1。

          圖3 brightness濾鏡效果對(duì)比圖

          3.1.3 contrast

          contrast(amount)函數(shù)可調(diào)整輸入圖像的對(duì)比度。值是 0% 圖像會(huì)全黑,值為100% 圖像不變,值可以超過 100%,意味著會(huì)運(yùn)用更低的對(duì)比。若未設(shè)置值,默認(rèn)是 1。

          圖4 contrast濾鏡效果對(duì)比圖


          3.1.4 drop-shadow

          drop-shadow(offset-x offset-y blur-radius color) 可在圖像后方應(yīng)用投影。陰影可以設(shè)置模糊度,以特定顏色畫出的遮罩圖的偏移版本,最終合成在圖像下面。

          圖5 drop-shadow濾鏡效果對(duì)比圖


          3.1.5 grayscale

          grayscale(amount)函數(shù)可將圖像轉(zhuǎn)為灰度圖。amount的值定義了轉(zhuǎn)換的比例,值在 0% 到 100% 之間,值為 0% 圖像無變化,值為 100%則完全轉(zhuǎn)為灰度圖像。若未設(shè)置值,默認(rèn)是 0。

          圖6 grayscale濾鏡效果對(duì)比圖


          3.1.6 hue-rotate

          hue-rotate(angle)函數(shù)可在圖像應(yīng)用色相旋轉(zhuǎn),angle的值設(shè)定圖像會(huì)被調(diào)整的色環(huán)角度值。值為 0deg,則圖像無變化,超過 360deg相當(dāng)于又繞一圈。若未設(shè)置值,默認(rèn)為 0deg。

          圖7 hue-rotate濾鏡效果對(duì)比圖


          3.1.7 invert

          invert(amount)函數(shù)可反轉(zhuǎn)圖像顏色。amount的值定義轉(zhuǎn)換的比例,值在 0% 和 100% 之間,值為 0% 則圖像無變化,值為 100% 則圖像完全反轉(zhuǎn)。若未設(shè)置值,則默認(rèn)為 0。

          圖8 invert濾鏡效果對(duì)比圖


          3.1.8 opacity

          opacity(amount) 函數(shù)可改變圖像透明度。amount的值定義轉(zhuǎn)換的比例,值在 0% 和 100% 之間,值為 0% 則是完全透明,值為 100% 則圖像無變化。若未設(shè)置值,則默認(rèn)為 1。該函數(shù)與css的opacity 屬性很相似,不同之處在于通過 filter,一些瀏覽器為了提升性能會(huì)提供硬件加速。

          圖9 opacity濾鏡效果對(duì)比圖


          3.1.9 saturate

          saturate(amount)函數(shù)可轉(zhuǎn)換圖像飽和度。amount的值定義轉(zhuǎn)換的比例,值為 0% 則是完全不飽和,值為 100% 則圖像無變化,超過 100% 則有更高的飽和度。若未設(shè)置值,則默認(rèn)為 1。

          圖10 saturate濾鏡效果對(duì)比圖


          3.1.10 sepia

          sepia(amount) 函數(shù)可將圖像轉(zhuǎn)換為深褐色。amount的值定義轉(zhuǎn)換的比例,值在 0% 到 100% 之間,值為 0% 圖像無變化,值為 100% 則完全是深褐色的。若未設(shè)置值,則默認(rèn)為 0。

          圖11 sepia濾鏡效果對(duì)比圖


          3.2 復(fù)合函數(shù)

          從filter函數(shù)的使用方式可以看出,濾鏡效果是可以進(jìn)行疊加的,比如,filter: contrast(50%) brightness(50%)。

          圖12 組合濾鏡效果圖

          那么同一元素上定義多個(gè)濾鏡的話,濾鏡的先后順序?qū)ψ詈笮Ч杏绊憜??我們調(diào)換濾鏡順序換成filter: brightness(50%) contrast(50%)來看看。

          圖13 組合濾鏡順序變換效果圖

          由上圖可以看出,濾鏡的先后順序不同產(chǎn)生的效果也是不一樣的。原因在于濾鏡順序不同,濾鏡的色值處理算法對(duì)圖片處理的先后順序也就不一樣,最終產(chǎn)生的效果就不一樣。

          其實(shí)CSS濾鏡不僅可以組合使用實(shí)現(xiàn)很多視覺效果,也可以通過結(jié)合不同的濾鏡效果和CSS動(dòng)畫,去實(shí)現(xiàn)一些奇妙的動(dòng)畫效果。



          4 動(dòng)畫效果

          4.1 文字融合動(dòng)畫

          文字融合動(dòng)畫就是一種文字從融合到分開的效果,我們可以通過改變letter-spacing和blur的值去進(jìn)行效果實(shí)現(xiàn)。

            <div class="container">
              <div class="text">Hello World</div>
            </div>
          .container {
            width: 100vw;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            background-color: #000;
            filter: contrast(30);
          }
          
          
          .text {
            color: #fff;
            font-size: 100px;
            animation: show 3s linear forwards;
          }
          
          
          @keyframes show {
            0% {
              opacity: 0;
              letter-spacing: -50px;
              filter: blur(10px);
            }
          
          
            25% {
              opacity: 1;
              filter: blur(8px);
            }
          
          
            50% {
              filter: blur(5px);
            }
          
          
            100% {
              letter-spacing: 10px;
              filter: blur(2px);
            }
          }


          ,時(shí)長(zhǎng)00:03


          4.2 手機(jī)充電動(dòng)畫

          該動(dòng)畫其實(shí)就是一種模擬安卓手機(jī)充電時(shí)的動(dòng)畫效果,主要就是通過contrast濾鏡以及blur濾鏡去實(shí)現(xiàn)很好的融合效果。

          <div class="g-container">
            <div class="g-number">90%</div>
            <div class="g-contrast">
              <div class="g-circle"></div>
              <ul class="g-bubbles">
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
              </ul>
            </div>
          </div>
          .g-container {
            position: relative;
            width: 300px;
            height: 400px;
            margin: auto;
          }
          
          
          .g-number {
            position: absolute;
            top: 100px;
            width: 100%;
            color: #fff;
            font-size: 30px;
            text-align: center;
            z-index: 10;
          }
          
          
          .g-contrast {
            width: 100%;
            height: 100%;
            background-color: #000;
            overflow: hidden;
            filter: contrast(10) hue-rotate(0);
            animation: hueRotate 10s infinite linear;
          }
          
          
          .g-circle {
            position: relative;
            width: 300px;
            height: 300px;
            box-sizing: border-box;
            filter: blur(8px);
          }
          
          
          .g-circle::after {
            content: "";
            position: absolute;
            top: 40%;
            left: 50%;
            transform: translate(-50%, -50%) rotate(0);
            width: 200px;
            height: 200px;
            background-color: #00ff6f;
            border-radius: 42% 38% 62% 49%/45%;
            animation: rotate 10s infinite linear;
          }
          
          
          .g-circle::before {
            content: "";
            position: absolute;
            width: 176px;
            height: 176px;
            top: 40%;
            left: 50%;
            transform: translate(-50%, -50%);
            border-radius: 50%;
            background-color: #000;
            z-index: 10;
          }
          
          
          .g-bubbles {
            position: absolute;
            left: 50%;
            bottom: 0;
            width: 100px;
            height: 40px;
            transform: translate(-50%, 0);
            border-radius: 100px 100px 0 0;
            background-color: #00ff6f;
            filter: blur(5px);
          }
          
          
          li {
            position: absolute;
            border-radius: 50%;
            background: #00ff6f;
          }
          
          
          li:nth-child(0) {
            left: 50px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 16px;
            height: 16px;
            animation: move 4s ease-in-out -1.47s infinite;
          }
          
          
          li:nth-child(1) {
            left: 55px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 18px;
            height: 18px;
            animation: move 6s ease-in-out -2.23s infinite;
          }
          
          
          li:nth-child(2) {
            left: 60px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 20px;
            height: 20px;
            animation: move 5s ease-in-out -3.89s infinite;
          }
          
          
          li:nth-child(3) {
            left: 65px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 22px;
            height: 22px;
            animation: move 7s ease-in-out -4.56s infinite;
          }
          
          
          li:nth-child(4) {
            left: 70px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 24px;
            height: 24px;
            animation: move 9s ease-in-out -2.12s infinite;
          }
          
          
          li:nth-child(5) {
            left: 75px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 26px;
            height: 26px;
            animation: move 9s ease-in-out -1.98s infinite;
          }
          
          
          li:nth-child(6) {
            left: 80px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 23px;
            height: 23px;
            animation: move 5s ease-in-out -3.35s infinite;
          }
          
          
          li:nth-child(7) {
            left: 63px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 19px;
            height: 19px;
            animation: move 7s ease-in-out -4.34s infinite;
          }
          
          
          li:nth-child(8) {
            left: 67px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 25px;
            height: 25px;
            animation: move 6s ease-in-out -2.87s infinite;
          }
          
          
          li:nth-child(9) {
            left: 73px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 28px;
            height: 28px;
            animation: move 8s ease-in-out -3.45s infinite;
          }
          
          
          li:nth-child(10) {
            left: 56px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 24px;
            height: 24px;
            animation: move 7s ease-in-out -1.83s infinite;
          }
          
          
          li:nth-child(11) {
            left: 45px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 25px;
            height: 25px;
            animation: move 5s ease-in-out -2.67s infinite;
          }
          
          
          li:nth-child(12) {
            left: 68px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 19px;
            height: 19px;
            animation: move 6s ease-in-out -3.12s infinite;
          }
          
          
          li:nth-child(13) {
            left: 54px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 29px;
            height: 29px;
            animation: move 9s ease-in-out -2.22s infinite;
          }
          
          
          li:nth-child(14) {
            left: 41px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 27px;
            height: 27px;
            animation: move 5s ease-in-out -1.11s infinite;
          }
          
          
          li:nth-child(15) {
            left: 51px;
            top: 50%;
            transform: translate(-50%, -50%);
            width: 24px;
            height: 24px;
            animation: move 7s ease-in-out -3.23s infinite;
          }
          
          
          @keyframes rotate {
            50% {
              border-radius: 45%/42% 38% 58% 49%;
            }
          
          
            100% {
              transform: translate(-50%, -50%) rotate(720deg);
            }
          }
          
          
          @keyframes move {
            90% {
              opacity: 1;
            }
          
          
            100% {
              opacity: 0.1;
              transform: translate(-50%, -180px);
            }
          }
          
          
          @keyframes hueRotate {
            100% {
              filter: contrast(15) hue-rotate(360deg);
            }
          }

          圖14 手機(jī)充電動(dòng)畫效果圖



          4.3 電影謝幕動(dòng)畫

          電影謝幕動(dòng)畫其實(shí)就是圖片逐漸消失而謝幕文案逐漸模糊顯示的效果,我們可以使用filter屬性中的blur和brightness濾鏡來模擬該效果的實(shí)現(xiàn)。

          <div class="main">
            <div class="img"></div>
            <div class="text">Thank you for watching!</div>
          </div>
          .main {
            width: 100vw;
            height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background-color: #000;
          }
          
          
          .img {
            position: absolute;
            top: 0;
            left: 0;
            height: 100%;
            width: 100%;
            background: url("xxx.png");
            background-size: cover;
            animation: imgHide 3s linear forwards;
          }
          
          
          .text {
            color: #fff;
            font-size: 50px;
            opacity: 0;
            animation: textShow 2s linear forwards;
          }
          
          
          @keyframes imgHide {
            0% {
              filter: brightness(1);
            }
            100% {
              filter: brightness(0);
            }
          }
          @keyframes textShow {
            0% {
              opacity: 0;
              filter: blur(8px) brightness(50%);
            }
            100% {
              opacity: 1;
              filter: blur(0) brightness(100%);
            }
          }


          ,時(shí)長(zhǎng)00:03


          4.4. 彩虹文字動(dòng)畫

          彩虹文字動(dòng)畫其實(shí)就是一種動(dòng)態(tài)變化文字顏色的效果。該動(dòng)畫效果的實(shí)現(xiàn)就是通過動(dòng)態(tài)地改變hue-rotate的值,使文字顏色在一定范圍內(nèi)進(jìn)行循環(huán)變化產(chǎn)生動(dòng)態(tài)顏色。

           <div>MAINTO MEMBER CENTER</div>
          div {
            font-size: 80px;
            background-clip: text;
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-image: linear-gradient(to right, red, orange, yellow, green, cyan, blue, purple);
            animation: huerotate 6s linear infinite;
          }
          
          
          @keyframes huerotate {
            from { filter: hue-rotate(0deg); }
            to { filter: hue-rotate(360deg); }
          }

          效果圖片如下所示:

          圖15 彩虹文字動(dòng)畫效果圖

          同樣我們也可以通過這種方式去實(shí)現(xiàn)一種動(dòng)態(tài)背景顏色變換的效果。

          div {
              background: linear-gradient(45deg, #5fddcc, #ff004d);
              animation: hueRotate 10s infinite alternate;
          }
          
          
          @keyframes hueRotate {
              0 {
                  filter: hue-rotate(0);
              }
              100% {
                  filter: hue-rotate(360deg);
              }
          }


          圖16 動(dòng)態(tài)背景顏色變換效果圖

          這些通過CSS動(dòng)畫或JavaScript控制去實(shí)時(shí)改變?cè)厣系臑V鏡效果,從而在頁面上產(chǎn)生動(dòng)態(tài)變化的視覺效果又叫做動(dòng)態(tài)濾鏡效果,那與之相對(duì)應(yīng)的不會(huì)發(fā)生改變或動(dòng)態(tài)變化自然就是靜態(tài)濾鏡效果。靜態(tài)濾鏡效果在開發(fā)中經(jīng)常被使用,下面我們就來聊聊在日常營銷業(yè)務(wù)中的一些常見的靜態(tài)濾鏡的使用場(chǎng)景。



          5 業(yè)務(wù)場(chǎng)景

          5.1 網(wǎng)頁置灰效果

          基于一些特殊時(shí)期或者特定重大事件的背景下,我們需要把網(wǎng)站頁面變成黑白色或灰色,以表尊敬和紀(jì)念。實(shí)現(xiàn)網(wǎng)頁的置灰效果并不需要將所有的圖片和文字都手動(dòng)換成灰色,這種方法十分繁瑣且不現(xiàn)實(shí)。它的實(shí)現(xiàn)主要是通過filter的grayscale屬性,由于濾鏡filter會(huì)直接影響所有的后代元素,所以只需要給html添加一個(gè)統(tǒng)一的灰色濾鏡就可以。

          html {
            filter: grayscale(.95);
          }

          圖17 網(wǎng)頁置灰效果圖


          5.2 集卡明暗效果

          我們?cè)诩ɑ顒?dòng)中經(jīng)常會(huì)看到,未點(diǎn)亮的卡片是暗色顯示,只有獲得了此卡才會(huì)高亮顯示。這種明暗效果的實(shí)現(xiàn)并不用區(qū)分點(diǎn)亮和未點(diǎn)亮的卡片進(jìn)行顯示,這其實(shí)就可以使用filter的brightness屬性進(jìn)行實(shí)現(xiàn),默認(rèn)情況下降低亮度,只有點(diǎn)亮了的卡片才恢復(fù)亮度。

          .unactive {
            filter:  brightness(0.5);
          }
           .active {
            filter: brightness(1);
          }

          圖18 集卡明暗效果圖


          5.3 圖像陰影效果

          大多數(shù)情況下設(shè)計(jì)提供給我們的圖片都是直接使用,如果需要加上陰影的話會(huì)默認(rèn)在圖片上進(jìn)行處理。那么如果是配置化的圖片需要統(tǒng)一加上陰影效果呢,開發(fā)側(cè)能不能進(jìn)行統(tǒng)一處理?能的話又要怎么處理呢?

          打個(gè)比方我們需要給下面的卡券圖片再加個(gè)陰影效果:

          圖19 卡券圖片

          設(shè)置陰影的方式我們腦子里肯定首先就會(huì)想到box-shadow屬性,我們先來看看它的的使用方式。

          box-shadow: offset-x offset-y  blur spread color inset;

          從box-shadow接受的參數(shù)可以看出,drop-shadow可接受的參數(shù)和box-shadow屬性基本是一樣的,但不包含擴(kuò)張半徑spread和inset內(nèi)陰影等關(guān)鍵字。那他們實(shí)現(xiàn)的陰影效果是不是一樣的呢?我們先用box-shadow來實(shí)現(xiàn)看看。

          box-shadow: 2px 4px 3px rgba(50, 50, 0, 0.5);


          圖20 卡券圖片box-shadow效果圖

          如上圖陰影是加了,但是好像哪里不太對(duì),為什么直接給圖片外圍增加了一個(gè)陰影,并沒有在卡券本身添加陰影呢?

          這是因?yàn)樵诮o透明圖片添加陰影效果時(shí)無法穿透元素,只能添加到透明圖片元素的盒模型上,所以最終呈現(xiàn)效果如上圖所示。下面我們來使用filter的drop-shadow屬性看看。

          filter: drop-shadow(2px 4px 3px rgba(50, 50, 0, 0.5));

          圖21 卡券圖片drop-shadow效果圖

          如上圖才是我們期望的效果,陰影效果只作用到卡券本身,這說明drop-shadow的陰影效果是可以穿透透明元素的。除此之外,通過濾鏡一些瀏覽器為了更好的性能會(huì)提供硬件加速。但是在使用drop-shadow的投影時(shí),需要注意的是任何非透明的部分都會(huì)被打上投影,包括文本(如果背景是透明的)。

          圖22 drop-shadow效果對(duì)比圖


          5.4 毛玻璃效果

          毛玻璃效果是一種常見的視覺效果,它模擬了玻璃表面上由于光線折射而產(chǎn)生的模糊和透明感。我們經(jīng)常需要使用毛玻璃效果處理內(nèi)容模糊,以此達(dá)到一個(gè)信息保護(hù)的效果,或者進(jìn)行背景模糊突出主要內(nèi)容,引導(dǎo)用戶進(jìn)行操作,在日常開發(fā)中其實(shí)就是使用了filter的blur屬性進(jìn)行實(shí)現(xiàn)的。比如說我們需要給一些產(chǎn)品卡片設(shè)置毛玻璃效果:

          圖23 毛玻璃效果范圍超出對(duì)比圖

          使用filter添加模糊后,實(shí)際看到的大小會(huì)超出我們?cè)O(shè)置的寬高,這是由于周圍的毛邊效果產(chǎn)生的,我們可以通過外層設(shè)置 overflow: hidden進(jìn)行處理。不過其實(shí)使用filter實(shí)現(xiàn)的毛玻璃效果并不是唯一且最好的方式,我們也可以用backdrop-filter屬性去實(shí)現(xiàn)漂亮的毛玻璃效果,我們來看看他們的實(shí)現(xiàn)效果有什么區(qū)別。

          圖24 毛玻璃效果對(duì)比圖

          從上圖可以看出,filter明顯是對(duì)圖片本身進(jìn)行了一個(gè)模糊處理,而dropback-filter卻像是有一個(gè)模糊的遮罩層在上面,我們來看看具體的元素結(jié)構(gòu)。

          圖25 毛玻璃效果元素結(jié)構(gòu)對(duì)比圖

          由元素結(jié)構(gòu)可以看出,使用backdrop-filter的效果確實(shí)比使用filter的效果多了一層置于圖片上層的元素,blur效果也并不是作用于圖片本身,而是作用于圖片的上層元素。

          沒錯(cuò),backdrop-filter并不是通過處理圖片本身來實(shí)現(xiàn)毛玻璃的效果,而是通過在圖片上面蓋上一個(gè)模糊層從而達(dá)到毛玻璃的效果,因此要做模糊處理的圖片必須置于使用backdrop-filter元素的下面。

          那么這個(gè)backdrop-filter又是什么呢,與filter又有什么關(guān)系或者有區(qū)別呢?



          6. backdrop-filter

          backdrop-filter可以給元素后面區(qū)域添加圖形效果(如模糊或顏色偏移),而filter屬性是將模糊或顏色偏移等圖形效果應(yīng)用于元素。雖然backdrop-filter使用方式同filter屬性一致,但它適用于元素背后的所有元素,不過為了看到效果,必須使元素或其背景至少部分透明。

          既然backdrop-filter和filter的語法相同,那所支持的濾鏡效果和呈現(xiàn)效果會(huì)不會(huì)也一樣呢?

          屬性值

          filter

          drop-filter

          說明

          blur

          支持

          支持

          高斯模糊


          brightness

          支持

          支持

          亮度

          contrast

          支持

          支持

          對(duì)比度

          drop-shadow

          支持

          支持

          陰影

          grayscale

          支持

          支持

          灰度

          hue-rotate

          支持

          支持

          色相

          invert

          支持

          支持

          反相

          opacity

          支持

          支持

          透明度

          sepia

          支持

          支持

          飽和度

          saturate

          支持

          支持

          褐色

          url

          支持

          支持

          SVG過濾器的URL

          由上可知,filter和backdrop-filter支持的濾鏡是一模一樣的。不過,與filter 不同的就是backdrop-filter是應(yīng)用于元素后面的內(nèi)容而不是元素本身,而filter卻是作用于元素本身,所以呈現(xiàn)出來的濾鏡效果當(dāng)然是有些不同的。為了更好地看出作用元素的區(qū)別,我們?cè)倥e個(gè)簡(jiǎn)單的例子,依然是模糊效果。

          <div class="main">
            <div class="child">none</div>
            <div class="child filter">filter</div>
            <div class="child backdrop-filter">backdrop-filter</div>
          </div>
          .main {
            width:100vw;
            height:100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background: url("xxx.png");
            background-size: cover;
          }
          .child {
            width: 400px;
            height:300px;
            color: #fff;
            font-size: 20px;
            text-align: center;
            line-height: 300px;
            background: rgba(0, 0, 0, .7);
            margin-left: 20px;
          }
          .filter {
            filter: blur(8px);
          }
          .backdrop-filter {
            backdrop-filter: blur(8px);
          }

          圖26 濾鏡作用元素效果對(duì)比圖

          由上圖我們可以看到filter屬性確實(shí)只將作用元素本身進(jìn)行了模糊處理,包括元素的背景和文本內(nèi)容,而backdrop-filter作用的元素本身卻沒有任何效果,但是它背后的背景圖片部分確實(shí)被進(jìn)行了模糊處理,其實(shí)在出現(xiàn)backdrop-filter屬性之前,是很難實(shí)現(xiàn)給元素背后特定的區(qū)域添加濾鏡效果的。

          那既然濾鏡的這兩個(gè)屬性都這么厲害為什么還是不怎么常見,難道是因?yàn)榧嫒菪圆惶脝幔?/span>



          7. 兼容性

          圖27 filter兼容性說明圖

          filter屬性在現(xiàn)代瀏覽器中有很好的支持,包括Chrome、Firefox、Safari、Edge等主流瀏覽器,部分版本仍需要添加前綴進(jìn)行兼容性處理。

          圖28 dropback-filter兼容性說明圖

          dropback-filter屬性的兼容性相對(duì)較低,僅在一些較新版本的瀏覽器中得到支持,且安卓移動(dòng)端支持較弱。

          由上可知,filter屬性在大部分瀏覽器中具有良好的兼容性,但只能調(diào)整元素本身的效果;backdrop-filter屬性適用于調(diào)整元素后面內(nèi)容的效果,但兼容性相對(duì)較差。所以還是需要根據(jù)具體的需求和是否需要廣泛支持的場(chǎng)景,選擇適合的屬性去進(jìn)行對(duì)應(yīng)濾鏡效果的處理。

          需要注意的是:作用了filter和backdrop-filter的元素會(huì)使內(nèi)部的fixed定位失效,原因是filter值不為none的元素和backdrop-filter值不為none的元素,都會(huì)生成新的堆疊上下文。我們都知道css中position: fixed是相對(duì)于屏幕視口進(jìn)行定位的,而作用了filter和backdrop-filter的元素會(huì)使得其內(nèi)部的position: fixed元素不再相對(duì)于屏幕視口進(jìn)行定位,而是相對(duì)這個(gè)父元素進(jìn)行定位。



          8. 最后

          CSS濾鏡技術(shù)是一個(gè)強(qiáng)大而有趣的工具,可以在不依賴圖像編輯軟件的情況下,在網(wǎng)頁設(shè)計(jì)中應(yīng)用不同的濾鏡效果,也可以為元素增添生動(dòng)、豐富的視覺效果。

          在本文中,我們先介紹了各種濾鏡函數(shù)的基礎(chǔ)用法和顯示效果,了解了它們?nèi)绾胃淖冊(cè)氐耐庥^和視覺表現(xiàn)。隨后,我們了解了如何通過靈活地應(yīng)用不同的濾鏡函數(shù)和組合,去創(chuàng)造出更復(fù)雜、個(gè)性化的濾鏡效果,去實(shí)現(xiàn)圖像處理和動(dòng)畫,為網(wǎng)頁設(shè)計(jì)增添了更多創(chuàng)意和動(dòng)感。我們還知道了通過使用filter屬性,可以簡(jiǎn)單地應(yīng)用模糊(blur)、對(duì)比度(contrast)和亮度(brightness)調(diào)整、顏色調(diào)整等效果,讓網(wǎng)頁元素瞬間煥發(fā)生機(jī)。而backdrop-filter屬性則允許我們對(duì)元素背景內(nèi)容進(jìn)行處理,為網(wǎng)頁帶來更深度的視覺層次。

          但是,在使用濾鏡效果時(shí)我們也要考慮兼容性和性能問題,盡量避免過度使用濾鏡造成頁面加載緩慢。雖然大多數(shù)現(xiàn)代瀏覽器都支持CSS濾鏡,但一些高級(jí)濾鏡在較舊的瀏覽器或移動(dòng)設(shè)備上可能會(huì)有兼容性問題。因此,我們?cè)谑褂脼V鏡時(shí)需要進(jìn)行兼容性測(cè)試,并在必要時(shí)提供備用方案,以確保在不同平臺(tái)和設(shè)備上都能展現(xiàn)良好的效果。


          本文作者


          柯琦,來自縵圖互聯(lián)網(wǎng)中心前端團(tuán)隊(duì)。

          來源-微信公眾號(hào):縵圖coder

          出處:https://mp.weixin.qq.com/s/x15DGBjOyL8EWtt78xJESg


          度發(fā)布是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。AB test就是一種灰度發(fā)布方式,讓一部分用戶繼續(xù)用A,一部分用戶開始用B,如果用戶對(duì)B沒有什么反對(duì)意見,那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面來。

          灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度。

          灰度發(fā)布常見一般有三種方式:

          • Nginx+LUA方式
          • 根據(jù)Cookie實(shí)現(xiàn)灰度發(fā)布
          • 根據(jù)來路IP實(shí)現(xiàn)灰度發(fā)布

          本文主要將講解根據(jù)Cookie和來路IP這兩種方式實(shí)現(xiàn)簡(jiǎn)單的灰度發(fā)布,Nginx+LUA這種方式涉及內(nèi)容太多就不再本文展開了。

          A/B測(cè)試流程




          Nginx根據(jù)Cookie實(shí)現(xiàn)灰度發(fā)布

          根據(jù)Cookie查詢Cookie鍵為version的值,如果該Cookie值為V1則轉(zhuǎn)發(fā)到hilinux_01,為V2則轉(zhuǎn)發(fā)到hilinux_02。Cookie值都不匹配的情況下默認(rèn)走h(yuǎn)ilinux_01所對(duì)應(yīng)的服務(wù)器。

          兩臺(tái)服務(wù)器分別定義為:

          hilinux_01  192.168.1.100:8080
          hilinux_02  192.168.1.200:8080

          用if指令實(shí)現(xiàn)

          upstream hilinux_01 {
              server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
          }
          
          upstream hilinux_02 {
              server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
          }
          
          upstream default {
              server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
          }
          
          server {
            listen 80;
            server_name  www.hi-linux.com;
            access_log  logs/www.hi-linux.com.log  main;
          
            #match cookie
            set $group "default";
              if ($http_cookie ~* "version=V1"){
                  set $group hilinux_01;
              }
          
              if ($http_cookie ~* "version=V2"){
                  set $group hilinux_02;
              }
          
            location / {                       
              proxy_pass http://$group;
              proxy_set_header   Host             $host;
              proxy_set_header   X-Real-IP        $remote_addr;
              proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
              index  index.html index.htm;
            }
           }

          用map指令實(shí)現(xiàn)

          在Nginx里面配置一個(gè)映射,$COOKIE_version可以解析出Cookie里面的version字段。$group是一個(gè)變量,{}里面是映射規(guī)則。

          如果一個(gè)version為V1的用戶來訪問,$group就等于hilinux_01。在server里面使用就會(huì)代理到http://hilinux_01上。version為V2的用戶來訪問,$group就等于hilinux_02。在server里面使用就會(huì)代理到http://hilinux_02上。Cookie值都不匹配的情況下默認(rèn)走h(yuǎn)ilinux_01所對(duì)應(yīng)的服務(wù)器。

          upstream hilinux_01 {
              server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
          }
          
          upstream hilinux_02 {
              server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
          }
          
          upstream default {
              server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
          }
          
          map $COOKIE_version $group {
          ~*V1$ hilinux_01;
          ~*V2$ hilinux_02;
          default default;
          }
          
          server {
            listen 80;
            server_name  www.hi-linux.com;
            access_log  logs/www.hi-linux.com.log  main;
          
            location / {                       
              proxy_pass http://$group;
              proxy_set_header   Host             $host;
              proxy_set_header   X-Real-IP        $remote_addr;
              proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
              index  index.html index.htm;
            }
           }

          Nginx根據(jù)來路IP實(shí)現(xiàn)灰度發(fā)布

          如果是內(nèi)部IP,則反向代理到hilinux_02(預(yù)發(fā)布環(huán)境);如果不是則反向代理到hilinux_01(生產(chǎn)環(huán)境)。

          upstream hilinux_01 {
              server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
          }
          
          upstream hilinux_02 {
              server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
          }
          
          upstream default {
              server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
          }
          
          server {
            listen 80;
            server_name  www.hi-linux.com;
            access_log  logs/www.hi-linux.com.log  main;
          
            set $group default;
            if ($remote_addr ~ "211.118.119.11") {
                set $group hilinux_02;
            }
          
          location / {                       
              proxy_pass http://$group;
              proxy_set_header   Host             $host;
              proxy_set_header   X-Real-IP        $remote_addr;
              proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
              index  index.html index.htm;
            }
          }

          如果你只有單臺(tái)服務(wù)器,可以根據(jù)不同的IP設(shè)置不同的網(wǎng)站根目錄來達(dá)到相同的目的。

          server {
            listen 80;
            server_name  www.hi-linux.com;
            access_log  logs/www.hi-linux.com.log  main;
          
            set $rootdir "/var/www/html";
              if ($remote_addr ~ "211.118.119.11") {
                 set $rootdir "/var/www/test";
              }
          
              location / {
                root $rootdir;
              }
          }

          到此最基本的實(shí)現(xiàn)灰度發(fā)布方法就講解完了,如果要做更細(xì)粒度灰度發(fā)布可參考ABTestingGateway項(xiàng)目。

          ABTestingGateway是新浪開源的一個(gè)動(dòng)態(tài)路由系統(tǒng)。ABTestingGateway是一個(gè)可以動(dòng)態(tài)設(shè)置分流策略的灰度發(fā)布系統(tǒng),工作在7層,基于nginx和ngx-lua開發(fā),使用redis作為分流策略數(shù)據(jù)庫,可以實(shí)現(xiàn)動(dòng)態(tài)調(diào)度功能。

          ABTestingGateway:https://github.com/CNSRE/ABTestingGateway

          SS是一個(gè)很獨(dú)特的語言??雌饋矸浅:?jiǎn)單,但是某種特殊效果看似簡(jiǎn)單,實(shí)現(xiàn)起來就頗有難度。這篇文章主要是給在學(xué)習(xí)前端的童鞋分享一些新的CSS技巧,一些在前端教程和培訓(xùn)課堂中不會(huì)講到的知識(shí)。第二就是讓還在前端開發(fā)這條道路上的童鞋們,重新燃起對(duì)前端排版和特效的熱愛和熱情!

          1. 固定底部?jī)?nèi)容

          這種是一個(gè)非常常見的布局方式,但是對(duì)于新手來說是比較常見的難題。

          這種布局方式在后臺(tái)管理系統(tǒng)中比較常見,當(dāng)我們內(nèi)容不足瀏覽器窗口高度時(shí),底部?jī)?nèi)容需要固定在底部。當(dāng)內(nèi)容超出了瀏覽器窗口高度,就會(huì)隨著內(nèi)容往后推。

          在有CSS3之前,實(shí)現(xiàn)這個(gè)效果是頗有難度的。瀏覽器窗口高度是會(huì)根據(jù)不同用戶打開瀏覽器的情況,屏幕大小的差異和瀏覽器的縮放比例而變。我們需要借助JavaScript來實(shí)時(shí)獲取瀏覽器高度進(jìn)行運(yùn)算才能實(shí)現(xiàn)。雖然說標(biāo)題是說“固定”底部,但是我們想要的效果不是position: fixed。使用固定定位,在內(nèi)容高于窗口高度時(shí),就會(huì)擋住我們的內(nèi)容。

          隨著CSS3的來臨,最完美的實(shí)現(xiàn)方式是使用Flexbox。實(shí)現(xiàn)的關(guān)鍵就是使用不太被關(guān)注的flex-grow屬性,可以在我們的內(nèi)容標(biāo)簽元素(比如div)中使用。在我們下面的例子里使用了main標(biāo)簽。

          我來講解一下實(shí)現(xiàn)原理吧。

          flew-grow是用來控制一個(gè)flex元素相對(duì)它同等級(jí)flex元素的自身可擴(kuò)充的空間。如果我們使用flex-grow: 0,那這個(gè)flex元素就完全不會(huì)擴(kuò)展了。所以我們需要把頭部和底部之間的內(nèi)容標(biāo)簽元素設(shè)置為flex-grow: 1或者flex-grow: auto,這樣內(nèi)容部分就會(huì)自動(dòng)填充滿頭部和底部之外的所有空間。

          為了避免底部?jī)?nèi)容受內(nèi)容部分?jǐn)U充空間的影響,我們給footer底部元素flex-shrink: 0屬性。flex-shrink的作用與flex-grow是恰恰相反,用來控制flex元素收縮的空間,這里我們給了flex-shrink: 0就是為了底部footer的大小不受影響。

          我們直接上HTML和CSS代碼看看是怎么實(shí)現(xiàn)的。

          • HTML
          <div id="document">
          	<nav>
          		<h1>頭部?jī)?nèi)容</h1>
          	</nav>
          	<main>
          		<p>可以添加更多內(nèi)容看看底部的變化哦!</p>
          	</main>
          	<footer>
          		<h1>底部?jī)?nèi)容</h1>
          	</footer>
          </div>
          • CSS
          #document {
              height: 100vh;
              display: flex;
              flex-direction: column;
              background: #202020;
              font-family: microsoft yahei,wenquanyi micro hei,sans-serif !important;
          }
          
          nav, footer {
              background: #494949;
              display: flex;
              justify-content: center;
          }
          
          main {
              color: #bdbdbd;
              flex: auto;
          }
          
          footer {
              flex-shrink: 0;
          }
          
          * {
              margin: 0;
          }
          
          h1,
          p {
              padding: 15px;
          }
          
          nav > h1 {
              color: #82FCFD;
              text-shadow: 1px 1px 4px #00000080;
          }
          
          footer > h1 {
              color: #82FCFD;
              text-shadow: 1px 1px 4px #00000080;
          }

          知識(shí)點(diǎn)總結(jié):

          flex-grow --- 是用來控制一個(gè)flex元素相對(duì)它同等級(jí)flex元素的自身可擴(kuò)充的空間 flex-shrink --- 作用與flex-grow是恰恰相反,用來控制flex元素收縮的空間

          2. 懸停放大圖片特效

          懸停放大圖片是一個(gè)特別吸引眼球的特效,比較常用于可點(diǎn)擊的圖片。當(dāng)用戶懸停鼠標(biāo)在圖片上,圖片會(huì)稍微的放大。

          其實(shí)實(shí)現(xiàn)這個(gè)特效是非常簡(jiǎn)單的。首先我們需要一個(gè)div包裹這img標(biāo)簽,這個(gè)包裹層是用來遮擋住圖片,當(dāng)圖片放大時(shí)不會(huì)出現(xiàn)圖片超出我們規(guī)定的寬高以外。

          首先我們來講講div包裹的屬性,我們需要給它一個(gè)固定的width寬和height高。然后我們必須給予這個(gè)元素overflow: hidden屬性。讓圖片放大的時(shí)候不會(huì)超出這個(gè)div元素的寬高。有了這個(gè)包裹層,我們就可以編寫img的各種效果了。

          我的例子里面用了transform: scale(1,1)作為懸停時(shí)的圖片特效,這個(gè)transform是用于改變?nèi)魏卧氐膶傩缘模缓髎cale是用于放大(整數(shù)就會(huì)放大)或者縮小(負(fù)數(shù)就會(huì)縮小)元素的。

          上代碼讓大家看看:

          • html body中放入
          <div class="img-wrapper">
            <img src="https://img-blog.csdnimg.cn/2020032122230564.png"/>
          </div>
          • CSS
          .img-wrapper {
            width: 400px;
            height: 400px;
            overflow: hidden;
            box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
          }
          
          .img-wrapper img {
            height: 400px;
            -webkit-transition: 0.3s linear;
            transition: 0.3s linear;
          }
          
          .img-wrapper img:hover {
            transform: scale(1.1);
          }
          
          .img-wrapper {
            display: inline-block;
            box-sizing: border-box;
            border: 3px solid #000;
          }

          如果你們想讓圖片更加炫酷可以加上圖片過濾屬性filter,讓圖片變灰或者變深褐色,然后懸停時(shí)候出現(xiàn)更加炫酷的顏色變幻?;一膶傩允莊ilter: grayscale(100%);,然后深褐色化的屬性是filter: sepia(100%)。其實(shí)圖片還有很多過濾屬性的,大家有興趣也可以去嘗試一下哦!

          加入特殊效果的代碼如下:

          • HTML
          <!-- 灰度過濾 -->
          <div class="img-wrapper">
            <img
              class="grayscale-img"
              src="https://img-blog.csdnimg.cn/2020032211021728.png"
            />
          </div>
          
          <!-- 深褐色過濾 -->
          <div class="img-wrapper">
            <img
              class="sepia-img"
              src="https://img-blog.csdnimg.cn/2020032122230564.png"
            />
          </div>
          • CSS
          /* ============== 
          * 灰度過濾 
          * ==============*/
          .grayscale-img {
            -webkit-filter: grayscale(100%);
            filter: grayscale(100%);
          }
          
          .grayscale-img:hover {
            -webkit-filter: grayscale(0);
            filter: grayscale(0);
          }
          
          /* ============== 
          * 深褐色過濾
          * ==============*/
          .sepia-img {
            -webkit-filter: sepia(100%);
            filter: sepia(100%);
          }
          
          .sepia-img:hover {
            -webkit-filter: sepia(0);
            filter: sepia(0);
          }

          知識(shí)總結(jié)

          transform --- 用于改變?cè)?scale --- 對(duì)元素進(jìn)行放大和縮小 filter --- 圖片過濾器 grayscale --- 灰度過濾 sepia --- 深褐色過濾

          3. 瞬間黑暗模式

          最近微信也逃脫不了黑暗時(shí)代的到來,網(wǎng)頁也很多都做了黑暗模式的兼容和主題。如果我們?cè)谧龅囊粋€(gè)網(wǎng)站想瞬間實(shí)現(xiàn)黑暗模式可以怎么實(shí)現(xiàn)呢?

          其實(shí)有一個(gè)很快的方式,我們可以使用invert和hue-rotate兩個(gè)CSS3過濾器來實(shí)現(xiàn)。

          filter: invert() — 是從0到1的刻度,1是從白變黑。 filter: hue-rotate() — 用于改變你元素的顏色,同時(shí)或多或少保持原本相同的色系。這個(gè)屬性的值可以從0deg到360deg。

          在我們頁面的body標(biāo)簽上添加這兩個(gè)屬性,我們就可以快速嘗試把我們的網(wǎng)站變成"黑暗模式"。這里需要注意的是,如果body和html上沒有設(shè)置background背景顏色,這個(gè)過濾就會(huì)不起效了哦。

          CSS的代碼如下:

          html {
            background: #fff;
          }
          
          body {
            background: #fff;
            filter: invert(1) hue-rotate(270deg);
          }

          實(shí)現(xiàn)效果

          這里我們會(huì)發(fā)現(xiàn)圖片的顏色會(huì)受影響,并不是很美觀,使用css過濾器是無法完美切換黑暗模式的。不過使用JavaScript輔助就可以完美的切換黑暗模式。

          最近出了一個(gè)JavaScript輔助插件叫Darkmode.js。

          Darkmode.js

          其實(shí)Darkmode.js運(yùn)用的也是css里面的一個(gè)特性叫mix-blend-mode — “CSS 屬性描述了元素的內(nèi)容應(yīng)該與元素的直系父元素的內(nèi)容和元素的背景如何混合“。加上Javascript的輔助判斷哪些頁面上的元素需要黑化的,哪些是不需要黑化的。就會(huì)想我們之前那種做法,導(dǎo)致其他不需要黑化的元素,比如圖片,受到影響導(dǎo)致顏色出現(xiàn)問題。

          使用Darkmode.js非常簡(jiǎn)單,只要在腳本里面添加以下代碼就可以馬上加入一個(gè)插件,

          <script src="https://cdn.jsdelivr.net/npm/darkmode-js@1.5.5/lib/darkmode-js.min.js"></script>
          <script>
            // 這些是這個(gè)插件的可配置項(xiàng):
            var options = {
              bottom: "32px", // 定位底部距離 - 默認(rèn): '32px'
              right: "32px", // 定位右邊距離 - 默認(rèn): '32px'
              left: "unset", // 定位左邊距離 - 默認(rèn): 'unset'
              time: "0.5s", // 默認(rèn)動(dòng)畫時(shí)間: '0.3s'
              mixColor: "#fff", // 需要改變的顏色 - 默認(rèn): '#fff'
              backgroundColor: "#fff", // 背景顏色 - 默認(rèn): '#fff'
              buttonColorDark: "#262728", // 黑暗模式下按鈕顏色 - 默認(rèn): '#100f2c'
              buttonColorLight: "#fff", // 日間模式下按鈕顏色 - 默認(rèn): '#fff'
              saveInCookies: true, // 是否在cookie保存當(dāng)前模式 - 默認(rèn): true,
              label: "", // 切換模式按鈕圖標(biāo) - 默認(rèn): ''
              autoMatchOsTheme: true // 是否自動(dòng)根據(jù)系統(tǒng)適應(yīng)模式 - 默認(rèn): true
            };
          
            let darkmode = new Darkmode(options);
            darkmode.showWidget();
          </script>

          如果你不希望用這個(gè)插件的默認(rèn)按鈕,你可以在你的JavaScript代碼中自主控制。我們可以通過.toggle()方法來切換模式,同時(shí)可以使用.isActivated()來檢測(cè)是否已經(jīng)進(jìn)入黑暗模式。

          const darkmode =  new Darkmode();
          darkmode.toggle();
          console.log(darkmode.isActivated()) // 如果已經(jīng)進(jìn)入黑暗模式會(huì)返回 true

          知識(shí)總結(jié)

          filter: invert() — 可以把頁面從白變黑,也可以從黑變白。 filter: hue-rotate() — 用于改變你元素的顏色,同時(shí)或多或少保持原本相同的色系。 Darkmode.js — 瞬間實(shí)現(xiàn)黑暗模式。

          4. 自定義列表符號(hào)

          ul,li的無序列表有默認(rèn)的符號(hào)·,但是在很多情況下我們希望可以給這個(gè)符號(hào)加入自己的樣式和顏色,甚至是換成自定義的符號(hào)。默認(rèn)的符號(hào)我們是無法做任何的樣式處理,而且默認(rèn)的符號(hào)在CSS屬性里面只有幾個(gè)選擇可以使用,很多情況下都是無法滿足我們的設(shè)計(jì)。

          其實(shí)自定義無序列表符號(hào)不難,我們只需要使用偽類::before加content屬性就可以實(shí)現(xiàn)。

          在我這個(gè)例子里面我做了兩個(gè)任務(wù)列表,一個(gè)是待處理任務(wù),一個(gè)是已完成任務(wù),各自給了不一樣的列表符號(hào)和顏色。

          實(shí)現(xiàn)原理

          一、首先我們禁用了ul的默認(rèn)符號(hào)樣式list-style: none

          二、在li的:before偽類上給予content內(nèi)容值,待處理任務(wù)使用,已完成任務(wù)li.completed:before使用?

          三、為了展示效果更加好看我分別給了li和li .completed兩個(gè)不同的顏色

          上代碼看看是怎么實(shí)現(xiàn)的吧:

          HTML

          <div>
            <h2>待處理</h2>
            <ul>
              <li>待辦任務(wù)1</li>
              <li>待辦任務(wù)2</li>
              <li>待辦任務(wù)3</li>
              <li>待辦任務(wù)4</li>
              <li>待辦任務(wù)5</li>
            </ul>
          </div>
          <div>
            <h2>已完成</h2>
            <ul>
              <li class="completed">完成任務(wù)1</li>
              <li class="completed">完成任務(wù)2</li>
              <li class="completed">完成任務(wù)3</li>
            </ul>
          </div>

          CSS

          ul {
            list-style: none;
            color: #fff;
            font-size: 20px;
            border: 3px solid #000;
            padding: 1rem 2rem;
            min-height: 200px;
            margin: 15px 2rem 0 0;
            background: #323232;
            box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
            border-radius: 8px;
          }
          
          li {
            padding: 0.3rem 0;
          }
          
          li::before {
            content: " ";
            color: aqua;
          }
          
          li.completed::before {
            content: "? ";
            text-decoration: none;
            color: greenyellow;
          }
          
          li.completed {
            text-decoration: line-through;
            color: #bdbdbd;
          }

          ::before和::after偽類加content屬性可以用來做很多特殊的效果,也是當(dāng)代前端排版比較常用的“魔法”。說到偽類的使用,我再給大家說一個(gè)比較常用的使用場(chǎng)景。

          在管理后臺(tái)或者是文章展示中,我們經(jīng)常可以見到的“面包屑導(dǎo)航”也是用偽類來插入每個(gè)目錄中間的符號(hào)的。

          實(shí)現(xiàn)邏輯

          一、這個(gè)導(dǎo)航含有3個(gè)a標(biāo)簽,首先給每個(gè)a標(biāo)簽加入一個(gè)偽類::after,然后在content屬性插入/符號(hào)。

          二、然后使用a:first-child,這個(gè)偽類會(huì)選擇到第一個(gè)a標(biāo)簽,然后使用content屬性加入?符號(hào)。

          三、因?yàn)槲覀兊谝徊皆诿總€(gè)a標(biāo)簽的后面插入了/符號(hào), 所以我們需要在最后一個(gè)a標(biāo)簽清除掉。這里我們使用:last-child選擇到最后一個(gè)a標(biāo)簽,然后用content: " "屬性把偽類的內(nèi)容清楚掉。

          HTML

          <div class="breadcrumb">
            <a>三鉆</a>
            <a>前端</a>
            <a>教程</a>
          </div>

          CSS

          .breadcrumb {
            font-size: 1.6rem;
            color: #fff;
          }
          .breadcrumb a:first-child {
            color: #82fcfd;
          }
          .breadcrumb a:first-child::before {
            content: " ? ";
          }
          .breadcrumb a::after {
            content: " /";
            color: #ef6eae;
          }
          .breadcrumb a:last-child::after {
            content: "";
          }

          知識(shí)總結(jié)

          ::before | ::after — 偽類用于向某些選擇器添加特殊的效果。 content — CSS 屬性用于在元素的 ::before 和 ::after 偽元素中插入內(nèi)容。使用content 屬性插入的內(nèi)容都是匿名的可替換元素。 :first-child — CSS偽類表示在一組兄弟元素中的第一個(gè)元素。 :last-child — CSS偽類代表父元素的最后一個(gè)子元素。

          5. 圖片視差效果

          這個(gè)超級(jí)炫酷的效果在官網(wǎng)中非常的受歡迎,這種效果可以給用戶帶來視覺沖擊,也給我們的網(wǎng)站帶來了活力。普通的網(wǎng)頁圖片會(huì)跟隨著網(wǎng)頁一起滑動(dòng),但是視覺差效果圖就會(huì)固定在底部,只有圖片所在的窗口上的元素會(huì)移動(dòng)。

          僅使用CSS

          對(duì)你沒有看錯(cuò),這個(gè)效果只需要用到CSS就能輕易的實(shí)現(xiàn)!我們只要使用一個(gè)CSS背景圖的屬性background-attachment: fixed,這個(gè)特性會(huì)把背景相對(duì)于視口固定。即使一個(gè)元素?fù)碛袧L動(dòng)機(jī)制,背景也不會(huì)隨著元素的內(nèi)容滾動(dòng)。

          實(shí)現(xiàn)理論:

          一、在含有圖片的元素中加入background: url()和background-size: cover(第二個(gè)屬性適用于定義圖片為封面,可以讓圖片大小自動(dòng)適應(yīng),在很大的屏幕也會(huì)顯示完整的圖片)

          二、然后附加固定背景圖的屬性background-attachment: fixed

          三、最后給這個(gè)元素加入一個(gè)高度height: 100%或者任意的高度height: 400px

          就那么簡(jiǎn)單哦!不用懷疑,馬上上代碼,大家都可以自己去試試哦!

          HTML

          <div class="wrapper">
             <div class="parallax-img"></img>
             <p>這里填寫一堆文字就可以了,盡量多一點(diǎn)哦</p>
          </div>

          CSS

          .wrapper {
            height: 100wh;
          }
          .parallax-img {
            background-attachment: fixed;
            background-position: center;
            background-repeat: no-repeat;
            background-size: cover;
            height: 100%;
            background-image: url("http://ppe.oss-cn-shenzhen.aliyuncs.com/collections/182/7/thumb.jpg");
          }
          p {
            font-size: 20px;
            padding: 1.5rem 3rem;
            min-height: 1000px; // 當(dāng)你的文字內(nèi)容不夠,也能撐出足夠的高度來看到效果,當(dāng)然如果你文字足夠多,就不需要了
          }

          如果想做到我動(dòng)圖里面一樣的效果,或者想看是怎么實(shí)現(xiàn)的,可以查看下面總結(jié)里面的“預(yù)覽實(shí)際效果”或者看“GitHub源碼”。

          知識(shí)總結(jié)

          background-attachment: fixed — 把背景相對(duì)于視口固定。即使一個(gè)元素?fù)碛袧L動(dòng)機(jī)制,背景也不會(huì)隨著元素的內(nèi)容滾動(dòng)。 background-size: cover — 可以讓圖片大小自動(dòng)適應(yīng),在很大的屏幕也會(huì)顯示完整的圖片。


          使用CSS + JavaScript

          有些童鞋可能沒有被這個(gè)震撼到或者還是覺得不夠刺激。那我們?cè)賮硪粋€(gè)高級(jí)例子,上面的例子在滑動(dòng)的時(shí)候圖片是固定死的。如果我們加上JavaScript的助力,我們可以讓窗口的圖片緩慢的跟隨這個(gè)頁面滑動(dòng),使得效果更有動(dòng)力和更有沖擊感。

          實(shí)現(xiàn)理論 首先講一下排版,因?yàn)槲覀冃枰谖覀兓瑒?dòng)頁面的時(shí)候使用JavaScript偏移圖片,所以我們需要給圖片一個(gè)CSS屬性讓我們可以讓圖片可以根據(jù)一個(gè)速度來往上或者往下移動(dòng)。這個(gè)例子里面我們讓所有圖片包裹在一個(gè)div里面,class名為block。這個(gè)div給予相對(duì)定位屬性position: relative,這個(gè)時(shí)候我們就可以在里面加入圖片,然后讓圖片絕對(duì)定位position: absolute在這個(gè)div盒子里面。

          但是圖片是可能很大的,我們需要把圖片不超出我們定義個(gè)盒子,所以我們的div同時(shí)也給予了overflow: hidden和一個(gè)高度height: 100%。這樣圖片超出div盒子就會(huì)被隱藏。

          布局代碼如下:

          <div class="block">
            <img
              src="https://unsplash.it/1920/1920/?image=1005"
              data-speed="-1"
              class="img-parallax"
            />
            <h2>視差速度 -1</h2>
          </div>
          <div class="block">
            <img
              src="https://unsplash.it/1920/1920/?image=1067"
              data-speed="1"
              class="img-parallax"
            />
            <h2>視差速度 1</h2>
          </div>
          html, body{
            margin: 0;
            padding: 0;
            height: 100%;
            width: 100%;
            font-family: 'Amatic SC', cursive;
          }
          .block{
            width: 100%;
            height: 100%;
            position: relative;
            overflow: hidden;
            font-size: 16px;
          }
          .block h2{
            position: relative;
            display: block;
            text-align: center;
            margin: 0;
            top: 50%;
            transform: translateY(-50%);
            font-size: 10vw;
            color: white;
            font-weight: 400;
          }
          .img-parallax {
            width: 100vmax;
            z-index: -1;
            position: absolute;
            top: 0;
            left: 50%;
            transform: translate(-50%,0);
            pointer-events: none
          }

          實(shí)現(xiàn)這個(gè)布局,在你滑動(dòng)的時(shí)候,圖片是不會(huì)移動(dòng)的。因?yàn)樽詈笠徊骄褪羌尤隞avaScript的輔助,讓圖片活起來。

          <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
          <script>
          // 循環(huán)獲取每一個(gè)圖片元素
          $(".img-parallax").each(function () {
            var img = $(this);
            var imgParent = $(this).parent();
            function parallaxImg() {
              var speed = img.data("speed"); // 獲取每張圖片設(shè)置了的偏移速度
              var imgY = imgParent.offset().top; // 獲取圖片盒子所在的Y位置
              var winY = $(this).scrollTop(); // 獲取當(dāng)前滑動(dòng)到的位置
              var winH = $(this).height(); // 獲取瀏覽器窗口高度
              var parentH = imgParent.innerHeight(); // 獲取圖片盒子的內(nèi)高度
          
              // 瀏覽器窗口底部的所在位置
              var winBottom = winY + winH; 
          
              // 當(dāng)前圖片是否進(jìn)入瀏覽器窗口
              if (winBottom > imgY && winY < imgY + parentH) {
                // 運(yùn)算圖片需要開始移動(dòng)的位置
                var imgBottom = (winBottom - imgY) * speed;
                // 運(yùn)算出圖片需要停止移動(dòng)的位置
                var imgTop = winH + parentH;
                // 獲取從開始移動(dòng)到結(jié)束移動(dòng)的%(根據(jù)開始與結(jié)束像素 + 移動(dòng)速度)
                var imgPercent = (imgBottom / imgTop) * 100 + (50 - speed * 50);
              }
              img.css({
                top: imgPercent + "%",
                transform: "translate(-50%, -" + imgPercent + "%)",
              });
            }
            $(document).on({
              scroll: function () {
                parallaxImg();
              },
              ready: function () {
                parallaxImg();
              },
            });
          });
          </script>

          知識(shí)總結(jié)

          position: relative — 相對(duì)定位。 position: absolute — 絕對(duì)定位。 overflow: hidden — 如果需要,內(nèi)容將被剪裁以適合填充框。 不提供滾動(dòng)條。

          6. 裁剪圖像的動(dòng)畫

          在有CSS3之前裁剪圖片實(shí)現(xiàn)也是頗有難度的?,F(xiàn)在我們有了兩個(gè)非常方便簡(jiǎn)單的CSS3屬性可以實(shí)現(xiàn)裁剪,那就是object-fit和object-position, 這兩個(gè)屬性可以讓我們改變圖片的大小,但是不影響圖片的長(zhǎng)寬比。

          當(dāng)然我們可以使用圖片處理工具或者使用JavaScript等插件來實(shí)現(xiàn)圖片裁剪功能。但是因?yàn)橛辛薈SS3的屬性,我們不只可以裁剪,我們還可以用裁剪的屬性來做圖片的動(dòng)態(tài)效果。

          為了讓我們的例子更加簡(jiǎn)單,我們這里使用了<input type="checkbox">復(fù)選框元素,這樣我們就可以使用:checked的偽類來觸發(fā)啟動(dòng)效果。所以在例子里面我們完全不需要JavaScript的協(xié)助。

          實(shí)現(xiàn)原理:

          一、首先給予圖片一個(gè)寬高h(yuǎn)eight: 1080px,width: 1920px。

          二、然后用CSS選擇器,鎖定當(dāng)input被選中后img標(biāo)簽的樣式變化。當(dāng)被選中時(shí),給圖片設(shè)定一個(gè)新的寬高,這里我們給寬高各自500像素:width: 500px,height: 500px。

          三、然后我們加上了過渡效果和時(shí)間讓圖片改變寬高時(shí)有動(dòng)畫過渡效果:transition: width 2s, height 4s;。

          四、最后加上object-fit: cover和object-position: left-top這兩個(gè)屬性來保持圖片的寬高比例,這樣就大功告成了!

          我們來看看完成的代碼:

          勾選裁剪圖片 <input type="checkbox" />
          <br />
          <img
            src="https://img-blog.csdnimg.cn/2020032122230564.png"
            alt="Random"
          />
          input {
            transform: scale(1.5); /* 只是用來放大復(fù)選框大小 */
            margin: 10px 5px;
            color: #fff;
          }
          
          img {
            width: 1920px;
            height: 1080px;
            transition: 0s;
          }
          
          /* css選擇器鎖定復(fù)選框被選中時(shí)的狀態(tài) */
          input:checked + br + img {
            width: 500px;
            height: 500px;
            object-fit: cover;
            object-position: left-top;
            transition: width 2s, height 4s;
          }

          知識(shí)總結(jié)

          object-fit — CSS 屬性指定可替換元素的內(nèi)容應(yīng)該如何適應(yīng)到其使用的高度和寬度確定的框。 object-position — 用來切換被替換元素的內(nèi)容對(duì)象在元素框內(nèi)的對(duì)齊方式。 transition — 過渡可以為一個(gè)元素在不同狀態(tài)之間切換的時(shí)候定義不同的過渡效果。

          7. 混合模式(Blend)

          如果有使用過Photoshop的同學(xué)對(duì)blend混合模式應(yīng)該是非常熟悉了,我們都知道混合模式是非常強(qiáng)大,也是p圖時(shí)非常常用的一個(gè)功能。但是你們有沒有想象過可以在瀏覽器的CSS中直接使用呢?對(duì)我們不需要設(shè)計(jì)師給我們做圖,我們前端也可以實(shí)現(xiàn)混合模式了。

          在CSS中我們不只可以對(duì)background背景加入混合模式,我們可以對(duì)任何一個(gè)元素的自帶背景加入混合模式,讓你可以做出很多之前沒有想過的效果和排版。

          往一個(gè)元素加入混合模式,我們只需要使用到一個(gè)CSS屬性mix-blend-mode即可。

          簡(jiǎn)單實(shí)現(xiàn)原理:

          首先我們只需要加一個(gè)h1標(biāo)題標(biāo)簽

          <h1>混合模式:顏色減淡</h1>

          然后我們給h1標(biāo)簽加入mix-blend-mode中的顏色減弱模式color-dodge,但是要注意的是我們需要給body和html加入背景顏色background: white,要不你會(huì)發(fā)現(xiàn)這個(gè)效果會(huì)無效。因?yàn)閔1我們沒有給顏色,會(huì)自動(dòng)往上級(jí)繼承,并且混合模式是針對(duì)背景顏色的過濾,所以body和html需要有背景顏色才行。

          h1 {
             mix-blend-mode: color-dodge;
             font-family: yahei;
             font-size: 5rem;
             text-align: center;
             margin: 0; 
             padding: 20vh 200px;
             color: #D1956C;
           }
          
           html,
           body {
             margin: 0;
             background-color: white;
           }
          
           body {
          
             background-image: url(https://images.unsplash.com/photo-1505567745926-ba89000d255a?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3302&q=80);
             background-repeat: no-repeat;
             background-size: cover;
             min-height: 100vh;
             overflow: hidden;
           }

          換換背景圖和h1標(biāo)簽的字體顏色就可以弄出各種不同的特效了。

          知識(shí)總結(jié)

          mix-blend-mode — CSS 屬性描述了元素的內(nèi)容應(yīng)該與元素的直系父元素的內(nèi)容和元素的背景如何混合。

          8. 瀑布流布局

          CSS Grid和Flexbox讓我們可以更簡(jiǎn)便,更容易和更快的實(shí)現(xiàn)各式各樣的響應(yīng)布局,并且讓我們快捷方便的在布局中實(shí)現(xiàn)橫向劇中和豎向劇中。但是回想一下以前是頗為困難的。

          雖然這些新出的布局方式可以讓我們解決很多以前的布局難題,但是像瀑布流布局這種,就無法用它們簡(jiǎn)單來實(shí)現(xiàn)了。因?yàn)槠俨剂饕话銇碚f都是寬度一致,但是高度是根據(jù)圖片自適應(yīng)的。并且圖片的位置也是根據(jù)在上方圖片的位置而定的。

          其實(shí)最好實(shí)現(xiàn)瀑布流布局的辦法就是用CSS的列屬性套件,這套屬性大多數(shù)都是用于排版雜志中的文本列。但是用于布局瀑布流也是特別實(shí)用哦。因?yàn)橐郧靶枰獙?shí)現(xiàn)瀑布流,就必須有JavaScript的輔助來計(jì)算圖片高度然后決定每張圖片的定位和位置,所以現(xiàn)在有了列屬性就可以使用純CSS實(shí)現(xiàn)了。

          實(shí)現(xiàn)原理:

          實(shí)現(xiàn)這個(gè)布局,首選我們需要把所有的內(nèi)容先包裹在一個(gè)div元素里面,然后給這個(gè)元素column-width和column-gap屬性。

          然后,為了防止任何元素被分割到兩個(gè)列之間,將column-break-inside: avoid添加到各個(gè)元素中。

          神奇的效果就完美實(shí)現(xiàn)了,零JavaScript。

          我們來看看代碼:

          <div class="columns">
            <figure>
              <img src="https://source.unsplash.com/random?city" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?night" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?developer" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?building" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?water" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?coding" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?stars" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?forest" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?girls" alt="" />
            </figure>
            <figure>
              <img src="https://source.unsplash.com/random?working" alt="" />
            </figure>
          </div>
          .columns {
            column-width: 320px;
            column-gap: 15px;
            width: 90%;
            max-width: 1100px;
            margin: 50px auto;
          }
          .columns figure {
            display: inline-block;
            box-shadow: 0 1px 2px rgba(34, 25, 25, 0.4);
            column-break-inside: avoid;
            border-radius: 8px;
          }
          .columns figure img {
            width: 100%;
            height: auto;
            margin-bottom: 15px;
            border-radius: 8px;
          }

          知識(shí)總結(jié)

          column-width — CSS屬性建議一個(gè)最佳列寬。 列寬是在添加另一列之前列將成為最大寬度。 column-width — 該 CSS 屬性用來設(shè)置元素列之間的間隔 (gutter) 大小。 column-break-inside — 設(shè)置或檢索對(duì)象內(nèi)部是否斷。

          總結(jié)

          我希望這8個(gè)前端小技巧和特效對(duì)大家有幫助,或多或少有吸收一點(diǎn)新的前端知識(shí)。這篇文章提到的內(nèi)容,其實(shí)很多都是值得深挖和學(xué)習(xí)的。有一些例子我做的比較簡(jiǎn)單,但是其實(shí)是有無限的可能性。喜歡前端的童鞋們,讓我們繼續(xù)在前端領(lǐng)域中一起深挖,讓我們的熱愛無限的燃燒起來吧!



          在最后我想給大家講一下我對(duì)前端的熱愛和態(tài)度。

          回想前端這幾年,發(fā)展真的是突飛猛進(jìn),從前端排版,HTML5+CSS3做H5頁面,到前端組件化,各種UI框架滿天飛。

          一開始我隨著熱潮用起了UI框架,起初覺得特別方便,來一個(gè)新的項(xiàng)目就直接上一個(gè)UI框架,研發(fā)速度也非常快。但是久而久之就覺得前端開發(fā)變成了處理數(shù)據(jù),對(duì)接接口,實(shí)現(xiàn)交互。

          某天在閱覽國外的一些前端設(shè)計(jì)和框架的時(shí)候,我突然發(fā)現(xiàn)國內(nèi)多數(shù)的前端開發(fā)者都不再怎么使用CSS3做出一些很好玩的布局和特效了?,F(xiàn)在市面上的系統(tǒng)和頁面都是千篇一律,普遍都是用一些知名的UI框架搭建系統(tǒng)和APP,基本自己動(dòng)手去排版已經(jīng)少之又少。前端已不再是以前的前端,缺少了靈魂。

          但是我們回想一下,我們剛剛開始學(xué)習(xí)前端的時(shí)候,讓我們最有成就感,覺得前端特別有意思的那種感覺。就是那種讓我們覺得神乎奇跡,不可思議的布局,特效和交互。那種感覺自己成功實(shí)現(xiàn)了很優(yōu)美,很炫酷的頁面和特效的感覺,讓我們?cè)阶鲈絹韯牛阶鲈绞桥d奮。

          但是在某些公司,研發(fā)部都是要求快速開發(fā),UI設(shè)計(jì)部門也是受到時(shí)間的控制和限制,所以逐步走進(jìn)了UI框架的限制之中。都是圍繞這一些UI框架來設(shè)計(jì)和開發(fā)系統(tǒng)和應(yīng)用。

          作為一名熱愛前端的開發(fā)者,我還是堅(jiān)持在絕大多數(shù)的項(xiàng)目中,自己排版和實(shí)現(xiàn)頁面交互特效。然后使用UI框架作為輔助,主要是用來減輕一些小組件和常用組建的快速實(shí)現(xiàn)。(可以說我是比較追求完美和外貌協(xié)會(huì)的程序員 )


          作者:三鉆
          鏈接:https://juejin.im/post/5e8fc7826fb9a03c677e68d9
          來源:掘金
          著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。


          主站蜘蛛池模板: 国产精品无码亚洲一区二区三区| 国产精品一区在线观看你懂的| 久久久99精品一区二区| 国产伦精品一区二区三区视频金莲| 精品久久久中文字幕一区| 亚洲一区精品视频在线 | 精品视频一区二区三区| 红桃AV一区二区三区在线无码AV| 国产伦一区二区三区高清 | 麻豆果冻传媒2021精品传媒一区下载 | 日本一区二区三区在线网| 国产伦理一区二区| 亚洲色无码一区二区三区| 国产一区二区三区免费在线观看| 插我一区二区在线观看| av在线亚洲欧洲日产一区二区| 中文字幕人妻AV一区二区| 中文字幕日韩一区| 日韩av无码一区二区三区| 老熟妇仑乱一区二区视頻| 国产成人欧美一区二区三区| A国产一区二区免费入口 | 国产午夜精品免费一区二区三区| 精品视频一区二区观看| 精品在线一区二区三区| 国产成人精品一区在线 | 精品视频在线观看一区二区| 国产成人一区二区三区精品久久| 色狠狠色狠狠综合一区| 精品国产高清自在线一区二区三区| 91久久精品无码一区二区毛片 | 日本一区二区在线播放| 性色AV一区二区三区天美传媒| 国产嫖妓一区二区三区无码| 女人和拘做受全程看视频日本综合a一区二区视频 | 精品人妻一区二区三区浪潮在线| 亚洲av色香蕉一区二区三区 | 亚洲a∨无码一区二区| 国产一区视频在线免费观看| 中文字幕一区二区免费| 精品香蕉一区二区三区|