如何使用 svg 或 css 创建混合直线/曲线截面边界?
P粉920835423
P粉920835423 2023-09-02 11:35:13
[CSS3讨论组]

对于我的应用程序,我正在创建一个具有非标准部分边界的注册页面。您可以在这里看到我试图实现的效果: 这不是一个简单的圆弧——它有两条直线,而且中间还有一个圆弧。

据我所知,实现此类目标的最佳方法是使用 SVG。问题是,白色区域将有一个图像覆盖整个区域。出于演示目的,我将使用浅蓝色。如果您使用带有 background-image 属性的标准 div,则 SVG 的白色不透明,因此您会得到以下结果:

提示稍后阅读 shape-outsideclip-path 属性,这是我尝试过的最新方法(注意我正在使用与样式组件反应):

const LeftContainer = styled(FlexContainer)`
  width: 55%;
  height: 100%;
  background-color: lightblue;
  z-index: 1;
  /* background: linear-gradient(360deg, #FFFFFF 24.95%, rgba(255, 255, 255, 0) 50.95%), url(${process.env.PUBLIC_URL}/TestImage.png); */
`;
const RightContainer = styled(FlexContainer)`
  width: 45%;
  height: 100%;
  /* background-color: ${colors.secondary600}; */
  float: left;
   /* background-image: url(${process.env.PUBLIC_URL}/SignUpBackground.svg); */
  background-repeat: no-repeat;
  background-size: cover;
  background-position: center;
  position: relative;
  z-index: 5;    
  clip-path: url(${process.env.PUBLIC_URL}/SignUpBackground.svg#sidebar);
`;

仍然存在间隙,但不仅如此,SVG 形状的底部三分之一被切掉了:

我能够使左侧容器填充额外空间的唯一方法是使右侧容器位置:绝对,但这会导致我计划的登录表单出现问题添加到右侧(它似乎没有解决切断 svg 底部三分之一的问题)。

有没有办法让右侧容器保持在页面流中,显示 100% 的 svg,并确保左侧容器与右侧容器齐平?

编辑: 这是 SVG 代码:

<svg width="708" height="1056" viewBox="0 0 708 1056" fill="none" xmlns="http://www.w3.org/2000/svg">
<clipPath id="sidebar">
<path d="M144.5 0H799.5V1056H144.5L23.4254 775.169C0.402533 721.768 -5.09917 662.442 7.71089 605.718L144.5 0Z" fill="#16979A"/>
</clipPath>
</svg>

这是到目前为止的 React 组件(如您所见,构建的早期阶段):

const SignUpPage = (props) => {
  return ( 
    <Container>
      <LeftContainer>
        {/* Site logo and marketing copy, promo bubbles to go here. This side should be the one to shrink */}
      </LeftContainer>
      <RightContainer flexDirection="column" justify="center">
        {/* Signup/Login form to go here */}
      </RightContainer>
    </Container>
   );
}

编辑2: 我已尝试实施以下答案中的解决方案,但到目前为止,每个解决方案都至少存在一个问题。从 ccprog 的建议开始,我有点不确定,因为代码似乎与方法的描述不匹配,但我尝试实现它并得到了这个结果:(首先是代码,然后是结果图像)

const Container = styled(FlexContainer)`  
    height: 523px;
    background-image: linear-gradient(360deg, #FFFFFF 24.95%, rgba(255, 255, 255, 0) 50.95%), url(${process.env.PUBLIC_URL}/SignUpImage.jpg);
    background-position: top right 282px;
    background-size: cover;
    background-repeat: no-repeat;
`;

const LeftContainer = styled(FlexContainer)`
    flex-grow: 1;
`
const RightContainer = styled(FlexContainer)`
    width: 354px;
    background-image: url('data:image/svg+xml,<svg viewBox="0 0 708 1056" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M144.5 0H799.5V1056H144.5L23.4254 775.169C0.402533 721.768 -5.09917 662.442 7.71089 605.718L144.5 0Z" fill="%2316979A"/></svg>');
    background-size: 100% 100%;
`

正如您所看到的,这实际上并没有填充屏幕的整个高度,即使在右侧也是如此,并且左侧图像确实被切断了(左侧图像是所有解决方案中的一个问题,因为你会看到的)。

接下来,我尝试实施 Chrwahl 的第二个解决方案。这个有点接近(右侧看起来很棒),但左侧图像有一些问题:

const Container = styled(FlexContainer)`
  width: 100%;
  height: 100vh;
  background-image: url(${process.env.PUBLIC_URL}/SignUpBackground.svg),
  linear-gradient(360deg, #FFFFFF 24.95%, rgba(255, 255, 255, 0) 50.95%), url(${process.env.PUBLIC_URL}/SignUpImage.jpg);
  background-repeat: no-repeat;
  background-position: right, left;
  background-size: contain, cover;
  margin-bottom: 5px;
`;

我不确定它是否出现在该图像中,但屏幕的整个左侧都是空白的,因此即使位置指定为左侧,图像似乎也不是从左边缘开始。 background-size: 40%, 70% 的问题更严重:

P粉920835423
P粉920835423

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号