java等距排列_搞清水平等距排列——九宫格

组合使用 float 和 负margin 就能完成水平等距排列效果,但在我手里貌似不那么听话,总是跑偏不到中间位置,说明我还不那么懂它,那就分析一下问题所在。

水平等距排列效果制作过程

步骤1:创建并初始化测试代码

为了便于观察,给每一个元素添加border或background-color,以此区分嵌套层级

得到如下代码:

-----------html部分-----------------

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

-----------CSS部分-----------------

* {margin: 0; padding: 0;}

ul,li {list-style: none;}

ul {border: 2px blue solid; width: 320px; padding: 10px;}

li {background-color: red; width: 100px; height: 100px;}

2d8cc58b06a9

有9个那么长,大概900px

步骤2:初步实现样式、寻找问题

标签 li :添加 float 、margin

标签 ul :添加 负margin

增加的代码如下:

-----------CSS部分-----------------

ul {margin-left: -10px; overflow: hidden;}

li {float: left; margin-left: 10px;}

2d8cc58b06a9

这个结果不是我想要的

很显然没有得到想要的结果,仔细对比一下发现存在两个问题:

步骤2中的 "标签ul" - margin: -10px; 覆盖了步骤1中 "标签ul" - margin: 0 auto; 造成 "标签li" 无法居中,却被 "标签ul" 拉偏了位置

"标签ul" 本身宽度不足以放下 "带有左边框的3个标签li",所以也没有按九宫格顺序排列

3.解决问题

首先,CSS代码由上至下按序排列,造成下方代码会覆盖上方代码,所以margin无法调序,但可以使用 "标签div" 包裹 "标签ul" ,再去实现居中就容易得多

其次,需要改变 "标签ul" 的最小宽度,使其内部可以在以行内放下 "带有左边框的3个标签li"

代码修改部分

-----------html部分-----------------

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

-----------CSS部分-----------------

.box {width: 320px; margin: 0 auto;} /*增加width、margin*/

ul {width: 330px; /*width: 320px;*/ /*margin: 0 auto;*/} /*修改width,删除margin*/

2d8cc58b06a9

显然问题解决了,但不够美

4.美化:使其更像九宫格

美化一下,使其看起来更像九宫格,增加代码如下

-----------CSS部分-----------------

li {margin: 5px 0 5px 10px;}

2d8cc58b06a9

九宫格出来了

5.几句解释

现在 "标签li" 在 "标签div" 中基本上算是居中了,但左右还是存在缝隙,这是因为所有元素都设有边框,而边框是要占位置的,"标签div" 在屏幕正中央,但 "标签ul" 会将 "标签li" 向右拖移2px,此时去掉 "标签ul" 的边框才是想要的最终节果, "标签li" 水平等距排列并且居中了

- 最后的总结

1.水平等距排列,是需要三层的

最内层负责浮动

中间层负责偏移

最外层作为参照物制造错觉,让最内层看起来是水平等距排列;最后利用合适的方法,将这个整体固定在页面上

2.它们的宽度问题

最内层子元素宽度根据实际需求设定宽度

中间层宽度最小宽度 = 带边框的最内层子元素宽度 * N(根本不用设置宽度)

最外层宽度 = 中间层宽度 - 一个边框宽度

本文章著作权归饥人谷_蛮力拳猫和饥人谷所有,转载须说明来源!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java九宫格数字键盘是一个拼图游戏,玩家需要通过移动数字键来重新排列九宫格中的数字,使其按照从小到大的顺序排列。以下是Java九宫格数字键盘的实现步骤: 1. 创建一个3x3的二维数组,用于存储九宫格中的数字。 2. 在数组中随机生成1-9的数字,并将其打乱顺序。 3. 使用循环结构不断读取用户的输入,直到九宫格中的数字按照从小到大的顺序排列。 4. 根据用户的输入,交换数字键和目标位置数字的位置,并重新绘制九宫格。 以下是Java九宫格数字键盘的代码实现: ```java import java.util.Scanner; public class NumberKeyboard { public static void main(String[] args) { int[][] keyboard = new int[3][3]; initKeyboard(keyboard); drawKeyboard(keyboard); while (!isSorted(keyboard)) { char c = getUserInput(); move(keyboard, c); drawKeyboard(keyboard); } System.out.println("Congratulations! You win!"); } // 初始化九宫格 public static void initKeyboard(int[][] keyboard) { int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9}; shuffle(nums); int k = 0; for (int i = 0; i < keyboard.length; i++) { for (int j = 0; j < keyboard[i].length; j++) { keyboard[i][j] = nums[k++]; } } } // 打乱数组顺序 public static void shuffle(int[] nums) { for (int i = nums.length - 1; i > 0; i--) { int j = (int) (Math.random() * (i + 1)); int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } // 绘制九宫格 public static void drawKeyboard(int[][] keyboard) { System.out.println("-------------"); for (int i = 0; i < keyboard.length; i++) { System.out.print("| "); for (int j = 0; j < keyboard[i].length; j++) { if (keyboard[i][j] == 0) { System.out.print(" | "); } else { System.out.print(keyboard[i][j] + " | "); } } System.out.println(); System.out.println("-------------"); } } // 判断九宫格是否已经排好序 public static boolean isSorted(int[][] keyboard) { int k = 1; for (int i = 0; i < keyboard.length; i++) { for (int j = 0; j < keyboard[i].length; j++) { if (keyboard[i][j] != k && !(i == 2 && j == 2)) { return false; } k++; } } return true; } // 获取用户输入 public static char getUserInput() { Scanner scanner = new Scanner(System.in); char c = ' '; try { c = (char) scanner.next().charAt(0); } catch (Exception e) { System.out.println("Invalid input!"); } return c; } // 移动数字键 public static void move(int[][] keyboard, char c) { int x = 0, y = 0; for (int i = 0; i < keyboard.length; i++) { for (int j = 0; j < keyboard[i].length; j++) { if (keyboard[i][j] == 0) { x = i; y = j; break; } } } switch (c) { case 'w': if (x > 0) { keyboard[x][y] = keyboard[x - 1][y]; keyboard[x - 1][y] = 0; } break; case 's': if (x < 2) { keyboard[x][y] = keyboard[x + 1][y]; keyboard[x + 1][y] = 0; } break; case 'a': if (y > 0) { keyboard[x][y] = keyboard[x][y - 1]; keyboard[x][y - 1] = 0; } break; case 'd': if (y < 2) { keyboard[x][y] = keyboard[x][y + 1]; keyboard[x][y + 1] = 0; } break; default: System.out.println("Invalid input!"); break; } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值