当前位置: 首页 > news >正文

CSS 多按钮根据半圆弧度排列

需求

多个按钮根据弧度,延边均匀排列。

实现

HTML

  • 分两级;
  • 第一级,外层定义按钮的 compose-container 宽度;
  • 第二级,按钮集合,使用方法 styleBtn(index),根据索引计算;
<div class="compose-container flex-style-01"><div class="btn" v-for="(item, index) in btnNum" :key="index" :style="styleBtn(index)">{{ index }}</div>
</div>

CSS

  • compose-container:容器样式,使用 flex 布局,且设置 width
  • btn:按钮样式,无需设置 display
.compose-container {display: flex;width: 600px;height: 80px;margin: 50px 0;background: #409eff;.btn {width: 50px;height: 50px;line-height: 50px;background: #aec0d1;border-radius: 50%;text-align: center;vertical-align: middle;}
}

JavaScript

  • 如下方法是计算按钮 translateY 值;
  • 代码第 2 行,传参是按钮的索引值,从 0 开始;
  • 代码第 4 行,按钮的总个数;
  • 代码第 6 行,按钮垂直高度间隔,单位 px
  • 代码第 8 行,整体抬高,也可不设置;
  • 代码第 12 - 27 行,区分偶数和奇数,中心点计算;
  • 代码第 29 行,设置属性 translateY
// 按钮弧度高度
function styleBtn(index) {// 总个数const totalNum = 8;// 间隔高度,单位 pxconst gap = 8;// 整体抬高const raiseHeight = 28;let translateY = ''if(totalNum%2 === 0) { // 偶数const centerIdx = totalNum / 2;const n = centerIdx - index;// > 0 左侧,<= 右侧translateY = (n > 0) ? n * gap : (Math.abs(n)+1) * gap;}else { // 奇数const centerIdx = Math.floor(totalNum / 2);const n = centerIdx - index;if(centerIdx === index) {// 中心点translateY = gap;}else {translateY = (Math.abs(n)+1) * gap;}}return { transform: `translateY(${(translateY - raiseHeight)}px)` }
}

效果

偶数

  • 按钮个数为偶数,中间两个按钮在同一条水平线上;
  • 样式一,justify-content: center,根据按钮的 margin 属性设置间隔;
  • 样式二:justify-content: space-between,两端对齐,按钮之间的空间平均分配;
  • 样式三:justify-content: space-around,按钮两侧空间相等,但首尾按钮与容器边缘的空间是按钮之间空间的一半;
  • 样式四:justify-content: space-evenly,所有间距(包括首尾按钮与容器边缘的间距)都相等;

在这里插入图片描述

奇数

  • 按钮个数为奇数,中间一个按钮最高,其它左右两侧在同一条水平线上;
  • justify-content 设置同上;

在这里插入图片描述

完整代码

<template><div><h4>样式一:justify-content: center, 且设置btn margin </h4><div class="compose-container flex-style-01"><div class="btn" v-for="(item, index) in btnNum" :key="index" :style="styleBtn(index)">{{ index }}</div></div><h4>样式二:justify-content: space-between</h4><div class="compose-container flex-style-02"><div class="btn" v-for="(item, index) in btnNum" :key="index" :style="styleBtn(index)">{{ index }}</div></div><h4>样式三:justify-content: space-around</h4><div class="compose-container flex-style-03"><div class="btn" v-for="(item, index) in btnNum" :key="index" :style="styleBtn(index)">{{ index }}</div></div><h4>样式四:justify-content: space-evenly</h4><div class="compose-container flex-style-04"><div class="btn" v-for="(item, index) in btnNum" :key="index" :style="styleBtn(index)">{{ index }}</div></div></div>
</template><script setup>
import { ref } from 'vue';const btnNum = ref(7);// 按钮弧度高度
function styleBtn(index) {// 总个数const totalNum = btnNum.value;// 间隔高度,单位 pxconst gap = 8;// 整体抬高const raiseHeight = 28;let translateY = ''if(totalNum%2 === 0) { // 偶数const centerIdx = totalNum / 2;const n = centerIdx - index;// > 0 左侧,<= 右侧translateY = (n > 0) ? n * gap : (Math.abs(n)+1) * gap;}else { // 奇数const centerIdx = Math.floor(totalNum / 2);const n = centerIdx - index;if(centerIdx === index) {// 中心点translateY = gap;}else {translateY = (Math.abs(n)+1) * gap;}}return { transform: `translateY(${(translateY - raiseHeight)}px)` }
}
</script><style lang="scss" scoped>
.compose-container {display: flex;width: 600px;height: 80px;margin: 50px 0;background: #409eff;.btn {width: 50px;height: 50px;line-height: 50px;background: #aec0d1;border-radius: 50%;text-align: center;vertical-align: middle;}
}
.flex-style-01 {justify-content: center;.btn {margin: 0 6px;}
}
.flex-style-02 {justify-content: space-between;
}
.flex-style-03 {justify-content: space-around;
}
.flex-style-04 {justify-content: space-evenly;
}
</style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue - 关于v-wave 波浪动画组件
  • 【Dash】使用 dash_mantine_components 创建图表
  • 动态规划求解最小斯坦纳树(证了一天两夜)
  • 1998年考研真题英语二(204)阅读理解翻译
  • C语言宠物系统
  • CnosDB 元数据集群 – 分布式时序数据库的大脑
  • C++(week15): C++提高:(五)Redis数据库
  • 将PPT中的元素保存为高清图片
  • 看图学sql之sql的执行顺序
  • 分布式接口文档聚合,Solon 是怎么做的?
  • Qt编程技巧小知识点(2)GPIB缓存区数据读取
  • 快递批量查询有什么软件安利一下
  • 关于手机中的红外遥控
  • leetcode hot 100(1)
  • 多尺度病理图像纹理特征作为肺腺癌预后预测的新指标|文献精读·24-08-09
  • [Vue CLI 3] 配置解析之 css.extract
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • css的样式优先级
  • JAVA多线程机制解析-volatilesynchronized
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Mysql数据库的条件查询语句
  • Netty 4.1 源代码学习:线程模型
  • python3 使用 asyncio 代替线程
  • python学习笔记-类对象的信息
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 分享几个不错的工具
  • 记一次用 NodeJs 实现模拟登录的思路
  • 面试遇到的一些题
  • 因为阿里,他们成了“杭漂”
  • 在Docker Swarm上部署Apache Storm:第1部分
  • hi-nginx-1.3.4编译安装
  • "无招胜有招"nbsp;史上最全的互…
  • #07【面试问题整理】嵌入式软件工程师
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (k8s中)docker netty OOM问题记录
  • (TOJ2804)Even? Odd?
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (算法二)滑动窗口
  • (学习日记)2024.01.19
  • (一)基于IDEA的JAVA基础10
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)甲方乙方——赵民谈找工作
  • (轉貼) UML中文FAQ (OO) (UML)
  • *2 echo、printf、mkdir命令的应用
  • *上位机的定义
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件_Git:.gitignore
  • .Net OpenCVSharp生成灰度图和二值图
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net组件程序设计之线程、并发管理(一)
  • .sh
  • @staticmethod和@classmethod的作用与区别
  • @Transactional 竟也能解决分布式事务?