HTML+CSS宝典 实战项目
https://study.163.com/course/courseLearn.htm?courseId=1209391807#/learn/video?lessonId=1279310071&courseId=1209391807
https://study.163.com/course/introduction/1209391807.htm
1、选项卡
span 元素是行盒,浮动起来变成块盒,然后就能设置宽度,就能并排显示
文字行高为 2,文字大小设置为 13px,span 元素高度被撑起来了 26px
margin-bottom: -1px 选中的时候往下移动,多出一个像素,把外层元素 .switch-menu 的边框覆盖掉
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>选项卡</title>
<style>
*{padding:0;margin:0;}
/* common 通用样式 */
.left{
float: left;
}
.right{
float: right;
}
.clearfix::after{
content: "";
display: block;
clear: both;
}
/* 选项卡 style */
.account-container{
width: 300px;
height: 300px;
position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);background-color: lightyellow;
line-height: 2;
color: #9b9b9b;
}
.account-container .switch-menu{
border-bottom: 1px solid #ececec;
font-size: 13px;
}
.account-container .switch-menu span{
width: 50%;
text-align: center;
cursor: pointer;
}
.account-container .switch-menu span.selected{
font-weight: bold;
color: #333;
border-bottom: 1px solid orange;
margin-bottom: -1px; /* 往下多出一个像素,把.switch-menu元素的边框覆盖掉 */
}
</style>
</head>
<body>
<div class="account-container">
<div class="switch-menu clearfix">
<span class="left selected">短信登录/注册</span>
<span class="right">密码登录</span>
</div>
</div>
</body>
</html>2、行块盒排列
列表项 li 元素并排排列,每个列表项 li 的高度是不固定的,有的列表项很高,有的没有那么不高,这种情况下不能用浮动
1. 设置设置 li 固定的宽度
2. 然后 li 元素为行块盒 inline-block 就能并排排列
3. 设置 ul 平均分布排列 text-align: justify,li 就分散对齐了,但该样式只会影响除最后一行的其它行
4. 最后一行用一个巧妙的办法,在 ul 最后加一个 li 元素,设置样式宽度 100%,
5. 默认是基线对齐,设置 li 顶端对齐 vertical-align: top
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>行块盒排列</title>
<style>
ul,li,img.div,span{padding:0;margin:0;}
ul{
width: 360px;
margin: 0 auto;
background-color: #f7f7f7;
line-height: 1.5;
text-align: justify; /* 3.平均分布排列 */
}
li{
display: inline-block; /* 1.设置li为行块盒 */
width: 170px; /* 2.设置li固定的宽度 */
vertical-align: top; /* 5.设置顶端对齐 */
margin-bottom: 10px;
}
ul::after{ /* 4.ul最后一行是一个伪元素,不写高度 */
content: "";
width: 100%;
display: inline-block;
}
ul li .words{
font-size: 13px;
padding-top: 5px;
color: #999;
}
ul li .pic img{
width: 100%;
display: block;
}
</style>
</head>
<body>
<ul>
<li>
<div class="pic ">
<img src="http://ruyic.com/blog/uploads/image/201904/155591911913470.png" alt="">
</div>
<div class="words">一行征雁向南飞,八只野猪入关来。野花夺朱非正色,异种草莽也称王。明月有情还顾我,清风不义不留郎。自古胡虏无长运,不信江山不姓唐。——花字号考生甲科第二名</div>
</li>
<li>
<div class="pic">
<img src="http://ruyic.com/blog/uploads/image/202311/169936708299182.jpg" alt="">
</div>
<div class="words">一行征燕向南飞</div>
</li>
<li>
<div class="pic">
<img src="http://ruyic.com/blog/uploads/image/202304/168231454539065.jpg" alt="">
</div>
<div class="words">两袖清风望复明</div>
</li>
<li>
<div class="pic">
<img src="http://ruyic.com/blog/uploads/image/202211/166982358120973.jpg" alt="">
</div>
<div class="words">秋天的柳树,叶儿已枯黄,可依然迎风轻拂这个世界,依然格外柔美,只是美中多了些秋天的伤感。她似乎要挽留征雁,又不忍开口,也不能开口。她只能自己捱过冬天,抽出新条,请春风为她梳妆打扮,再等雁归来</div>
</li>
</ul>
</body>
</html>3、切换登录方式
.container .change:hover{}
.pointer 元素默认是隐藏的,当鼠标移动到 .change 元素上时候在显示
.container .change:hover + .pointer{}
移动到 .change 上去的时候,要找到 .change 下一个兄弟元素,既 .pointer
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>切换登录方式</title>
<style>
*{padding:0;margin:0;}
.container .hidden{
display: none;
}
.container{
height: 300px;
width: 300px;
position: relative;
overflow: hidden;
border: 1px solid #eee;
box-sizing: border-box;
}
.con-login,
.con-qrcode{
margin: 30px 10px 10px 10px;
height: 260px;
width: 280px;
background-color: lightgoldenrodyellow;
}
.change{
position: absolute;
top:10px;
right:10px;
}
.icon{
display: block;
width: 30px;
height: 30px;
cursor: pointer;
}
.icon-pc{
background:url("https://20180416-1252237835.cos.ap-beijing.myqcloud.com/common/2024/duyiedu/icon-pc.png") no-repeat left top/100% 100%;
}
.icon-qrcode{
background:url("https://20180416-1252237835.cos.ap-beijing.myqcloud.com/common/2024/duyiedu/icon-qrcode.png") no-repeat left top/100% 100%;
}
.pointer{
position:absolute;top:10px;right:50px;
height:28px;line-height:28px;
border:1px solid rgba(66, 189, 86, .3);background-color:#f5faf9;
color: #666;
font-size: 13px;
padding: 0 5px;
border-radius: 4px;
}
.container .change:hover + .pointer{
display: block;
}
</style>
</head>
<body>
<div class="container">
<div class="con-login"></div> <!-- 短信登录注册/密码登录 -->
<div class="con-qrcode hidden"></div> <!-- 扫码登录 -->
<div class="change">
<i class="icon icon-qrcode hidden"></i>
<i class="icon icon-pc"></i>
</div>
<div class="pointer hidden">扫码登录</div>
</div>
</body>
</html>4、banner
background: url() no-repeat left top/auto 100%
高度 100%,表示撑满
宽度不设置,auto 表示自动,它会按照高度成比例缩放
span 元素里面是否可以放div元素
搜索 span mdn
打开 https://developer.mozilla.org/...
找到 运行的内容 -> Phrasing content 短语内容
查看是否允许放 div
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>banner</title>
<style>
*{margin:0;padding:0;}
/* 公共样式 */
.left{
float: left;
}
.right{
float: right;
}
.clearfix::after{
content: "";
display: block;
clear: both;
}
.hidden{
display: none;
}
.container {
width: 950px;
min-width: 960px;
margin: 0 auto;
}
/* 公共样式 end */
.banner{
height: 304px;
background:#edf4ed url(http://ruyic.com/blog/uploads/image/202212/166989798079799.jpg ) no-repeat calc(50% - 305px) top/auto 100%;
}
.banner iframe{
width: 300px;
height: 300px;
}
.banner .slogan{
margin-top: 80px;
margin-right: 32px;
}
.banner .slogan .title{
font-size: 25px;
color: #111;
}
.banner .slogan .title span{
margin-left: 5px;
}
.banner .slogan .download{
margin-top: 25px;
}
.banner .slogan .download .btn{
display: inline-block;
line-height: 30px;
width: 115px;
height: 30px;
font-size: 12px;
color: #fff;
text-align: center;
background-color: #00b51d;
}
.banner .slogan .download .qrcode{
display: inline-block; /* 因为有边框必须要设置宽高,要设置宽高必须设置为行块盒 */
width: 28px;
height: 28px;
border: 1px solid #48aa0d;
margin-left: 5px;
vertical-align: bottom; /* 垂直对齐,bottom底端对齐,设置像素值调整也可以 */
position: relative;
}
.banner .slogan .download .qrcode img{
/* 图标自适应 */
width: 100%;
height: 100%;
}
.banner .slogan .download .qrcode .qrcode-img{
display: none;
position: absolute;
left: -1px; /* 包含块是填充盒,所以边框没有遮住,要设置负一 */
top: -1px;
width: 240px; /* 只设置宽度,高度自动增长 */
padding: 15px;
box-sizing: border-box; /* 设置padding后尺寸变了,所以设置该项 */
background: #fff;
font-size: 0;
}
.banner .slogan .download .qrcode .qrcode-img p{
color: #666;
font-size: 13px;
text-align: center;
line-height: 2.4;
}
/* 鼠标移到上面的时候,找到它的后代元素 */
.banner .slogan .download .qrcode:hover .qrcode-img{
display: block;
}
</style>
</head>
<body>
<div class="banner">
<div class="container clearfix">
<iframe src="./text3.html" frameborder="0" class="right"></iframe>
<div class="slogan right">
<h2 class="title">
豆瓣
<span>6.0</span>
</h2>
<div class="download">
<div class="btn">下载豆瓣 App</div>
<div href="javasript:void(0);" class="qrcode">
<img src="//ruyic.com/blog/uploads/image/201904/155591911913470.png"/>
<div class="qrcode-img">
<img src="//ruyic.com/blog/uploads/image/202411/173258829034739.jpg" />
<p>ios / Android 扫码直接登录</p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>5、布局
.section:nth-child(2n) 当遇到双数的元素设置背景, 或者写关键词 even
2n 的意思是,n 从 0 开始自增,也就是从 0 开始乘 2
2 n
2 * 0 = 0
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
....
从 1 开始数元素(不是从0)
1. header
2. banner
3. section
4. ....
前面 .header 和 .banner 会影响后面的 .section
1. 因为 .section:nth-child(2n) 首先会查看前面 .section 选中的元素名称是 div
2. 所以会把前面 .header 和 .banner 拿来一起计算
3. 虽然改变样式,只会改变 .section 选中的元素
解决方法非常简单,把 .section 包起来就不会受到外面的影响了
<div class="header">1 header</div>
<div class="banner">2 banner</div>
<div
<div class="section">3 section</div>
<div class="section">4 section</div>
<div class="section">5 section</div>
<div class="section">6 section</div>
</div>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>布局</title>
<style>
*{padding:0;margin:0;}
/* 通用样式 */
.container{
width: 950px;
margin: 0 auto;
}
.section{
padding: 35px 0;
}
/* 布局样式 */
.header,
.banner{
padding: 35px 0;
border-bottom: 1px solid orange;
}
.section:nth-child(2n){
background: #f7f7f7;
}
</style>
</head>
<body>
<div class="header">1 header</div>
<div class="banner">2 banner</div>
<div class="section">
<div class="container">3 section</div>
</div>
<div class="section">
<div class="container">4 section</div>
</div>
<div class="section">
<div class="container">5 section</div>
</div>
<div class="section">
<div class="container">6 section</div>
</div>
</body>
</html>找到除第一个之外的 span 元素
span:nth-child(n + 2){}
n 从 0 开始,取 0 的时候是第二个元素,取 1 的时候是第三个元素
0 + 2 = 2
1 + 2 = 3
3n 意思是3的倍数,第3个、第6个、第9个应用样式
li:nth-child(3n){
margin-left: 0;
}
6、三栏布局
左边栏,左浮动
右边栏,右浮动
主区域自适应,激活 BFC 就会避开左右两边的浮动的盒子,然后撑满剩余区域
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>三栏布局</title>
<style>
*{padding:0;margin:0;}
/* 通用样式 */
.container{
width: 950px;
margin: 0 auto;
}
.section{
padding: 35px 0;
}
.clearfix::after{
content: "";
display: block;
clear: both;
}
/* 布局样式 */
.section:nth-child(2n){
background: #f7f7f7;
}
.aside-left{
float: left;
width: 100px;
margin-right: 20px;
background-color: lightblue;
}
.aside-right{
float: right;
width: 265px;
margin-left: 30px;
background-color: lightcoral;
}
.main{
overflow: hidden;
zoom:1;
background-color: lightyellow;
}
</style>
</head>
<body>
<div class="section">
<div class="container clearfix">
<div class="aside-right">右边栏</div>
<div class="main">主区域</div>
</div>
</div>
<div class="section">
<div class="container clearfix">
<div class="aside-left">左边栏</div>
<div class="aside-right">右边栏</div>
<div class="main">主区域</div>
</div>
</div>
<div class="section">
<div class="container clearfix">
<div class="aside-left">左边栏</div>
<div class="aside-right">右边栏</div>
<div class="main">主区域</div>
</div>
</div>
</body>
</html>zoom: 1
表示缩放率,值越高就越大,它只是视觉上的效果越大,平时不怎么用
相当于手机上两根手指放大缩小
7、搜索框
边框用外面 div 实现
input 文本框回车就提交,有两种做方法
1. 表单元素 form 里面包 input 元素、button 提交按钮。这样回车就相当于点击了回车按钮
2. js 监控键盘事件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>搜索框</title>
<style>
@import "http://at.alicdn.com/t/c/font_3463133_5bvselrd2ss.css";
*{padding:0;margin:0;}
/* 重置文本框和按钮 */
input,
button{
border: none;
outline: none;
outline-offset: 0;
}
button{
background: initial; /* 重置按钮的背景 */
}
.search{
position:absolute;
top:50%;left:50%;transform:translate(-50%, -50%);
width: 270px;
height: 30px;
border: 1px solid #c3c3c3;
font-size: 0;
}
.search .txt::placeholder{
color: #ccc;
}
.search .txt{
width: 240px;
height: 20px;
font-size: 13px;
padding: 5px;
}
.search button{
position:absolute;
top:0;
right:0;
width: 30px;
height: 30px;
line-height: 30px;
text-align: center;
color: #c3c3c3;
cursor: pointer;
}
.search button .iconfont{
font-size: 13px;
}
</style>
</head>
<body>
<div class="search">
<form>
<input type="text"
class="txt"
maxlength="60" size="12"
placeholder="书籍、电影、音乐、小组、小站、成员" autocomplete="off" name="q"
>
<button>
<i class="iconfont icon-sousuo4"></i>
</button>
</form>
</div>
</body>
</html>::placeholder 伪元素选择器
文本框、下拉列表的字体大小是 13.33333
8、播放字体图标居中
字体图标在 div 里面加了一个 before,我们需要设置 before 的样式
1. 设置绝对定位,然后宽高撑满,
2. 背景颜色半透明
3. 设置居中
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>播放字体图标居中</title>
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_3463133_ykqifpbf36.css" />
<style>
*{margin:0;padding:0;}
li{list-style: none;}
.video-main{
width: 840px;
}
.video-main li{
width: 250px;
display: inline-block;
vertical-align: top; /* 顶端对齐 */
margin-right: 36px;
}
.video-main li:nth-child(3n){ /* 选中3的倍数 */
margin: 0;
}
.video-main li img{
width: 100%;
display: block;
}
.video-main li .pic{
display: block;
position: relative;
}
.video-main li .pic::before{
position: absolute;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .2);
color: #fff;
text-align: center;
/* line-height: calc(); */
font-size: 24px;
}
.video-main li .words{
font-size: 13px;
line-height: 1.5;
color:#333;
text-align: center;
}
</style>
</head>
<body>
<div class="video-main">
<ul>
<li>
<a href="javascript:void(0);" class="pic iconfont icon-bofang">
<img src="http://ruyic.com/blog/uploads/image/202211/166982358120973.jpg" alt="" />
</a>
<p class="words">江西广昌农家莲子</p>
</li>
<li>
<a href="javascript:void(0);" class="pic iconfont icon-bofang">
<img src="http://ruyic.com/blog/uploads/image/202506/174884932380084.jpg" alt="" />
</a>
<p class="words">江西广昌农家莲子</p>
</li>
<li>
<a href="javascript:void(0);" class="pic iconfont icon-bofang">
<img src="http://ruyic.com/blog/uploads/image/202212/166989798079799.jpg" alt="" />
</a>
<p class="words">江西广昌农家莲子</p>
</li>
</ul>
</div>
</body>
</html>
<script>
document.addEventListener('DOMContentLoaded', function() {
// 获取高度,然后设置行高
var pic = document.querySelectorAll(".pic");
for(var i = 0; pic.length > i; i++){
console.log(pic[i].clientHeight);
pic[i].style.lineHeight = pic[i].clientHeight + "px";
}
});
</script>