最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于React封裝一個(gè)層次模糊效果的容器組件

 更新時(shí)間:2024年03月21日 11:19:42   作者:慕仲卿  
這篇文章主要為大家詳細(xì)介紹了如何基于React封裝一個(gè)層次模糊效果的容器組件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

繪制H5頁(yè)面時(shí),模糊效果(或稱為毛玻璃效果)被廣泛用于增強(qiáng)用戶界面的美觀性和層次感。這種效果不僅可以吸引用戶的注意,還能提供視覺(jué)上的分隔,而不完全阻擋背后的內(nèi)容?;诖?,本文封裝一個(gè)React組件,該組件能夠在容器上實(shí)現(xiàn)層次化的模糊效果,使得開(kāi)發(fā)者可以輕松地在其項(xiàng)目中應(yīng)用并自定義這種設(shè)計(jì)風(fēng)格。

先放效果圖:

需求分析

該組件需要滿足以下幾個(gè)基本需求:

  • 可自定義模糊層數(shù):組件應(yīng)允許用戶設(shè)置模糊效果的層數(shù),以便于調(diào)整模糊效果的精度和深度。
  • 可自定義模糊強(qiáng)度:用戶應(yīng)能夠設(shè)置模糊的最大強(qiáng)度,以控制最外層的模糊程度。
  • 可自定義容器尺寸和形狀:包括容器的高度和邊框圓角半徑。
  • 自定義類名:允許用戶添加自定義類名,以便于在外部CSS文件中進(jìn)一步樣式定制。

構(gòu)建過(guò)程

基于上述需求,我們?cè)O(shè)計(jì)了HcBlurBox組件。下面是構(gòu)建此組件的具體步驟:

1. 設(shè)置組件接收的Props

首先,我們定義組件能夠接收的props,包括:

  • accuracy(模糊層數(shù))
  • radius(邊框圓角半徑)
  • height(容器高度)
  • maxBlur(最大模糊值)
  • ratio(高度比率)
  • className(自定義類名)

2. 計(jì)算模糊層樣式

對(duì)于每一個(gè)模糊層,我們根據(jù)傳入的accuracy、maxBlurratio來(lái)動(dòng)態(tài)計(jì)算其高度和模糊度。使用Array(accuracy).fill(0).map來(lái)創(chuàng)建指定數(shù)量的模糊層,并為每層應(yīng)用以下樣式規(guī)則:

  • 高度(height):根據(jù)ratioaccuracy計(jì)算得出的每層的高度百分比。
  • 模糊效果(backdropFilter):使用CSS的blur()函數(shù),根據(jù)層的順序和maxBlur來(lái)動(dòng)態(tài)計(jì)算模糊度。

3. 條件渲染

為了確保組件的靈活性和健壯性,我們?cè)跊](méi)有提供height屬性時(shí)讓組件返回null,以避免渲染不必要的DOM元素。

4. 應(yīng)用樣式和自定義類名

最后,我們將計(jì)算得到的樣式應(yīng)用到每個(gè)模糊層上,并通過(guò)${className}模板字符串將用戶提供的自定義類名添加到容器div上,以實(shí)現(xiàn)進(jìn)一步的樣式自定義。

完整代碼展示

import React from "react";
import "./index.less";

/**
 * 創(chuàng)建一個(gè)具有層次模糊效果的容器組件。
 *
 * @component
 * @param {Object} props - 組件接收的props。
 * @param {number} [props.accuracy=2] - 精度,決定模糊層的數(shù)量。
 * @param {number} [props.radius=5] - 模糊層的邊框圓角半徑。
 * @param {number} props.height - 容器的高度,必須提供。
 * @param {number} [props.maxBlur=12.5] - 最大模糊值。
 * @param {number} [props.ratio=100] - 高度比率,用于計(jì)算每個(gè)模糊層的高度百分比。
 * @param {string} [props.className=''] - 容器的自定義類名。
 * @returns {ReactElement|null} 返回一個(gè)模糊效果的React組件,如果沒(méi)有提供高度,則返回null。
 *
 * @example
 * <HcBlurBox height={100} accuracy={3} maxBlur={15} className="custom-class" />
 */
