CSS 实战录: 双栏、四等分、不等间距、自适应...

news2024/10/16 17:22:03

引言

一个当初困扰我许久的设计稿还原问题, 故在此做个简单记录!! 设计稿布局大概如下图所示

  • 整体分为左右两部分
  • 同时划分了模块 A B C D
  • A B C 之间的间距为 24px, C D 之间的间距为 64px
  • 整体宽度 100% 自适应铺满, 并且 A B C D 宽度保持一致

image

那么问题来了, 假设给出下面 DOM 结构, 要如何实现上面设计稿要求的自适应等宽布局呢?

<div class="wrapper">
  <div class="left">
    <div class="group">A</div>
    <div class="group">B</div>
    <div class="group">C</div>
  </div>
  <div class="right">
    <div class="group">D</div>
  </div>
</div>

当然如果你心里已经有答案了, 欢迎在评论区给出答案, 大家一起探讨探讨!! 如果没有可以看看我这边的一个实现思路…

一、3:1 左右布局

首先我们先通过 flex 布局, 实现 LeftRight, 按照 3: 1 进行一个等比例布局, 需要实现的布局效果如下图所示

image

下面是实现代码

<style>
  .wrapper {
    display: flex;
  }

  .left {
    flex: 3;

    height: 80px;
    padding: 10px;
    background: #ffa39e;
  }

  .right {
    flex: 1;

    height: 80px;
    padding: 10px;
    background: #ffd591;
  }
  
</style>
<div class="wrapper">
  <div class="left">
    Left
  </div>
  <div class="right">
    Right
  </div>
</div>

二、四等分布局

上面完成 LeftRight 的一个布局, 下面我们将上面的 DOM 结构进行一个调整

  • Left 部分, 增加三个子元素(div), 这三个子元素通过 flex 布局实现 1:1:1 的一个等宽布局
  • Right 部分, 增加一个子元素(div)

需要完成的效果如下图:

image

上图布局的一个完整代码如下:

<style>
  .group {
    height: 80px;
    padding: 10px;
  }

  .wrapper {
    display: flex;
  }

  .left {
    flex: 3;
    display: flex;

    .group {
      flex: 1;

      &:nth-child(1) {
        background: #95de64;
      }
      &:nth-child(2) {
        background: #5cdbd3;
      }
      &:nth-child(3) {
        background: #69b1ff;
      }
    }
  }

  .right {
    flex: 1;

    .group {
      background: #ffd591;
    }
  }
  
</style>

<div class="wrapper">
  <div class="left">
    <div class="group">A</div>
    <div class="group">B</div>
    <div class="group">C</div>
  </div>
  <div class="right">
    <div class="group">D</div>
  </div>
</div>

三、间距设置(左侧部分)

下面我们先给 A B C 之间设置一个 24px 的间距, 实现的效果如下:

image

相关代码调整如下, 其中 :not(:last-child) 选择器表示匹配 非最后一个元素

<style>
  ...

  .left {
    flex: 3;
    display: flex;

    .group {
      flex: 1;

+     &:not(:last-child) {
+       margin-right: 24px;
+     }

      &:nth-child(1) {
        background: #95de64;
      }
      &:nth-child(2) {
        background: #5cdbd3;
      }
      &:nth-child(3) {
        background: #69b1ff;
      }
    }
  }
  ...
</style>

四、调整比例

到这里, 由于 A B C 设置了间距, 将导致它们宽度都等量缩小了, 那么变相的 D 实际宽度会比 A B C 略大, 如下图所示:

image

这里我们如果要想保证 A B C D 之间宽度是一致的, 那么上面 A B C 等量缩小了多少, D 只要也等量缩小即可

那么问题来了, A B C 等量缩小了多少呢? 其实也很好计算, A B C 之间多了 24 * 2 也就是 48 的间距, 那么对应对应的 A B C 就应该等量缩小了 (24 * 2) / 3 也就是 16px 的宽度

既然如此, 下面我们也只需要让 D 也等量缩小 16px 即可, 这里可通过设置 .right .groupmargin-left 来实现, 代码调整如下:

<style>
  ...
  .right {
    flex: 1;

    .group {
+     margin-left: 16px;
      background: #ffd591;
    }
  }
  ...
</style>
....

修改后的效果图有:

image

五、调整间距

最后我们调整下, DC 之间的间距, 设计稿上间距是 64, 在上文中为了保证 A B C D 之间宽度一致, 我们已经设置了 16px 的间距, 接下来只需要把剩余的 64 - 16 也就是 48 的间距补充上去就行, 下面是对应的代码变更:

<style>
  ...
  .right {
    flex: 1;
+   margin-left: 48px;
    
    .group {
      margin-left: 16px;
      background: #ffd591;
    }
  }
  ...
</style>
...

修改后的效果如下:

image

六、完整代码

下面是本次演示的一个完整代码, 如果需要可以直接拷贝到编辑器进行调试

