css笔记

69 阅读7分钟

定位

  • static 基础定位
  • relative 相对定位,通过top,left,right,bottom调整位置,但仍占用原来的位置。
  • absolute 绝对定位,飞到天上,默认以body为参考,要以谁为参考需将父元素调为非static(通常采用relative,影响最小)
  • 可使用z-index调节非static元素的层叠关系
  • fixed 参考点为屏幕左上角,不受滚动条影响

二级菜单

二级菜单的li直接写在一级菜单的li中,设置为display:none; position:absolute;相对导航栏定位,导航栏设为relative。
悬停显示:.nav>ul>li:hover ul { display: block; }

响应式

Flexbox 布局:灵活的容器布局

Flexbox(弹性盒子布局)是 CSS3 中推出的一种布局模型,它允许容器内的元素在一个方向上灵活地分配空间。Flexbox 最适合用于一维布局,解决了传统布局方式中的很多问题。

  • Flexbox 基本概念 Flexbox 的核心概念是“容器”和“项目”。在 Flexbox 中,容器内的项目会沿着主轴或交叉轴对齐和分布。
    常用的 Flexbox 属性有:
    display: flex:启用 Flexbox 布局。
    flex-direction:设置主轴方向(默认水平,row),还可以设置为 column(垂直方向)。
    justify-content:设置主轴上的对齐方式。
    align-items:设置交叉轴上的对齐方式。
  • 实际应用
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
</div>
 
<style>
  .container {
    display: flex;
    justify-content: space-between; /* 主轴方向上的间距分布 */
    align-items: center; /* 交叉轴方向上的对齐 */
  }
  .item {
    padding: 10px;
    background-color: #4CAF50;
    color: white;
  }
</style>  
  • 响应式设计 Flexbox 非常适合响应式布局,可以轻松调整布局元素的对齐方式或排列顺序。例如,可以利用 flex-wrap 使容器中的元素在小屏幕上换行。 .container { display: flex; flex-wrap: wrap; /* 元素换行 */ }

Grid 布局:二维网格布局

CSS Grid 布局适用于二维布局(即同时处理行和列)。它可以让你更加精确地控制布局。

  • Grid 布局允许你定义一个容器的行和列,并将项目放置在这些行列交汇的区域内。常用的 Grid 属性包括:

display: grid:启用 Grid 布局。 grid-template-rows / grid-template-columns:定义网格的行和列。 grid-gap:设置网格项之间的间距。 = 实际应用

<div class="grid-container">
  <div class="grid-item">Item 1</div>
  <div class="grid-item">Item 2</div>
  <div class="grid-item">Item 3</div>
  <div class="grid-item">Item 4</div>
</div>
 
<style>
  .grid-container {
    display: grid;
    grid-template-columns: repeat(2, 1fr); /* 两列布局 */
    grid-gap: 10px;
  }
  .grid-item {
    padding: 10px;
    background-color: #2196F3;
    color: white;
  }
</style>
  • 响应式设计 Grid 也能很好地支持响应式设计,通过 media query 动态调整网格的行列数:
@media (max-width: 600px) {
  .grid-container {
    grid-template-columns: 1fr; /* 小屏幕下只显示一列 */
  }
}

媒体查询(Media Queries):根据设备调整布局

媒体查询是 CSS 中一种非常重要的响应式设计工具。它可以根据不同的屏幕尺寸、分辨率等条件应用不同的样式。

  • 媒体查询基本语法 媒体查询通过 @media 规则进行定义,可以根据设备的宽度、像素密度等条件加载不同的 CSS 样式:
@media (max-width: 768px) {
  /* 在屏幕宽度小于 768px 时应用 */
  .container {
    flex-direction: column; /* 切换为纵向布局 */
  }
}

百分比布局:灵活的相对单位

百分比布局是一种常见的响应式布局方式,尤其适用于需要根据容器的宽度或高度自适应调整的场景。

  • 使用百分比作为宽度和高度单位,可以使元素根据父容器的大小自动调整。它非常适合那些需要自适应屏幕大小的布局。比如,在小屏幕下,我们可以调整元素的百分比宽度:
@media (max-width: 600px) {
  .item {
    width: 100%; /* 小屏幕时占满全宽 */
  }
}

rem/em 布局:相对单位的使用

rem 和 em 是相对单位,相比像素(px)单位,它们具有更好的响应性和灵活性。rem 是相对于根元素(html)的字体大小,em 是相对于父元素的字体大小。

  • 默认html的font-size是16px,即1rem=16px,如果某div宽度为32px你可以设为2rem。

通常情况下,为了便于计算数值则使用62.5%,即默认的10px作为基数。设置方法如下: Html{font-size:62.5%}

  • 响应式设计 通过调整根元素的字体大小,可以实现全局的响应式调整:
html,body{ height: 100%; margin: 0; padding: 0; font-size: 14px;}//注意初始样式必须写在最顶部!!!!如果写在媒体查询底部的话就会覆盖上方的媒体查询(因为是层叠样式表嘛~)
@media screen and (max-width:320px ) {
    html{font-size: 12px;}
}
@media screen and (min-width:321px) and (max-width:750px ) {
    html{font-size: 14px;}
}
@media screen and (min-width:751px ) {
    html{font-size: 16px;}
}

vw/vh 单位的使用:视口相对单位

vw(视口宽度)和 vh(视口高度)是相对于视口的宽度和高度的单位。它们可以用于实现全屏或自适应布局,尤其在响应式设计中非常有用。

  • vw/vh 的应用
<div class="container">
  <div class="item">Item 1</div>
</div>
 
<style>
  .container {
    width: 100vw; /* 宽度为视口的100% */
    height: 100vh; /* 高度为视口的100% */
  }
  .item {
    font-size: 5vw; /* 字体大小为视口宽度的5% */
  }
  @media (max-width: 600px) {
  .item {
    font-size: 8vw; /* 小屏幕时字体变大 */
  }
}
</style>

CSS 框架:Bootstrap 和 Tailwind 的布局方案

在实际项目中,CSS 框架如 Bootstrap 和 Tailwind CSS 提供了现成的响应式布局工具,可以大大简化布局工作。

  • Bootstrap 布局 Bootstrap 提供了响应式的网格系统,可以轻松实现响应式布局。
<div class="container">
  <div class="row">
    <div class="col-md-4">Item 1</div>
    <div class="col-md-4">Item 2</div>
    <div class="col-md-4">Item 3</div>
  </div>
</div>
  • Tailwind CSS 布局 Tailwind CSS 提供了丰富的响应式设计类,可以根据不同的屏幕大小调整布局:
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
</div>

伪元素

::before或::after都必须和content属性结合使用,content不能没有,内容至少为空;伪元素的display默认为inline,可以自己改.

用法

1.利用content的值:

(1)content:“字符串”; 可以统一在字前面或后面加一些字符
(2) content:url(…) 可以在字前面加一些小的图标,通过定位把位置调合适
(3)通过attr()属性调用当元素的属性,比如将图片alt提示文字或者链接的href地址显示出来。 attr() 函数返回选择元素的属性值。

image.png

a::after{
    content:"(" attr(href) ")";
}
p:after{
    content:attr(class);
}
<p><a href="https://wx.qq.com/">微信</a></p>
<p class="hello"></p>

2.实现对话框效果:

image.png

<style>
        .left,.right{
                position: relative;   
                display: table;
                min-height: 40px;
                text-align: center;
                background-color: #9EEA6A;
                margin: 0;
                border-radius: 7px;
        }
        .left{
                left:10px;
        }
        .left::before,.right::after{
                position: absolute;
                display: inline-block;
                content: "";
                width: 0px;
                height: 0px;
                border: 8px solid transparent;   //盒子宽高为0时边框即为宽高
                top: 15px;	/*移到中间*/
        }
        .left::before{
                border-right-color: #9EEA6A;
                left: -16px;
        }
        .right::after{
                border-left-color: #9EEA6A;
                right: -16px;
        }
        .left p,.right p{
                padding:0px 10px;
        }
        .right{
                right:-150px;
        }
</style>
    <div class="left">
        <p>你好啊</p>
    </div>
    <div class="right">
        <p>好久不见~</p>
    </div>

3.实现箭头

image.png

.box{
       position: relative;
       width: 200px;
       height: 50px;
       background-color: pink;
}
.box::before{
       position: absolute;
       content:"";
       width: 12px;
       height: 12px;
       border: 1px solid black;
       border-bottom-color: transparent;
       border-right-color: transparent;
       transform: translate(-50%, -50%) rotate(-45deg);
       left: 20px;
       top: 50%;
}
<body>
   <div class="box"></div>
</body>

4.清除浮动

原理:利用:after和:before在元素内部插入两个元素块,从而达到清除浮动的效果。

.outer:after { 
        clear:both; 	/*清除浮动*/
        content:'';
        display:block; /*显示伪元素*/
        width:0;		
        height:0;		/*不占位置*/
        visibility:hidden; 	/*允许浏览器渲染它,但是不显示出来*/
}

5.画分割线:画一条分割线

image.png

<style>
    * {
      padding: 0;
      margin: 0;
    }
    .spliter::before, .spliter::after {
      content: '';
      display: inline-block;
      border-top: 1px solid black;
      width: 200px;
      margin: 5px;
    }
  </style>
</head>
<body>
  <p class="spliter">分割线</p>
</body>