版本說明
當前版本號[20231122]。
版本 | 修改說明 |
---|---|
20231122 | 初版 |
目錄
文章目錄
- 版本說明
- 目錄
- 移動 Web 第四天
- 01-vw適配方案
- vw和vh基本使用
- vw布局
- vh布局
- 混用問題
- 02-綜合案例-酷我音樂
- 準備工作
- 頭部布局
- 頭部內容
- 搜索區域
- banner 區域
- 標題公共樣式
- 排行榜內容
- 推薦歌單布局
- 推薦歌單內容
- 下載區域
- 頭部固定
移動 Web 第四天
01-vw適配方案
vw和vh基本使用
vw和vh是相對單位,相對視口尺寸計算結果,可以直接實現移動端適配效果。
- vw:viewport width(1vw = 1/100視口寬度 )
- vh:lviewport height ( 1vh = 1/100視口高度 )
vw布局
vw單位的尺寸 = px 單位數值 / ( 1/100 視口寬度 )
-
確定設計稿對應的vw尺寸 (1/100視口寬度)
- 查看設計稿寬度 → 確定參考設備寬度 (視口寬度) → 確定 vw 尺寸 (1/100 視口寬度
-
vw單位的尺寸 = px 單位數值 / ( 1/100 視口寬度 )
vh布局
-
確定設計稿對應的vh尺寸 (1/100視口高度)
- 查看設計稿寬度 → 確定參考設備高度 (視口高度) → 確定 vh 尺寸 (1/100 視口高度)
-
vh單位的尺寸 = px 單位數值 / ( 1/100 視口高度 )
混用問題
注:是否可以 vw 和 vh 混用呢?
vh是1/100視口高度,全面屏視口高度尺寸大,如果混用可能會導致盒子變形
02-綜合案例-酷我音樂
準備工作
- HTML 結構
<link rel="stylesheet" href="./iconfont/iconfont.css">
<link rel="stylesheet" href="./css/index.css">
-
less 樣式
要注意:
// out: ../css/
要在第一行,才會生效。如果放到非第一行去, css 文件就會與 less文件放在一起。
// out: ../css/@import "./base";
頭部布局
- HTML 結構
<!-- 頭部 -->
<header><div class="left">left</div><a href="#">下載APP</a>
</header>
- less 樣式
body {background-color: #f9fafb;
}@vw:3.75vw;// 頭部
header {display: flex;justify-content: space-between;align-items: center;padding: 0 (15 / @vw);height: (50 / @vw);background-color: #fff;
}
1、把頭部區域圈出來。
<body><!-- 頭部 --><header>1</header>
</body>
body{background-color: #f9fafb;
}// 頭部
header{background-color: #fff;
}
2、給頭部區域加上內外邊距。
@vw:3.75vw;
// 頭部
header{padding: 0 (15 / @vw);height: (50 / @vw);background-color: #fff;
}
3、分成左右兩部分,并設置Flex容器中項目的垂直對齊方式。
<!-- 頭部 --><header><div class="left">left</div><a href="#">下載APP</a></header>
@vw:3.75vw;
// 頭部
header{display: flex;justify-content: space-between;align-items: center;padding: 0 (15 / @vw);height: (50 / @vw);background-color: #fff;
}
頭部內容
- less 樣式
header {// 左邊.left {width: (235 / @vw);height: (50 / @vw);background-image: url(../assets/head.png);background-size: contain;background-repeat: no-repeat;}a {width: (80 / @vw);height: (30 / @vw);background-color: #ffe31b;border-radius: (15 / @vw);text-align: center;line-height: (30 / @vw);font-size: (14 / @vw);}
}
1、添加上背景圖片,并設置背景圖像的尺寸和重復方式。
- 背景圖像會保持其原始尺寸,同時可能被拉伸或壓縮以適應容器的大小。
- 設置為
no-repeat
時,背景圖像不會在水平方向上重復,也不會在垂直方向上重復。這意味著背景圖像只會顯示一次,并且不會隨著容器的大小變化而自動調整。
// 左邊.left{height: (50 / @vw);width: (235 / @vw);background-image: url(../assets/head.png);background-size: contain;background-repeat: no-repeat;}
2、設置“下載APP”的背景框,讓文本會在水平方向上居中對齊。
// 右邊a{width: (80 / @vw);height: (30 / @vw);background-color: #ffe31b;text-align: center;line-height: (30 / @vw);border-radius: (15 / @vw);font-size: (14 / @vw);}
搜索區域
- HTML 結構
<!-- 搜索 -->
<div class="search"><div class="txt"><span class="iconfont icon-sousuo"></span><span>搜索你想聽的歌曲</span></div>
</div>
- less 樣式
// 搜索
.search {padding: (10 / @vw) (15 / @vw);height: (52 / @vw);// background-color: pink;.txt {height: (32 / @vw);background-color: #f2f4f5;border-radius: (16 / @vw);text-align: center;line-height: (32 / @vw);color: #a1a4b3;font-size: (14 / @vw);.iconfont {font-size: (16 / @vw);}}
}
1、列出搜索區域。
// 搜索區域
.search{padding: (10 / @vw) (15 / @vw);height: (42 / @vw);background-color: pink;
}
2、對文本的區域設置邊距。
.txt{height: (32 / @vw);background-color: #f2f4f5;border-radius: (16 / @vw);}
3、在框內添加字體圖標和搜索提示詞。
<!-- 搜索區域 --><div class="search"><div class="txt"><span class="iconfont icon-sousuo"></span><span>搜索你想聽的歌曲</span></div></div>
.txt{height: (32 / @vw);background-color: #f2f4f5;border-radius: (16 / @vw);text-align: center;line-height: (32 / @vw);color: #a1a4b3;}
4、設置字體圖標的大小。
.txt{height: (32 / @vw);background-color: #f2f4f5;border-radius: (16 / @vw);text-align: center;line-height: (32 / @vw);color: #a1a4b3;font-size: (14 / @vw);.iconfont{font-size: (16 / @vw);}}
banner 區域
- HTML 結構
<!-- banner -->
<div class="banner"><ul><li><a href="#"><img src="./assets/banner01.jpeg" alt=""></a></li></ul>
</div>
- less 樣式
// banner
.banner {padding: 0 (15 / @vw);height: (108 / @vw);// background-color: pink;ul {li {width: (345 / @vw);height: (108 / @vw);img {width: 100%;height: 100%;// cover完全覆蓋// 縮放img,圖片比例跟父級盒子比例不同,避免圖片擠壓變形object-fit: cover;border-radius: (5 / @vw);}}}
}
1、給banner區域騰出位置。
<!-- banner區域 --><div class="banner">1</div>
// banner區域
.banner{padding: 0 (15 / @vw);height: (108 / @vw);background-color: pink;
}
2、插入圖片,并且讓圖片完全覆蓋,當圖片比例與父級盒子比例不同時,就縮放img,避免圖片因擠壓而產生變形。
<!-- banner區域 --><div class="banner"><ul><li><a href="#"><img src="./assets/banner01.jpeg" alt=""></a></li></ul></div>
// banner區域
.banner{padding: 0 (15 / @vw);height: (108 / @vw);background-color: pink;ul{li{width: (345 / @vw);height: (108 / @vw);img{width: 100%;height: 100%;// cover代表圖片是完全覆蓋的// 當圖片比例與父級盒子比例不同時,縮放img,避免圖片擠壓變形object-fit: cover;}}}
}
注:
// cover代表圖片是完全覆蓋的// 當圖片比例與父級盒子比例不同時,縮放img,避免圖片擠壓變形object-fit: cover;
3、再把背景色去掉。
border-radius: (5 / @vw);
標題公共樣式
- HTML 結構
<!-- 排行榜 -->
<div class="list"><!-- 標題 --><div class="title"><h4>酷我排行榜</h4><a href="#">更多<span class="iconfont icon-right"></span></a></div>
</div>
- less 樣式
// 排行榜
.list {margin-top: (20 / @vw);padding: 0 (15 / @vw);
}// 標題 → 公共樣式
.title {display: flex;justify-content: space-between;margin-bottom: (16 / @vw);line-height: (25 / @vw);h4 {font-size: (20 / @vw);}a {font-size: (12 / @vw);color: #a1a4b3;}
}
1、對 排行榜 區域進行設置。
<!-- 排行榜 --><div class="list"><!-- 標題 --><div class="title"><h4>酷我排行榜</h4><a href="#">更多<span class="iconfont icon-right"></span></a></div></div>
// 排行榜
.list{margin-top: (20 / @vw);padding: 0 (15 / @vw);
}
2、設置排行榜標題區域為水平對齊方式。元素之間會平均分配空間,并且兩端的元素分別靠近容器的開始和結束位置。
// 標題
.title{display: flex;justify-content: space-between;margin-bottom: (16 / @vw);
}
3、改變文字的樣式。
// 標題
.title{display: flex;justify-content: space-between;margin-bottom: (16 / @vw);line-height: (25 / @vw);h4{font-size: 20px;}a{font-size: 12px;color: #a1a4b3;text-align: center;}
}
排行榜內容
- HTML 結構
<!-- 內容 -->
<div class="content"><ul><li><div class="pic"><img src="./assets/icon_rank_hot.png" alt=""></div><div class="txt"><a href="#" class="more">酷我熱歌榜<span class="iconfont icon-right"></span></a><a href="#">1.櫻花樹下的約定(完整版) - 旺仔小喬</a><a href="#">2.就讓這大雨全都落下 - 容祖兒</a><a href="#">3.缺氧 - 軒姨(相信光)</a></div></li><li><div class="pic"><img src="./assets/icon_rank_new.png" alt=""></div><div class="txt"><a href="#" class="more">酷我新歌榜<span class="iconfont icon-right"></span></a><a href="#">1.櫻花樹下的約定(完整版) - 旺仔小喬</a><a href="#">2.就讓這大雨全都落下 - 容祖兒</a><a href="#">3.缺氧 - 軒姨(相信光)</a></div></li><li><div class="pic"><img src="./assets/icon_rank_rise.png" alt=""></div><div class="txt"><a href="#" class="more">酷我飆升榜<span class="iconfont icon-right"></span></a><a href="#">1.櫻花樹下的約定(完整版) - 旺仔小喬</a><a href="#">2.就讓這大雨全都落下 - 容祖兒</a><a href="#">3.缺氧 - 軒姨(相信光)</a></div></li></ul>
</div>
- less 樣式
// 排行榜
.list {margin-top: (20 / @vw);padding: 0 (15 / @vw);li {display: flex;margin-bottom: (16 / @vw);height: (105 / @vw);background-color: #fff;border-radius: (10 / @vw);.pic {margin-right: (20 / @vw);img {width: (105 / @vw);height: (105 / @vw);border-radius: (10 / @vw);}}.txt {a {display: block;font-size: (12 / @vw);color: #a1a4b3;line-height: 1.8;}.more {font-size: (14 / @vw);color: #333;.iconfont {font-size: (16 / @vw);}}}}
}
1、設置三個li標簽。
<!-- 排行榜 --><div class="list"><!-- 標題 --><div class="title"><h4>酷我排行榜</h4><a href="#">更多<span class="iconfont icon-right"></span></a></div><!-- 內容 --><div class="content"><ul><li>1</li><li>2</li><li>3</li></ul></div></div>
// 排行榜
.list{margin-top: (20 / @vw);padding: 0 (15 / @vw);li{margin-bottom: (16 / @vw);height: (105 / @vw);background-color: #fff;border-radius: (10 / @vw);}
}
2、將每個li標簽分為兩部分,圖片及文字。
<li><div class="pic">1</div><div class="txt">2</div></li>
li{display: flex;margin-bottom: (16 / @vw);height: (105 / @vw);background-color: #fff;border-radius: (10 / @vw);.pic{margin-right: (20 / @vw);}}
3、插入圖片。
<li><div class="pic"><img src="./assets/icon_rank_hot.png" alt=""></div><div class="txt">2</div></li>
.pic{margin-right: (20 / @vw);img{width: (105 / @vw);height: (105 / @vw);border-radius: (10 / @vw);}}
4、將文字區域設置成 display: block;
,是為了讓每個 a 標簽都可以換行。
<li><div class="pic"><img src="./assets/icon_rank_hot.png" alt=""></div><div class="txt"><a href="#" class="more">酷我熱歌榜<span class="iconfont icon-right"></span></a><a href="#">1.櫻花樹下的約定(完整版) - 旺仔小喬</a><a href="#">2.就讓這大雨全都落下 - 容祖兒</a><a href="#">3.缺氧 - 軒姨(相信光)</a></div></li>
.txt{a{display: block;}}
5、改變右邊區域的樣式。
.txt{a{display: block;line-height: 1.8;font-size: (12 / @vw);color: #a1a4b3;}.more{font-size: (14 / @vw);color: #333;.iconfont{font-size: (16 / @vw);}}}
推薦歌單布局
- HTML 結構
<!-- 推薦歌單 -->
<div class="recommend"><!-- 標題 --><div class="title"><h4>推薦歌單</h4><a href="#">更多<span class="iconfont icon-right"></span></a></div><!-- 內容 --><div class="content"><ul><li>1</li><li>1</li><li>1</li><li>1</li><li>1</li><li>1</li></ul></div>
</div>
- less 樣式
// 推薦歌單
.recommend {padding: 0 (15 / @vw);ul {display: flex;flex-wrap: wrap;justify-content: space-between;li {margin-bottom: (16 / @vw);width: (105 / @vw);height: (143 / @vw);background-color: pink;}}
}
1、設置歌單區域的內邊距。
<!-- 推薦歌單 --><div class="recommend">1</div>
// 推薦歌單
.recommend{padding: 0 (15 / @vw);
}
2、按照之前設置標題的套路,在這里繼續使用。
<!-- 推薦歌單 --><div class="recommend"><!-- 標題 --><div class="title"><h4>推薦歌單</h4><a href="#">更多<span class="iconfont icon-right"></span></a></div></div>
3、分6個li標簽,當容器寬度不足以容納所有元素時,元素自動換行并均勻分布,同時保持兩端元素靠邊的效果。
<!-- 推薦歌單 --><div class="recommend"><!-- 標題 --><div class="title"><h4>推薦歌單</h4><a href="#">更多<span class="iconfont icon-right"></span></a></div><!-- 內容 --><div class="content"><ul><li>1</li><li>1</li><li>1</li><li>1</li><li>1</li><li>1</li></ul></div></div>
// 推薦歌單
.recommend{padding: 0 (15 / @vw);ul{display: flex;flex-wrap: wrap;justify-content: space-between;li{width: (105 / @vw);height: (143 / @vw);margin-bottom: (16 / @vw);background-color: pink;}}
}
推薦歌單內容
- HTML 結構
<li><div class="pic"><img src="./assets/song01.jpeg" alt=""><div class="cover">18.2W</div></div><div class="txt">抖音嗨爆DJ!勁爆旋律縈繞雙耳</div>
</li>
<li><div class="pic"><img src="./assets/song02.jpeg" alt=""><div class="cover">18.2W</div></div><div class="txt">抖音嗨爆DJ!勁爆旋律縈繞雙耳</div>
</li>
<li><div class="pic"><img src="./assets/song03.jpeg" alt=""><div class="cover">18.2W</div></div><div class="txt">抖音嗨爆DJ!勁爆旋律縈繞雙耳</div>
</li>
<li><div class="pic"><img src="./assets/song02.jpeg" alt=""><div class="cover">18.2W</div></div><div class="txt">抖音嗨爆DJ!勁爆旋律縈繞雙耳</div>
</li>
<li><div class="pic"><img src="./assets/song03.jpeg" alt=""><div class="cover">18.2W</div></div><div class="txt">抖音嗨爆DJ!勁爆旋律縈繞雙耳</div>
</li>
<li><div class="pic"><img src="./assets/song01.jpeg" alt=""><div class="cover">18.2W</div></div><div class="txt">抖音嗨爆DJ!勁爆旋律縈繞雙耳</div>
</li>
- less 樣式
// 圖片
.pic {position: relative;width: (105 / @vw);height: (105 / @vw);img {width: 100%;height: 100%;object-fit: cover;border-radius: (10 / @vw);}.cover {position: absolute;left: 0;bottom: 0;width: (70 / @vw);height: (28 / @vw);background-color: rgba(0,0,0,0.8);border-radius: 0 (10 / @vw) 0 (10 / @vw);text-align: center;line-height: (28 / @vw);color: #fff;font-size: (14 / @vw);}
}
// 文字
.txt {font-size: (14 / @vw);
}
1、給每個li標簽添加圖片及文字。
<li><div class="pic"><img src="./assets/song01.jpeg" alt=""></div><div class="txt">抖音嗨爆DJ!勁爆旋律縈繞雙耳</div></li>
li{width: (105 / @vw);height: (143 / @vw);margin-bottom: (16 / @vw);background-color: pink;// 圖片.pic{width: (105 / @vw);height: (105 / @vw);img{width: 100%;height: 100%;object-fit: cover;}}}
2、改變文字大小并把底色注銷掉。
// 文字.txt{font-size: (14 / @vw);}
3、插入左下角的表數值的框。
<div class="cover">18.2W</div>
// 圖片.pic{position: relative;width: (105 / @vw);height: (105 / @vw);img{width: 100%;height: 100%;object-fit: cover;border-radius: (10 / @vw);}.cover{position: absolute;left: 0;bottom: 0;}}
4、改變背景透明度及圓角顯示。
.cover{position: absolute;left: 0;bottom: 0;width: (70 / @vw);height: (28 / @vw);background-color: rgba(0, 0, 0, 0.8);border-radius: 0 (10 / @vw) 0 (10 / @vw);}
5、設置里面的數字位置水平及垂直居中。
// 里面的數字text-align: center;line-height: (28 / @vw);color: #fff;
下載區域
- HTML 結構
<!-- 安裝,下載 -->
<div class="download"><img src="./assets/logo.png" alt=""><p>安裝酷我音樂 發現更多好音樂</p><span class="iconfont icon-right"></span>
</div>
- less 樣式
// 下載
.download {position: fixed;left: (15 / @vw);bottom: (30 / @vw);display: flex;align-items: center;padding: 0 (10 / @vw) 0 (15 / @vw);width: (345 / @vw);height: (45 / @vw);background-color: #fff;border-radius: (22 / @vw);img {margin-right: (10 / @vw);width: (36 / @vw);height: (36 / @vw);}p {flex: 1;font-size: (14 / @vw);}span {width: (32 / @vw);height: (32 / @vw);background-color: #f2f3f5;border-radius: 50%;text-align: center;line-height: (32 / @vw);font-size: (16 / @vw);}
}
1、給下載區域描出框的位置。
<!-- 下載區域 --><div class="download">1</div>
// 下載區域
.download{width: (345 / @vw);height: (45 / @vw);padding: 0 (10 / @vw) 0 (15 / @vw);color: #333;
}
2、進一步修改細節。
// 下載區域
.download{position: fixed;left: (15 / @vw);bottom: (30 / @vw);width: (345 / @vw);height: (45 / @vw);padding: 0 (10 / @vw) 0 (15 / @vw);color: #fff;
}
3、設置元素的邊框圓角半徑。
background-color: #fff;
border-radius: (22 / @vw);
4、將區域中的圖片、文字和字體圖標加上去。
<!-- 下載區域 --><div class="download"><img src="./assets/logo.png" alt=""><p>安裝酷我音樂 發現更多好音樂</p><span class="iconfont icon-right"></span></div>
.download{display: flex;……img{width: (36 / @vw);height: (36 / @vw);}
}
5、設置區域中的內容垂直對齊。
// 下載區域
.download{……align-items: center;img{width: (36 / @vw);height: (36 / @vw);margin: 0 (10 / @vw) 0 0;}
}
6、修改文字的大小。flex: 1;
為設置Flex容器中項目的彈性伸縮比例。當設置為 1
時,項目會平均分配可用空間。在這里當分配好圖標和字體圖標完后,剩下的空間均為 p 所用。
p{flex: 1;font-size: (14 / @vw);}
7、設置"span"的元素樣式為一個圓形的容器,并具有指定的寬度、高度、背景顏色、邊框圓角半徑、行高和文本對齊方式。
span{width: (32 / @vw);height: (32 / @vw);background-color: #f2f3f5;border-radius: 50%;line-height: (32 / @vw);text-align: center;}
頭部固定
問題:
1、寬度不夠
2、搜索欄沒了
- less 樣式
// 頭部
header {position: fixed;left: 0;top: 0;display: flex;justify-content: space-between;align-items: center;padding: 0 (15 / @vw);// 固定定位的盒子,寬度靠內容撐開,希望寬度100%width: 100%;height: (50 / @vw);background-color: #fff;
}// 搜索
.search {// 頭部固定定位,脫標不占位,搜索去最頂了,加上外邊距擠下來即可margin-top: (50 / @vw);padding: (10 / @vw) (15 / @vw);height: (52 / @vw);
}
1、設置頭部固定。
header{position: fixed;left: 0;top: 0;// 固定定位的盒子,寬度靠內容撐開,所以我們希望寬度為100%width: 100%;……
}
2、我們會發現,搜索框沒有顯示出來了,是因為固定頭部的區域把其給覆蓋了。我們只需要添加上邊距,讓搜索框下來,這樣我們就能看到了。
// 搜索區域
.search{// 頭部固定定位,拖標不定位,搜索去最頂處了,加上外邊距擠下來即可margin-top: (50 / @vw);……
}