CSS(8)---通俗讲解定位(position)

CSS(8)---通俗讲解定位(position)

CSS有三种基本的定位机制: 普通流浮动定位。前面两个以前已经讲过,详见博客:css

一、CSS(5)---通俗讲解盒子模型html

二、CSS(6)---通俗讲解浮动(float)算法

三、CSS(7)--- 通俗讲解清除浮动浏览器

1、为何要用定位?

若是说浮动关键在一个 “浮” 字上面, 那么 咱们的定位,关键在于一个 “位” 上。post

咱们来思考下定位用于的场景。url

一、打Log标签

好比你想在商品的图片想打个标签好比:包邮、最新上架等等。3d

怎么作比较好呢,若是你要粗暴那就直接ps在图片上添加标签。只是这样有个很大的弊端,好比你要添加新标签你须要重现修图,好比商品以前包邮后面不包邮了,code

那你又须要从新p图。这样确定是不合适的。那怎么作比较合适?htm

其实很简单,将商品图片和标签的标签分开来。而后经过css在商品图片上添加标签。这个时候一般会定位去完成。对象

二、切换Banner

有些商城的首页都会有个Banner,这里 左右的箭头下面的小点点通常也是用定位来作。

三、广告位窗口

有些位置在左右侧会有固定的广告窗口,不论怎么滑动页面这个广告窗口都是在固定位置

这个就须要用到固定定位了。


2、定位概念

一、定位的分类

在CSS中,position 属性用于定义元素的定位模式,其基本语法格式以下:

选择器 {position:属性值;}

属性值

这里还有个概念就是 边偏移 由于你定位确定要指定定位在哪里,因此须要经过 边偏移 来指定。

因此定位是要和边偏移搭配使用的。不过对于static(静态定位)设置边偏移是无用的。

二、静态定位(static)

static 是此属性的默认值。这时候,咱们称那个元素没有被定位。简单来讲就是网页中全部元素都默认的是静态定位。 其实就是标准流的特性。

因此若是须要使用定位那这里就不能是这个默认值了。

注意 在静态定位状态下,此时 top, right, bottom, left 和 z-index 属性无效。

三、相对定位(relative)

它的主要特色以下

一、 参照元素原来的位置进行移动。
二、 经过"left"、 "top"、 "right"、 "bottom" 属性进行定位。
三、 元素原有的空间位保留。
四、 元素在移动时会盖住其余元素。

举例说明

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>相对定位</title>
        <style type="text/css">
            #one {
                width: 120px;
                height: 120px;
                background: #E19D59;
            }
            #two {
                width: 120px;
                height: 120px;
                background: #FF0000;
                position: relative;   /*设置相对定位*/
                left: 20px;           /*设置距离左边偏移位置*/
                top: 20px;            /*设置距离顶部偏移位置*/
            }
            #three {
                width: 120px;
                height: 120px;
                background: #008000;
            }
        </style>
    </head>
    <body>      
        <div id="one">div1</div>
        <div id="two">div2</div>
        <div id="three">div3</div>        
    </body>
</html>

运行结果

经过咱们这个示例咱们能够看出

一、它的左右,上下边偏移的量是根据这个div2原始位置基础上进行移动的。
二、这个div2它仍是个标准流,并无浮起来,因此这个位置它仍是占有的。(若是div2浮动那么div3就会向上移动,这里显然没有)
三、当它偏移后 若是和其它元素有重叠,它会覆盖其它元素。(div2覆盖了部分div3元素)

做用 个人理解相对定位主要用途是用来给绝对定位的一个盒子。(下面会解释这句话)

四、绝对定位absolute

特色

一、参照距离他最近的有定位属性的父级元素进行移动
二、经过"left"、 "top"、 "right"、 "bottom" 属性进行定位
三、元素彻底脱离文档流,原有位置再也不保留
四、元素在移动时会盖住其余元素
五、通常咱们设置绝对定位时,都会找一个合适的父级将其设置为相对定位。最好为这个具备相对定位属性的父级设置宽高

举例说明

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
           #father{
                width: 400px;
                height: 400px;
                margin: 100px;
               /*  position: relative;*/
                background: yellow;
            }
            #bd1{
                width: 120px;
                height: 120px;
                background: #E19D59;
            }
            #bd2{
                width: 120px;
                height: 120px;
                background: #FF0000;
                position: absolute;
                left: 20px;
                top: 20px;
            }
            #bd3{
                width: 120px;
                height: 120px;
                background: #008000;
            }
        </style>
    </head>
    <body>  
    <div id="father"> 
        <div id="bd1">div1</div>
        <div id="bd2">div2</div>
        <div id="bd3">div3</div>  
    </div>         
    </body>
</html>

运行结果

从这幅图能够看出一点

这里由于父div没有设置定位,因此它的位置是相对于body进行边偏移。