<style>
  .group {
    height: 80px;
    padding: 10px;
  }

  .wrapper {
    display: flex;
  }

  .left {
    flex: 3;
    display: flex;

    .group {
      flex: 1;

      &:not(:last-child) {
        margin-right: 24px;
      }

      &:nth-child(1) {
        background: #95de64;
      }
      &:nth-child(2) {
        background: #5cdbd3;
      }
      &:nth-child(3) {
        background: #69b1ff;
      }
    }
  }

  .right {
    flex: 1;
    margin-left: 48px;
    
    .group {
      margin-left: 16px;
      background: #ffd591;
    }
  }
</style>

<div class="wrapper">
  <div class="left">
    <div class="group">A</div>
    <div class="group">B</div>
    <div class="group">C</div>
  </div>
  <div class="right">
    <div class="group">D</div>
  </div>
</div>

七、补充: 剩余空间计算规则

Flex 计算 可用空间 的规则: Flex 容器的 内容宽度 减去所有子项的水平 外边距内边距边框

也行你会有疑惑, 上面例子中我们是通过将 .right .groupmargin-left 设置为 16px 来实现 A B C D 等宽效果, 那么这个实现方案是否可以改为为 .right 设置 padding-right 来实现呢?

这里答案是否定的, 这里主要原因还是在 Flex 在计算 可用空间 时是要扣除所有子项的水平 外边距内边距边框, 所以如果我们为 .right 设置了 padding-right 那么可用空间就会减少, A B C 也会对应的缩小…

具体的我这边就不做演示了, 好奇的朋友可以自己做个尝试, 下面简单验证下 Flex 在计算 可用空间 时, 对子项设置了 padding 情况下的一个表现, 如下代码: right 存在 padding 那么, 那么在计算剩余可用空间时, 就不应该包含 padding

<style>
  .wrapper {
    display: flex;
  }

  .left {
    flex: 1;
    background: #5cdbd3;
  }

  .right {
    flex: 1;

    padding: 10px;
    background: #ffd591;
  }
  
</style>

<div class="wrapper">
  <div class="left">
    Left
  </div>
  <div class="right">
    Right
  </div>
</div>

上面例子的一个效果图:

image

八、参考文献

  • CSS_Flexible_Box_Layout

  • How to get flexbox to include padding in calculations?


image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第473题火柴拼正方形

题目&#xff1a; 题解&#xff1a; class Solution:def makesquare(self, matchsticks: List[int]) -> bool:totalLen sum(matchsticks)if totalLen % 4:return FalsetLen totalLen // 4dp [-1] * (1 << len(matchsticks))dp[0] 0for s in range(1, len(dp)):fo…

【市场解读】传统到端到端的智驾分水岭已至

参考文献&#xff1a;平安证券《汽车行业深度报告&#xff1a;智驾分水岭已至》 关键词学习 端到端智驾系统end to end “端到端”智驾是一种新的智能驾驶技术&#xff0c;不再依赖于传统的感知原件&#xff0c;而是通过算法、AI、模型架构数据迭代来实现自主学习和思考能力…

MySQL数据库从入门到精通 第1讲 基本概念

MySQL数据库从入门到精通 第1讲 基本概念 小可爱们&#xff0c;接下来我们要学习的知识是数据库相关的知识&#xff0c;从本贴开始&#xff0c;从0基础带大家入门到精通&#xff0c;要加油哦~ 1 前言 1.1 为什么要学习数据库&#xff1f; 那我们首先要搞清楚第一个问题&…

深入了解EasyNVR及EasyNVS,EasyNVR连接到EasyNVS当显示授权超时如何解决?又因为什么原因?

我们先来了解NVR批量管理软件/平台EasyNVR&#xff0c;它深耕市场多年&#xff0c;为用户提供多种协议&#xff0c;兼容多种厂商设备&#xff0c;包括但不限于支持海康&#xff0c;大华&#xff0c;宇视&#xff0c;萤石&#xff0c;天地伟业&#xff0c;华为设备。 NVR录像机…

华为FreeBuds 6i戴久了会耳朵胀痛吗?该怎么办?

华为FreeBuds 6i戴久了&#xff0c;会有耳朵胀痛的感觉吗&#xff1f;其实可能是没选对适合自己的耳塞&#xff0c;给你们分享几个佩戴更舒服的方法&#xff0c;一起来看看~ 首先和大家说说为什么华为FreeBuds 6i戴久了不舒服&#xff0c;一方面是耳塞尺寸不合适&#xff0c;另…

Visual Studio 2022 配置 Boost 库

一、使用预编译版本 尽量不要使用预编译版本&#xff0c;因为可能构建的不完全&#xff0c;还得重新构建&#xff0c;不如一步到位 1. 下载预编译的 Boost 库 下载&#xff1a;Boost C Libraries - Browse /boost-binaries at SourceForge.net 2. 选择 msvc 版本&#xff0…

如何将一张图片分成四份,四宫格?图片分割的8种简单方法

如何将一张图片分成四份&#xff0c;四宫格&#xff1f;在日常的图像处理任务中&#xff0c;我们时常会遇到各种特殊的需求。今天&#xff0c;我就遇到了一项颇具挑战性的任务——在特殊情况下&#xff0c;需要将一张图片精确地分成四份&#xff0c;形成一个标准的四宫格。这项…

SQL第15课——插入数据

