Go to comments

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>



Leave a comment 0 Comments.

Leave a Reply

换一张