5.定位、动画

110 阅读3分钟

定位

一、为什么需要定位

定位:可以实现将元素放置到网页上任意位置

如果想实现下面的效果, 只靠浮动是没有办法实现的

像上面这种, 让一个盒子固定在某个位置的情况, 需要使用定位来实现

二、什么是定位

定位也是用来布局的,它有两部分组成:

定位 = 定位模式 + 边偏移

定位模式包括:

  • 绝对定位: posistion: absolute
  • 相对定位: position: relative
  • 固定定位: position: fixed

边偏移包括

边偏移属性示例描述
toptop: 80px顶端偏移量,定义元素相对于其父元素上边线的距离
bottombottom: 80px底部偏移量,定义元素相对于其父元素下边线的距离
leftleft: 80px左侧偏移量,定义元素相对于其父元素左边线的距离
rightright: 80px右侧偏移量,定义元素相对于其父元素右边线的距离

定位的盒子有了边偏移才有价值。 一般情况下,凡是有定位地方必定有边偏移。

三、定位模式详解

1、相对定位

相对定位参考自己在标注流中的位置偏移

特点

  1. 相对于自己原来在标准流中位置来移动的
  2. 原来在标准流的区域继续占有,后面的盒子仍然以标准流的方式对待它

2、绝对定位

  • 绝对定位参考最近的带有定位的父级元素偏移
  • 如果父级没有定位, 就参考浏览器的左上角偏移

  • 如果父元素有定位, 参考父元素的左上角偏移

例子

规律

如果给一个元素设置绝对定位, 一定要记得给其父元素设置相对定位, 否则会出现意料之外的情况

简记: 子绝父相 —— 子级绝对定位,父级要用相对定位

3、固定定位fixed

固定定位参考浏览器可视窗口偏移

语雀右下角的小工具

四、z-index

Tips:设置元素的堆叠顺序

z-index的规则,那个元素的值大那个就在最上面。

五、练习

1、定位居中(x轴上的居中效果)

transform: translatex(-50%)中的50%为元素自身的50%。

.warpper{
            position: relative;
            top: 50%;
            /* 定位居中:left: 50%   transform: translateX(-50%);*/
            left: 50%;
            transform: translateX(-50%);
            /* margin: 500px auto; */
            width: 561px;
            height: 44px;
            border-radius: 20px;
            box-shadow: 0px 3px 13px 6px rgba(0, 0, 255, .2);
            padding-left: 30px;
        }

2、定位居中(y轴上的居中效果)

.micro{
            position: absolute;
            right: 71px;
            top: 50%;
            transform: translateY(-50%);
        }

3、定位居中(同时居中)

top: 50%;
left: 50%;
transform: translate(-50%,-50%);

动画

一、浏览器解析步骤

(如何做css动画的优化,步骤如下:)

二、keyframes

(1)一种写法是from to

from to写法定义动画trans-auto

横着动

<style>
        *{
            margin: 0;
            padding: 0;
        }
        /* from to写法定义动画trans-auto */
        @keyframes trans-auto {
            from{
                transform: translateX(0%);
            }
            to{
                transform: translateX(100%);
            }
        }
        .box{
            width: 100px;
            height: 100px;
            background-color: red;
            animation: trans-auto 2s linear infinite;
        }
        
    </style>
<body>
    <div class="box"></div>
</body>

斜着动

<style>
*{
    margin: 0;
    padding: 0;
}
/* from to写法定义动画 */
@keyframes trans-auto {
    from{
        transform: translateX(0%);
    }
    to{
        transform: translateX(200%);
    }
}
@keyframes trans-all{
    from{
        transform: translate(0%,0%);
    }
    to{
        transform: translate(200%,200%);
    }
}
.box{
    width: 100px;
    height: 100px;
    background-color: red;
    /* 使用动画:动画名称 动画持续时间 动画算法:linear线性 循环次数1,2,3,infinite循环播放*/
    animation: trans-all 2s linear infinite;
}

</style>

(2)一种写法是百分数

@keyframes up-dowm{
    0%{
        transform: translate(0%,0%);
    }
    20%{
        transform: translate(0%,40%);
    }
    50%{
        transform: translate(20%,-20%);
    }
    70%{
        transform: translate(100%,100%);
    }
}

animation参数

animation: 时长|过渡方式 |延迟次数|方向| 填充模式|是否暂停| 动画名

时长: 1s 或者 1000ms

过渡方式:跟 transition 取值一样,如 linear

次数:3 或者 2.4 或者infinite

方向: reverse|alternate|alternate-reverse

填充模式: none forwards backwards both

是否暂停: paused running