这个时候咱们将父标签设置 position: relative;

再刷新页面

从这张图很直观看到:

一、由于父div设置了定位,因此这里的边偏移变成都是相对于父div进行偏移(正常贴标签就是这样)
二、咱们能够看出当设置绝对定位后,该元素已经脱离文档流,已经浮上来了(由于div2上浮全部div3才会上移)
三、元素在移动时会盖住其余元素 (div2覆盖了部分div3)

五、固定定位(fixed)

特色

一、以body为定位时的对象,老是根据浏览器的窗口来进行元素的定位
二、经过"left"、 "top"、 "right"、 "bottom" 属性进行定位
三、元素彻底脱离文档流,原有位置再也不保留
四、元素不会随着文档流的滑动而滑动

固定定位最大的特色就是第一点,能够理解成它是以可视区域为准,会一直显示在可视区域,屏幕滑动也会显示在定位的位置。

六、四种定位总结

还有比较重要的三点

定位模式转换

跟 浮动同样, 元素添加了 绝对定位和固定定位以后, 元素模式也会发生转换, 都自动转换为 行内块元素。

绝对定位的盒子水平/垂直居中

注意 普通的盒子是左右margin 改成 auto就可, 可是对于绝对定位就无效了。

定位的盒子也能够水平或者垂直居中,有一个算法(下面会举例说明)。

1. 首先left 50%   父盒子的一半大小
2. 而后走本身外边距负的一半值就能够了 margin-left。

子绝父相

这句话的意思是 子级是绝对定位的话,父级要用相对定位

为何会有这个概念,那是由于绝对定位的边偏移特色是

若是父元素没有设置定位,那么它的位置是相对于body进行边偏移。若是父元素设置定位,那就根据父元素偏移。

通常咱们确定是但愿根据父元素偏移。就比如图片打标签,不可能跟着body偏移而是父元素进行定位。并且父元素相对定位最大的好处就是它会占有位置,所以父亲最好是 相对定位。


3、经典示例

一、打上log标记

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>log标签</title>
    <style>
    div {
        width: 310px;
        height: 190px;
        border: 1px solid #ccc;
        margin: 100px auto; 
        position: relative;  /*父选择相对定位*/
    }
    .top {
        position: absolute; /*子取相对定位*/
        top: 0;             /*位置 左上*/
        left: 0;
    }
    
    </style>
</head>
<body>
    <div>
        <img src="images/log.jpg" alt="" class="top">     <!-- log的图片 -->
        <img src="images/goods.jpg" height="190" width="310" alt=""> <!-- 商品图片,长和宽和父div大小一致 -->
    </div>
</body>
</html>

运行结果就是上面的最终结果。

二、定位水平居中

加了定位 浮动的的盒子 margin 0 auto 失效了

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>水平居中</title>
    <style>
    div {
        width: 200px;
        height: 200px;
        background-color: pink;
        position: absolute;
        /*加了定位 浮动的的盒子  margin 0 auto 失效了*/
        left: 50%;
        margin-left: -100px;  /*减去总宽度通常*/
        top: 50%;
        margin-top: -100px;   /*减去总高度通常*/
    }
    </style>
</head>
<body>
    <div></div>
</body>
</html>

这个这个div就处于整个页面的居中了,这里咱们来讲明下下面这两个的意思

left: 50%;
        margin-left: -100px;  /*减去总宽度通常*/

三、轮播图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轮播图</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    li {
        list-style: none;
    }
    .tb {
        width: 520px;
        height: 280px;
        background-color: pink;
        margin: 100px auto;
        position: relative;
    }
    .tb a {
        width: 24px;
        height: 36px;
        
        display: block;
        position: absolute;
        top: 50%;
        margin-top: -18px;
    }
    .left {
        left: 0;
        background: url(images/left.png) no-repeat;
    }
    .right {
        right: 0;
        background: url(images/right.png) no-repeat;
    }
    .tb ul {
        width: 70px;
        height: 13px;
        background: rgba(255, 255, 255, .3);
        position: absolute; /* 加定位*/
        bottom: 18px;
        left: 50%; /*水平走父容器的一半*/
        margin-left: -35px; /*左走本身的一半*/
        border-radius: 8px;
    }
    .tb ul li {
        width: 8px;
        height: 8px;
        background-color: #fff;
        float: left;
        margin: 3px;
        border-radius: 50%;
    }
    .tb .current {
        background-color: #f40;
    }
    </style>
</head>
<body>
    <div class="tb">
        <img src="images/tb.jpg" >
        <a href="#" class="left"></a>
        <a href="#" class="right"></a>
        <ul>
            <li class="current"></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>

    </div>
</body>
</html>

运行结果


参考

一、w3school之CSS 定位 (Positioning)

二、CSS 定位(postion、z-index)




你若是愿意有所做为,就必须善始善终。(10)
相关文章
相关标签/搜索