欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

繪制H5頁(yè)面時(shí),模糊效果(或稱為毛玻璃效果)被廣泛用于增強(qiáng)用戶界面的美觀性和層次感。這種效果不僅可以吸引用戶的注意,還能提供視覺(jué)上的分隔,而不完全阻擋背后的內(nèi)容?;诖耍疚姆庋b一個(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中阻止事件冒泡的問(wèn)題詳析

    React中阻止事件冒泡的問(wèn)題詳析

    這篇文章主要給大家介紹了關(guān)于React中阻止事件冒泡問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用React具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 關(guān)于react中組件通信的幾種方式詳解

    關(guān)于react中組件通信的幾種方式詳解

    這篇文章主要給大家介紹了關(guān)于react中組件通信的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • React 并發(fā)功能體驗(yàn)(前端的并發(fā)模式)

    React 并發(fā)功能體驗(yàn)(前端的并發(fā)模式)

    React 是由 Facebook 軟件工程師 Jordan Walke 創(chuàng)建,React 的第一個(gè)版本在七年前問(wèn)世,現(xiàn)在,F(xiàn)acebook 負(fù)責(zé)維護(hù),本文給大家介紹React 并發(fā)功能體驗(yàn)前端并發(fā)模式的問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • React如何實(shí)現(xiàn)像Vue一樣將css和js寫在同一文件

    React如何實(shí)現(xiàn)像Vue一樣將css和js寫在同一文件

    這篇文章主要介紹了React如何實(shí)現(xiàn)像Vue一樣將css和js寫在同一文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • react?路由權(quán)限動(dòng)態(tài)菜單方案配置react-router-auth-plus

    react?路由權(quán)限動(dòng)態(tài)菜單方案配置react-router-auth-plus

    這篇文章主要為大家介紹了react路由權(quán)限動(dòng)態(tài)菜單方案react-router-auth-plus傻瓜式配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • react 下拉框內(nèi)容回顯的實(shí)現(xiàn)思路

    react 下拉框內(nèi)容回顯的實(shí)現(xiàn)思路

    這篇文章主要介紹了react 下拉框內(nèi)容回顯,實(shí)現(xiàn)思路是通過(guò)將下拉框選項(xiàng)的value和label一起存儲(chǔ)到state中, 初始化表單數(shù)據(jù)時(shí)將faqType對(duì)應(yīng)的label查找出來(lái)并設(shè)置到Form.Item中,最后修改useEffect,需要的朋友可以參考下
    2024-05-05
  • React深入分析useEffect源碼

    React深入分析useEffect源碼

    useEffect是react?v16.8新引入的特性。我們可以把useEffect?hook看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三個(gè)函數(shù)的組合
    2022-11-11
  • React?中的列表渲染要加?key的原因分析

    React?中的列表渲染要加?key的原因分析

    這篇文章主要介紹了React?中的列表渲染為什么要加?key,在?React?中我們經(jīng)常需要渲染列表,比如展示好友列表,文中給大家介紹了列表渲染不提供?key?會(huì)如何,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友一起看看吧
    2022-07-07
  • React?UI組件庫(kù)之快速實(shí)現(xiàn)antd的按需引入和自定義主題

    React?UI組件庫(kù)之快速實(shí)現(xiàn)antd的按需引入和自定義主題

    react入門學(xué)習(xí)告一段路,下面這篇文章主要給大家介紹了關(guān)于React?UI組件庫(kù)之快速實(shí)現(xiàn)antd的按需引入和自定義主題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 詳解React中setState回調(diào)函數(shù)

    詳解React中setState回調(diào)函數(shù)

    這篇文章主要介紹了詳解React中setState回調(diào)函數(shù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論