介绍利用SQL的insert语句将数据插入表中。 15.1 数据插入 select是最常用的语句&#xff0c;但是还有3个常用的SQL语句&#xff0c;第一个就是insert&#xff0c; insert&#xff1a;用来将行插入&#xff08;或添加&#xff09;到数据库表。插入的3中方式&#xff1a; 1. …

光伏仿真系统在光伏项目开发中有哪些应用场景?

光伏仿真系统在光伏项目开发中的应用场景广泛&#xff0c;涵盖了从项目规划、设计优化到运维管理的全过程。 一、项目规划与选址 1、气象模拟与评估 光伏仿真系统能够基于历史气象数据和先进的预测模型&#xff0c;模拟不同地理位置、不同季节和时间段的光照强度、温度、湿度…

网络层及ip报头

★★★★★默写&#xff1a; A类&#xff1a;0~127 B类&#xff1a;128~191 C类&#xff1a;192~223 A类私网&#xff1a;10.0.0 - 10.255.255.255 B类私网&#xff1a;172.16.0.0 - 172.31.255.255 C类私网&#xff1a;19.168.0.0 - 192.168.255.255 特殊&#xff1a; 0.0.0…

百度智能云新一代云原生产品加速 AI 原生应用落地

本文整理自百度云智峰会 2024 —— 云原生论坛的同名演讲。 今天为大家分享在过去的一年里&#xff0c;围绕 AI 原生的大背景下&#xff0c;百度智能云在基础公有云的计算、存储、网络以及云原生等产品和技术方面所做出的核心工作。 随着大模型所带来的 AI 技术的代际演化&…

用Spring AI 做智能客服,基于私有知识库和RAG技术

Java智能客服系统运用RAG技术提升答疑精准度 基于Spring ai 的 RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;Java智能客服系统能够利用私有知识库中的信息提供更准确的答疑服务。 它的核心思路是&#xff1a; 首先&#xff0c;将客服QA以Word形式导入到系统中&…

python配合yolo分类模型开发分类软件

上一篇文章写了yolo的分类模型的训练&#xff0c;写篇文章基于yolo分类模型开发分类软件。开发环境:pycharm&#xff0c;PySide6 6.6.1 &#xff0c;PySide6-Addons 6.6.1&#xff0c;PySide6-Essentials 6.6.1&#xff0c;torch 2.3.1cu121&#xff0c;torchaudio 2.3.1cu121&…

能源领域下暖通行业现状-研究

基于AI大语言模型的暖通行业能源管理系统构建研究 一、能源管理中的突出问题 1. **能源消耗监测不准确** 现有的监测系统在获取设备实时能耗数据方面存在精度不足的问题&#xff0c;难以准确反映能源的实际使用情况。这使得节能决策缺乏可靠的数据支持&#xff0c;无法精准定位…

Hbase安装及使用

安装 官网下载:Apache HBase – Apache HBase Downloads 启动 先启动zookeeper及hadoop 关系&#xff1a;HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。 再启动start-hbase.sh(/opt/module/hbase-2.2.3/bin&#xf…

大华智能云网关注册管理平台 SQL注入漏洞复现(CNVD-2024-38747)

0x01 产品简介 大华智能云网关注册管理平台是一款专为解决社会面视频资源接入问题而设计的高效、便捷的管理工具,平台凭借其高效接入、灵活部署、安全保障、兼容性和便捷管理等特点,成为了解决社会面视频资源接入问题的优选方案。该平台不仅提高了联网效率,降低了联网成本,…

【计算机网络】详解IP协议网段划分路由转发子网掩码网络号

一、IP功能 IP可以实现主机定位和路由选择&#xff0c;提供一种能力&#xff0c;将数据可靠地从A点跨网络送到B点。数据先根据目的IP在局域网之间进行转发&#xff0c;再在局域网内进行内网转发。 二、IP协议报头 4 位版本号(version)&#xff1a;指定 IP 协议的版本&#xff…

如何轻松使用pip安装Git仓库中的私有Python模块(使用pip和Git仓库发布和安装私有Python模块)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Git模块 📒📝 Git仓库要求🔖 项目目录结构🔖 文件说明📝 编写setup.py📝 配置MANIFEST.in📝 推送代码到Git仓库📝 使用pip安装模块🔖 使用用户名和密码🔖 使用Personal Access Token (PAT)🔖 示例📝 更…

opencv外接矩形cv2.boundingRect和cv2.minAreaRect区别

在OpenCV中&#xff0c;cv2.boundingRect和cv2.minAreaRect是两个用于获取图像中形状边界的函数&#xff0c;但它们在功能和返回结果上有所不同。以下是两者的详细区别&#xff1a; 1. cv2.boundingRect 和 cv2.minAreaRect 功能描述 cv2.boundingRect 主要是用来计算图像轮廓…

企业资产安全之数据防泄密要领

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;随着数据价值的增加&#xff0c;数据泄露的风险也随之上升。从内部员工的无意泄露到外部黑客的恶意攻击&#xff0c;企业数据安全面临着前所未有的挑战。SDC沙盒数据防泄密解决方案&#xff0c;正是为…