const HcBlurBox = (props) => {
  const { 
    accuracy = 2, 
    radius = 5, 
    height, 
    maxBlur = 12.5, 
    ratio = 100,
    className = '',
  } = props;

  // 如果沒(méi)有提供高度,則不渲染組件
  if(!height) return null;

  return (
    <div className={`hc-blur-box-container ${className}`}>
      {Array(accuracy).fill(0).map(
        (v, i) => {
          const step = i + 1;
          const _height = ratio - (100 / accuracy) * i; // 計(jì)算每個(gè)模糊層的高度百分比
          const blur = `blur(${(maxBlur / accuracy) * step}px)`; // 根據(jù)精度和步驟計(jì)算模糊效果
          // 如果計(jì)算得到的高度小于2倍的height,則不渲染該層
          if (2 * radius > _height * height / 100) return null;
          return (
            <div
              key={i} // 添加key以滿足React列表渲染的要求
              className="hc-blur-box"
              style={{
                height: `${_height}%`, // 設(shè)置模糊層的高度
                backdropFilter: blur, // 應(yīng)用模糊效果
                borderBottomLeftRadius: radius, // 設(shè)置邊框圓角半徑
                borderBottomRightRadius: radius,
              }}
            />
          )
        }
      )}
    </div>
  )
}

export default HcBlurBox;
.hc-blur-box-container {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;

  .hc-blur-box {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    backdrop-filter: blur(2.5px);
    mask: linear-gradient(to top, rgb(0, 0, 0) 50%, rgba(0, 0, 0, 0.8) 70%, rgba(0, 0, 0, 0) 100%);
    background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.64) 100%);
    z-index: 1;
    border: none ;
  }
}

通過(guò)HcBlurBox組件,開(kāi)發(fā)者可以輕松在其React項(xiàng)目中實(shí)現(xiàn)具有層次模糊效果的容器,大大豐富了界面的視覺(jué)效果和用戶體驗(yàn)。此組件的靈活性和可定制性,使其能夠適應(yīng)各種設(shè)計(jì)需求。

兼容方案

上述代碼雖然能夠完成最終效果,但是有的瀏覽器不支持mask css屬性,這個(gè)時(shí)候,只需要通過(guò)絕對(duì)定位和父容器等大的div去模擬mask的效果就可以了。以下的代碼是兼容組件,當(dāng)然你喜歡的話可以將兩個(gè)組件融合成一個(gè)。

兼容組件

import React from "react";
import "./index.less"; // 引入樣式文件

const DoubleLayeredDiv = () => {
  return (
    <div className="container">
      {[...Array(10).keys()].map((index) => (
        <div
          key={index}
          className={`background-image img${index + 1}`}
          style={{
              background-position-y: -10*(index+1); 
              filter: `blur(${index+1}px)`; 
              bottom: -10*(index+1);
          }}
        ></div>
      ))}
      <div className="gradient-overlay"></div>
      <div className="content">Your Content Here</div>
    </div>
  );
};

export default DoubleLayeredDiv;

對(duì)應(yīng)的樣式文件 (index.less)

.container {
  margin: auto;
  margin-top: 200px;
  position: relative;
  width: 400px;
  height: 600px;
  overflow: hidden;
  border-radius: 30px;
  box-shadow: 0 0 20px 0px;
  background-image: url('./page1.jpg');
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
}
.background-image {
  width: 100%;
  height: 600px;
  background-image: url('./page1.jpg');
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
  position: absolute;
  left: 0;
  z-index: 1;
}

.gradient-overlay {
  width: 100%;
  height: 500px;
  background-image: linear-gradient(to top, black, transparent);
  position: absolute;
  bottom: 0;
  left: 0;
  z-index: 2;
}
.content {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 3;
  display: flex;
  justify-content: center;
  align-items: center;
  color: white;
  font-size: 20px;
}

兼容backdrop-filter

雖然現(xiàn)代瀏覽器普遍支持CSS的backdrop-filter屬性來(lái)實(shí)現(xiàn)模糊效果,但是并非所有瀏覽器都支持(特別是舊版瀏覽器)。對(duì)于不支持backdrop-filter屬性的瀏覽器,我們可以采取以下兼容性方案:

  • 使用多層圖片疊加:如上述組件所示,通過(guò)創(chuàng)建多個(gè)帶有不同模糊度的圖層(使用filter: blur()),我們可以在不支持backdrop-filter的環(huán)境下模擬出類似的視覺(jué)效果。
  • 使用靜態(tài)模糊背景圖片:為了進(jìn)一步兼容那些連filter屬性也不支持的古老瀏覽器,可以預(yù)先生成一張模糊的背景圖片,并在需要時(shí)作為備選方案使用。
  • 優(yōu)雅降級(jí):對(duì)于極端的兼容性需求,可以考慮在不支持模糊效果的瀏覽器中簡(jiǎn)單隱藏這些效果,保留基本的內(nèi)容展示。這可以通過(guò)JavaScript檢測(cè)特定CSS屬性的支持情況來(lái)實(shí)現(xiàn)。

