本节学习大纲
1、要求:实现九宫格布局
2、解题思路
3、搭建基础页面
4、实现九宫格布局-利用浮动
4.1 先获取要用到的标签(按钮和图片)
4.2 监听按钮的点击井实现浮动
5、浮动方法-整体代码显示
6、实现九宫格布局-利用定位
6.1 找规律
6.2 监听按钮的点击
6.3 进行定位
7、定位方法-整体代码显示
1、要求:实现九宫格布局
页面的左上角有3个按钮,通过点击按钮来控制页面显示图片的列数。
2、解题思路
想要实现九宫格布局,步骤:
1、搭建基础页面
2、获取要用到的标签
3、点击按钮实现布局,可以是点击按钮时,整体图片发生浮动,相应的总盒子的大小发生变化,要将图片分成几列,就让布局的宽度成为图片盒子宽度的几倍。
4、3个按钮操作是一样的,所以代码会发生冗余,利用函数消除冗余代码。
3、搭建基础页面
html><html><head><meta charset="utf-8"><title>title><style>
* {margin: 0;padding: 0;
}#pic {overflow: hidden;
}#pic .pic_div {width: 240px;height: 350px;font-size: 14px;
}#pic .pic_div .title {width: 240px;height: 30px;line-height: 30px;overflow: hidden;margin-bottom: 10px;
}#pic .pic_div .pic_img {width: 240px;display: table-cell;text-align: center;
}#pic .pic_div img {width: 200px;height: 200px;
}#pic .pic_div p{text-align: center;
}#pic .pic_div .price {color: red;font-weight: bold;font-size: 18px;
}style>head><body><div class="cols"><button>3列button><button>4列button><button>5列button>div><div id="pic"><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/2.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/3.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/2.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/3.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div>div>body>html>
此时的图片,并未发生浮动,基础页面搭建以后,页面展示为:
![bd4c95dc8e3f43d3fffc28e853c5b91f.png](https://img-blog.csdnimg.cn/img_convert/bd4c95dc8e3f43d3fffc28e853c5b91f.png)
4、实现九宫格布局-利用浮动
4.1 先获取要用到的标签(按钮和图片)
<script type="text/javascript">// 1.获取要用的标签var btn = document.getElementsByTagName("button");console.log(btn); // 按钮的集合var pic_divs = document.getElementsByClassName("pic_div");console.log(pic_divs); // 图片盒子的集合script>
此时,从页面上可以看到,已经获取到了按钮和图片盒子的集合,页面展示为:
![ee08f1a640488fe832494f12f9ca7416.png](https://img-blog.csdnimg.cn/img_convert/ee08f1a640488fe832494f12f9ca7416.png)
4.2 监听按钮的点击并实现浮动
以第一个按钮为例,第一个按钮即btn[0]
。点击第一个按钮时要分成3列,所有图片要进行浮动,所以要对图片进行遍历,图片靠左浮动,且整体的布局宽度变成3倍的图片盒子宽。
<script type="text/javascript">// 1.获取标签 点击button按钮,下方图片开始浮动var btn = document.getElementsByTagName("button");var pic_divs = document.getElementsByClassName("pic_div");// 2.监听按钮的点击
btn[0].onclick = function() {// 循环,遍历图片,开始浮动for (i = 0; i pic_divs[i].style.float = "left"; // 图片都想做浮动
pic_divs[i].parentNode.style.width = (3 * pic_divs[i].offsetWidth) + "px"; // 图片盒子的父集节点宽度变为图片盒子的3倍
}
}script>
此时,点击3列的按钮,触发onclick事件,图片向左浮动,且呈3列显示。页面展示为:
实现了3列按钮的,4列和5列按钮的代码一样,只是盒子的宽度变成能力4倍和5倍。代码如下,
<script type="text/javascript">// 1.获取要用的标签 var btn = document.getElementsByTagName("button");var pic_divs = document.getElementsByClassName("pic_div");// 2.监听按钮的点击
btn[0].onclick = function() {// 循环,遍历图片,开始浮动for (i = 0; i pic_divs[i].style.float = "left"; // 图片都想做浮动
pic_divs[i].parentNode.style.width = (3 * pic_divs[i].offsetWidth) + "px"; // 图片盒子的父集节点宽度变为图片盒子的3倍
}
}
btn[1].onclick = function() {// 循环,遍历图片,开始浮动for (i = 0; i pic_divs[i].style.float = "left"; //开始浮动
pic_divs[i].parentNode.style.width = (4 * pic_divs[i].offsetWidth) + "px";
}
}
btn[2].onclick = function() {// 循环,遍历图片,开始浮动for (i = 0; i pic_divs[i].style.float = "left"; //开始浮动
pic_divs[i].parentNode.style.width = (5 * pic_divs[i].offsetWidth) + "px";
}
}script>
此时,点击按钮,实现图片分列排列。页面展示为:
此时功能依然实现,但可以明显的看出js代码存在冗余问题。可以利用function函数来进行封装。然后每个onclick事件直接调用函数。
<script type="text/javascript">// 1.获取要用的标签 var btn = document.getElementsByTagName("button");var pic_divs = document.getElementsByClassName("pic_div");// 2.监听按钮的点击
btn[0].onclick = function() {// 循环,遍历图片,开始浮动
picOn(3);
}
btn[1].onclick = function() {// 循环,遍历图片,开始浮动
picOn(4);
}
btn[2].onclick = function() {// 循环,遍历图片,开始浮动
picOn(5);
}function picOn(num) {for (i = 0; i pic_divs[i].style.float = "left"; // 开始浮动
pic_divs[i].parentNode.style.width = (num * pic_divs[i].offsetWidth) + "px";
}
}script>
此时就解决了代码冗余问题,利用浮动来完成九宫格布局的功能就实现了。
5、浮动方法-整体代码显示
html><head><meta charset="utf-8"><title>title><style>
* {margin: 0;padding: 0;
}#pic {overflow: hidden;
}#pic .pic_div {width: 240px;height: 350px;font-size: 14px;
}#pic .pic_div .title {width: 240px;height: 30px;line-height: 30px;overflow: hidden;margin-bottom: 10px;
}#pic .pic_div .pic_img {width: 240px;display: table-cell;text-align: center;
}#pic .pic_div img {width: 200px;height: 200px;
}#pic .pic_div p{text-align: center;
}#pic .pic_div .price {color: red;font-weight: bold;font-size: 18px;
}style>head><body><div class="cols"><button>3列button><button>4列button><button>5列button>div><div id="pic"><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/2.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/3.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/2.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/3.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div>div><script type="text/javascript">// 1.获取要用的标签 var btn = document.getElementsByTagName("button");var pic_divs = document.getElementsByClassName("pic_div");// 2.监听按钮的点击
btn[0].onclick = function() {// 循环,遍历图片,开始浮动
picOn(3);
}
btn[1].onclick = function() {// 循环,遍历图片,开始浮动
picOn(4);
}
btn[2].onclick = function() {// 循环,遍历图片,开始浮动
picOn(5);
}function picOn(num) {for (i = 0; i pic_divs[i].style.float = "left"; //开始浮动
pic_divs[i].parentNode.style.width = (num * pic_divs[i].offsetWidth) + "px";
}
}script>body>html>
6、实现九宫格布局-利用定位
利用变化之后的规律来看,利用其每个图片盒子与最左边和最上边的距离,来定位。
要给整体的盒子做绝对定位:
html><html><head><meta charset="utf-8"><title>title><style>
* {
margin: 0;
padding: 0;
}
#pic {
position: relative; // 给整体盒子做绝对定位
}
#pic .pic_div {
width: 240px;
height: 350px;
font-size: 14px;
}
#pic .pic_div .title {
width: 240px;
height: 30px;
line-height: 30px;
overflow: hidden;
margin-bottom: 10px;
}
#pic .pic_div .pic_img {
width: 240px;
display: table-cell;
text-align: center;
}
#pic .pic_div img {
width: 200px;
height: 200px;
}
#pic .pic_div p{
text-align: center;
}
#pic .pic_div .price {
color: red;
font-weight: bold;
font-size: 18px;
}style>head><body><div class="cols"><button>3列button><button>4列button><button>5列button>div><div id="pic"><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/2.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/3.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/2.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/3.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div>div>body>html>
6.1 找规律
对于分成3列来说,每行3个图片。图片盒子的索引是从0开始的。
从每个pic_div到顶端和左边的距离和索引位置来看:
第1个图片,索引位置是0行0列,距离顶端和左边都是0个盒子的距离;top = 0 * h; left = 0 * w
第2个图片,索引位置是0行1列,距离顶端0个盒子,距离左边1个盒子的距离;top = 0 * h; left = 1 * w
第3个图片,索引位置是0行2列,距离顶端0个盒子,距离左边2个盒子的距离;top = 0 * h; left = 2 * w
第4个图片,索引位置是1行0列,距离顶端1个盒子,距离左边0个盒子的距离;top = 1 * h; left = 0 * w
第5个图片,索引位置是1行1列,距离顶端1个盒子,距离左边1个盒子的距离;top = 1 * h; left = 1 * w
第6个图片,索引位置是1行2列,距离顶端1个盒子,距离左边2个盒子的距离;top = 1 * h; left = 2 * w
....
以此类推
即,top值与行数相同,left值与列数相同。top = row * h; left = col * w。那么只要求出每个图片盒子的行数与列数就可以利用定位来得到图片盒子的位置。
比如第12个图片,索引号为13,索引位置是4行1列;
第13个图片,索引号为14,索引位置是4行2列;
即图片的行数为索引号除以3的整数,列数为索引号除以3的余数。
6.2 监听按钮的点击
同浮动方法一样,代码如下,
<script type="text/javascript">// 1.获取要用的标签 var btn = document.getElementsByTagName("button");var pic_divs = document.getElementsByClassName("pic_div");// 2.监听按钮的点击
btn[0].onclick = function() {// 循环,遍历图片,开始浮动
picOn(3);
}
btn[1].onclick = function() {// 循环,遍历图片,开始浮动
picOn(4);
}
btn[2].onclick = function() {// 循环,遍历图片,开始浮动
picOn(5);
}script>
6.3 进行定位
<script type="text/javascript">function picOn(num) {for (i = 0; i // 求每个盒子占的行数和列数var row = parseInt(i / num); // 取整,行数为索引号除以num的整数var col = parseInt(i % num); // 取余,列数为索引号除以num的余数// 设置定位,在当前父元素中的位置
pic_divs[i].style.position = "absolute"; // 添加相对定位
pic_divs[i].style.top = (row * pic_divs[i].offsetHeight) + "px";
pic_divs[i].style.left = (col * pic_divs[i].offsetWidth) + "px";
}
}script>
如此就实现了功能。
7、定位方法-整体代码显示
html><html><head><meta charset="utf-8"><title>title><style>
* {
margin: 0;
padding: 0;
}
#pic {
position: relative; //给整体盒子做绝对定位
}
#pic .pic_div {
width: 240px;
height: 350px;
font-size: 14px;
}
#pic .pic_div .title {
width: 240px;
height: 30px;
line-height: 30px;
overflow: hidden;
margin-bottom: 10px;
}
#pic .pic_div .pic_img {
width: 240px;
display: table-cell;
text-align: center;
}
#pic .pic_div img {
width: 200px;
height: 200px;
}
#pic .pic_div p {
text-align: center;
}
#pic .pic_div .price {
color: red;
font-weight: bold;
font-size: 18px;
}style>head><body><div class="cols"><button>3列button><button>4列button><button>5列button>div><div id="pic"><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/2.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/3.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/1.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/2.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/3.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/4.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div><div class="pic_div"><div class="pic_img"><img src="image/5.jpg" alt="">div><p class="title">小花一朵p><p class="price">漂亮p>div>div><script type="text/javascript">// 1.获取要用的标签 var btn = document.getElementsByTagName("button");console.log(btn); // 按钮的集合var pic_divs = document.getElementsByClassName("pic_div");console.log(pic_divs); // 图片盒子的集合// 2.监听按钮的点击
btn[0].onclick = function () {// 循环,遍历图片,开始浮动
picOn(3);
}
btn[1].onclick = function () {
picOn(4);
}
btn[2].onclick = function () {
picOn(5);
}function picOn(num) {// for (i = 0; i // pic_divs[i].style.float = "left"; //开始浮动// pic_divs[i].parentNode.style.width = (num * pic_divs[i].offsetWidth) + "px";// }for (i = 0; i // 求每个盒子占的行数和列数var row = parseInt(i / num); // 取整,行数为索引号除以num的整数var col = parseInt(i % num); // 取余,列数为索引号除以num的余数// 设置定位,在当前父元素中的位置
pic_divs[i].style.position = "absolute"; // 添加相对定位
pic_divs[i].style.top = (row * pic_divs[i].offsetHeight) + "px";
pic_divs[i].style.left = (col * pic_divs[i].offsetWidth) + "px";
}
}script>body>html>