CSS卡片布局和动画

卡片布局

css实现卡片布局一般用grid比较方便。如果需要实现响应式那就需要用到媒体查询。

屏幕的常用宽度

  1. 320px:智能手机
  2. 768px:iPad横屏
  3. 1024px:大屏笔记本
  4. 1440px:大屏电脑桌面

屏幕适配区间

一般屏幕适配的区间没有固定限制,可以由开发者自己定义。由于媒体查询定义的代码遵循从上到下的依次匹配的规则,所以为了便于书写方便,我们可以这样写:

  • mix-width:从上到下数值依次增大
  • max-width:从上到下数值依次减小

也就是:

@media screen and (min-width: 320px) {
  html {
    font-size: 10px;
  }
}

@media screen and (min-width: 768px) {
  html {
    font-size: 12px;
  }
}

@media screen and (min-width: 992px) {
  html {
    font-size: 16px;
  }
}

@media screen and (min-width: 1200px) {
  html {
    font-size: 18px;
  }
}

@media screen and (min-width: 1600px) {
  html {
    font-size: 20px;
  }
}

如果用max-width就需要从上到下数值依次减小的写。当然,也可以不适用从上至下依次匹配的规则,这样就可以随便写,但是需要把区间写全,比如以下这个表示最小宽度为320px最大宽度为700px的屏幕。

@media screen and (min-width: 320px) and (max-width: 700px) {
  html {
    font-size: 10px;
  }
}

rem的使用

rem是用于响应式布局的常用单位,1rem和1*(html元素的字体大小)是等价的。我们使用rem一般会先定义媒体查询,然后设置不同屏幕对应的html元素的字体大小,然后在普通元素的样式上用rem单位来设置字体大小、宽高等属性。但是,在特定的使用场景中,我们无法做到使用一套css和一套定义了html字体的媒体查询代码来适配所有的屏幕,所以,我们还是会直接在对应的媒体查询里面对元素的样式进行分别设置。

rem实现卡片响应式

<div class="card-list">
    <div class="card">
      <div>
        <h3>Card Title</h3>
        <p>Card2</p>
      </div>
    </div>
    <div class="card">
      <div>
        <h3>Card Title</h3>
        <p>Card2</p>
      </div>
    </div>
    <div class="card">
      <div>
        <h3>Card Title</h3>
        <p>Card2</p>
      </div>
    </div>
    <div class="card">
      <div>
        <h3>Card Title</h3>
        <p>Card2</p>
      </div>
    </div>
    <div class="card">
      <div>
        <h3>Card Title</h3>
        <p>Card2</p>
      </div>
    </div>
    <div class="card">
      <div>
        <h3>Card Title</h3>
        <p>Card2</p>
      </div>
    </div>
    <div class="card">
      <div>
        <h3>Card Title</h3>
        <p>Card2</p>
      </div>
    </div>
  </div>
.card-list {
  display: grid;
  /* grid-column-gap: 2rem; */
  grid-row-gap: 1.8rem;
}

.card-list .card {
  display: flex;
  justify-content: center;
  align-items: center;
}

.card-list .card>div {
  width: 20rem;
  height: 15rem;
  background-color: pink;
  border: 1px solid #ccc;
  text-align: center;
}

@media screen and (min-width: 320px) {
  html {
    font-size: 10px;
  }

  .card-list {
    grid-template-columns: 1fr;
  }
}

@media screen and (min-width: 768px) {
  html {
    font-size: 12px;
  }

  .card-list {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media screen and (min-width: 992px) {
  html {
    font-size: 16px;
  }

  .card-list {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media screen and (min-width: 1200px) {
  html {
    font-size: 18px;
  }

  .card-list {
    grid-template-columns: repeat(3, 1fr);
  }
}

@media screen and (min-width: 1600px) {
  html {
    font-size: 20px;
  }

  .card-list {
    grid-template-columns: repeat(4, 1fr);
  }
}

CSS动画

css有两种动画:

  1. transition动画:仅限于元素过渡效果的动画
  2. keyframes动画:可以实现元素复杂的所有动画效果

transition动画

.box {
  width: 100px;
  height: 100px;
  background-color: red;
  transition: background-color 1s ease;
  /* 这里background-color可以改成all,也就是所有过渡属性都加上动画 */
}

.box:hover {
  background-color: blue;
}

一般transition用于元素被hover时的动画效果,它和元素被操作的事件相关。

transform属性可以让元素实现放大、缩小、旋转、换位等效果,通常也可以和transition动画一起使用。比如:

.box {
  width: 100px;
  height: 100px;
  background-color: red;
  transition: transform 1s ease;
}

.box:hover {
  transform: scale(1.2);
}

总的来说,transition动画的实现分为两步:

  1. 定义元素的过渡效果,如hover等。
  2. 给元素加上transition属性设置元素的过渡动画。

keyframes动画

keyframes动画一般是定义元素从渲染开始就存在的动画效果,并不是和transition一样定义的是元素上的事件效果。
keyframes定义动画名:

@keyframes [动画名]{
  [百分数] {
    /*经过百分数的状态(至少要定义一个初始状态和一个最终状态两个状态)*/
  }
}

下面是给box定义一个旋转360度的动画效果:

.box {
  width: 100px;
  height: 100px;
  background-color: red;
  animation: rotate 2s linear infinite;
}

@keyframes rotate {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

总的来说,keyframes动画的实现也分为两步:

  1. 使用@keyframes定义一个动画的过程。
  2. 在需要动画的元素上增加一个animation属性,将已经定义好的keyframes动画作为属性值写到animation中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值