總之,雖然完全的跨瀏覽器兼容性往往難以實(shí)現(xiàn),但通過(guò)巧妙地利用CSS和JavaScript,仍然可以為大多數(shù)用戶提供接近設(shè)計(jì)意圖的體驗(yàn),同時(shí)為那些使用舊瀏覽器的用戶提供可接受的備選方案。

到此這篇關(guān)于基于React封裝一個(gè)層次模糊效果的容器組件的文章就介紹到這了,更多相關(guān)React層次模糊容器組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React JSX基礎(chǔ)語(yǔ)法教程示例

    React JSX基礎(chǔ)語(yǔ)法教程示例

    這篇文章主要為大家介紹了React JSX基礎(chǔ)語(yǔ)法教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • React onClick/onChange傳參(bind綁定)問(wèn)題

    React onClick/onChange傳參(bind綁定)問(wèn)題

    這篇文章主要介紹了React onClick/onChange傳參(bind綁定)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • React如何使用localStorage及實(shí)現(xiàn)刪除筆記操作過(guò)程

    React如何使用localStorage及實(shí)現(xiàn)刪除筆記操作過(guò)程

    這篇文章主要介紹了React如何使用localStorage及實(shí)現(xiàn)刪除筆記操作過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-12-12
  • React hooks使用方法全面匯總

    React hooks使用方法全面匯總

    這篇文章主要介紹了react hooks實(shí)現(xiàn)原理,文中給大家介紹了useState dispatch函數(shù)如何與其使用的Function Component進(jìn)行綁定,實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • 一文詳解React組件API

    一文詳解React組件API

    這篇文章主要介紹了React的組件API,及組件API的用法詳解,文中有詳細(xì)的代碼示例,對(duì)學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的同學(xué)可以閱讀本文
    2023-04-04
  • React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實(shí)例分析

    React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實(shí)例分析

    這篇文章主要介紹了React Native中ScrollView組件輪播圖與ListView渲染列表組件用法,結(jié)合實(shí)例形式詳細(xì)分析了ScrollView組件輪播圖與ListView渲染列表組件具體功能、使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • React Hooks中模擬Vue生命周期函數(shù)的指南

    React Hooks中模擬Vue生命周期函數(shù)的指南

    React Hooks 提供了一種在函數(shù)組件中使用狀態(tài)和其他 React 特性的方式,而不需要編寫類組件,Vue 的生命周期函數(shù)和 React Hooks 之間有一定的對(duì)應(yīng)關(guān)系,本文給大家介紹了React Hooks中模擬Vue生命周期函數(shù)的指南,需要的朋友可以參考下
    2024-10-10
  • react清空ant.design中表單內(nèi)容的方法實(shí)現(xiàn)

    react清空ant.design中表單內(nèi)容的方法實(shí)現(xiàn)

    本文主要介紹了react清空ant.design中表單內(nèi)容的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • React中使用Echarts無(wú)法顯示title、tooltip等組件的解決方案

    React中使用Echarts無(wú)法顯示title、tooltip等組件的解決方案

    這篇文章主要介紹了React中使用Echarts無(wú)法顯示title、tooltip等組件的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • react裝飾器與高階組件及簡(jiǎn)單樣式修改的操作詳解

    react裝飾器與高階組件及簡(jiǎn)單樣式修改的操作詳解

    這篇文章主要介紹了react裝飾器與高階組件及簡(jiǎn)單樣式修改的操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09

最新評(píng)論

锦屏县| 阜新市| 天峨县| 易门县| 岗巴县| 庄浪县| 靖州| 五河县| 东海县| 镶黄旗| 高青县| 英山县| 甘洛县| 曲水县| 如皋市| 衢州市| 达日县| 涿州市| 英超| 成安县| 北京市| 文水县| 民乐县| 正定县| 四川省| 崇明县| 汉中市| 裕民县| 青铜峡市| 静乐县| 美姑县| 铁岭县| 毕节市| 柘城县| 华坪县| 辽阳市| 蓬莱市| 深圳市| 延安市| 时尚| 桦川县|