首页 > 其他分享 >CSS 实现一个带弧边的区域

CSS 实现一个带弧边的区域

时间:2023-08-21 09:56:39浏览次数:51  
标签:容器 px 弧边 height 区域 2300px CSS size

一、需求描述

在移动端的开发中,经常遇到下图这样的弧边设计

弧边其实有很多方案,但像上图这样的情况更适合用 border 实现,因为这样更方便封装为组件

 

二、初步实现

可以将页面顶部的区域看做一个大圆与页面的交集,基于这个思路就能开发出一个基本的 html 结构

<body>
  <div className='arc-wrapper'>
    <div className='arc-wrapper__inner'>
      <h1>Hello World</h1>
    </div>
  </div>
  <div className="content">
    <h1>Best Title</h1>
    <p>lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
  </div>
</body>

然后完善 CSS,有以下重点:

1. 外层容器通过 border 实现圆形区域,并使用 overflow: hidden 隐藏超出区域的内容;

2. 外层容器需要实现水平居中

3. 内层容器需要使用页面宽度,不能继承父级宽度,并且和外容器底对齐

.arc-wrapper {
  height       : 2300px;
  width        : 2300px;
  padding      : 0;
  border       : none;
  border-radius: 2300px;
  margin-top   : -1980px;
  // 这一行很关键, 用于容器居中
  transform    : translateX(calc((100vw - 2300px) / 2));
  position     : relative;
  overflow     : hidden;

  &::before {
    content      : '';
    display      : block;
    position     : absolute;
    top          : 0;
    left         : 0;
    right        : 0;
    bottom       : 0;
    background   : transparent;
    border-radius: 2300px;
    box-shadow   : 0px -1px 20px 1px rgba(0, 0, 0, 0.1) inset;
    z-index      : 9;
  }

  &__inner {
    background: linear-gradient(137deg, #f6c9b9 0%, #fff7f4 30.3%, #f2d9d0 58.96%);
    position  : absolute;
    height    : 200px;
    width     : 100vw;
    left      : 0;
    bottom    : 0;
    right     : 0;
    margin    : 0 auto;
  }
}

这样一个带弧边的区域就完成了

但这样的实现很死板,无法灵活配置弧度和内容区的高度

而且外容器的水平居中用到复杂的 calc 计算

接下来就完善以上问题

 

三、组件封装

分析上文的 CSS 可以看出,核心数据有两个

1. 外容器的尺寸:影响决定弧边的弧度

2. 内容器的高度:用于确定外容器的 marginTop

所以组件可以这样设计:

type ArcWrapperProps = {
  /** 弧度(圆的直径) */
  size?: number;
  /** 内层容器(内容区域)的高度 */
  height?: number;
  /** 内层容器的自定义 className */
  className?: string;
  /** 外层容器的自定义 className */
  outerClassName?: string;
}

const ArcWrapper: React.FC<ArcWrapperProps> = (props) => {
  const {
    children,
    size = 2300,
    height = 200,
    className,
    outerClassName
  } = props;

  // 动态计算外层容器的样式
  const style: React.CSSProperties = useMemo(() => {
    // 计算水平居中所需的偏移量
    const offest = (window.outerWidth - size) / 2;
    return {
      width: `${size}px`,
      height: `${size}px`,
      borderRadius: `${size}px`,
      transform: `translateX(${offest}px)`,
      marginTop: `-${size - height}px`,
    }
  }, [size, height]);

  return (
    <div
      className={`arc-wrapper ${outerClassName || ''}`}
      style={style}
    >
      <div
        className={`arc-wrapper__inner ${className || ''}`}
        style={{ height }}
      >
        {children}
      </div>
    </div>
  )
};

 

 

标签:容器,px,弧边,height,区域,2300px,CSS,size
From: https://www.cnblogs.com/wisewrong/p/17613820.html

相关文章

  • CSS笔记-盒子模型
    CSS笔记-盒子模型1.盒子模型css开发中,常常会提到一个词叫做“盒子”,这里的盒子专业名词叫“盒子模型(BoxModel)”,这一术语是从来设计和布局时使用的。通俗的讲,所有的HTML元素都可以看做是一个盒子;那么,将页面中所有的元素都设置成一个矩形的盒子后,对页面的布局就可以理解成把不......
  • CSS – Houdini
    介绍简单说这个 Houdini是一系列CSS底层API,它可以让我们扩展CSS,做出一些Polyfill。举一个例子,让大家有个画面。我们可以通过CSS+JS+Canvas语法来自创CSS语法,游览器解析CSS时它会跑我们的JS,而JS用类似Canvas画画的方式去达成最终的渲染效果。这是其中一......
  • 博客园css与目录导航
    默认配置:皮肤:BlueSky页面定制css代码:root{--accent-color:#696969;/*nice*/--primary-colour:#306797;/*<>*/--background-color:white;--background-gray:#f5f5f5;--border-color:#dbdbdb;--code-bg-color:#f8f8f8;--font-color:#1f......
  • CSS实现文字描边效果
    一、介绍最近在一个项目的宣传页中,设计师使用了文字描边效果,之前我确实没有实现过文字的描边效果,然后我在查阅资料后,知道了实现方法。文字描边分为两种:内外双描边和单外描边,也就是指在给文字加上描边效果后,描边的方向是向内外同时占用文字空间还是只向外扩充文字空间的区别。二、......
  • 前端入手超简单之CSS3免费教程
    CSS样式课程目标1.css引入方式(重点)2.css选择器*(重点)3.css盒子模型(重点)4.css3常见效果(重点)5.CSS3常用的规则;级联样式表css介绍引用百度百科css概述层叠样式表其实就是对静态页面进行装饰,但是,特别要注意的点是:通常建议表现形式与页面内容分离(例如:人就是内容,穿着打扮......
  • 现代CSS布局技术:Flexbox和Grid的使用指南和最佳实践
    在现代Web开发中,CSS布局技术变得越来越重要。Flexbox和Grid是两种常用的CSS布局技术,它们可以帮助我们创建灵活、可维护的布局。Flexbox布局Flexbox是一种基于弹性盒子模型的布局技术,它可以让我们更加容易地创建水平或垂直方向上的布局。以下是Flexbox的常见属性:容器属性disp......
  • Taro微信小程序获取Tab页可视区域高度
    前情公司有自己的小程序项目,因公司主要技术栈为react,所以选择了Taro来开发,Taro是京东出品的多端统一开发解决方案,用来开发小程序也相比用原生开发,在开发体验上好很多,而且还能使用成熟的React技术栈。Tab页可视区域高度获取原理图解注:当前tab页未开启沉浸式导航栏模式可操作区......
  • 如何用CSS实现响应式设计并优化用户体验
    在移动设备的时代,网站的响应式设计变得越来越重要。响应式设计的目标是使网站适应不同尺寸和分辨率的设备,并提供最佳的用户体验。本文将介绍如何使用CSS实现响应式设计并优化用户体验。使用媒体查询设置CSS样式媒体查询是CSS3中的一个强大的特性,可以根据不同的媒体类型和设备特......
  • .net5 npoi扩展 获取单元格合并区域
    核心逻辑为通过sheet.GetMergedRegion(i)获取所有的合并区域信息,随后检测单元格是否在此区域内新增对象识别合并单元格的开始、结束位置///<summary>///获取指定行列的数据///</summary>///<paramname="row"></param>///<paramname......
  • 3 CSS组合选择器
    3组合选择器页面元素比较复杂,存在多个嵌套。为了更加灵活选择页面中的元素,CSS中还提供了组合选择器。组合选择器就是将多个基本选择器通过一定的规则连接起来组成一个复杂选择器。后代子代选择器<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><tit......