zoukankan      html  css  js  c++  java
  • CSS——day5——定位

    定位

    目标

    * **理解**
      * 能说出为什么要用定位
      * 能说出定位的4种分类
      * 能说出四种定位的各自特点
      * 能说出我们为什么常用子绝父相布局
    * **应用**
      * 能写出淘宝轮播图布局

    一、CSS布局的三种机制

     网页布局的核心 —— 就是**用 CSS 来摆放盒子位置**

    CSS 提供了 **3 种机制**来设置盒子的摆放位置,分别是**普通流**、**浮动**和**定位**,其中:

    1. **普通流**(**标准流**

    2. **浮动**

       * 让盒子从普通流中****起来 —— **让多个盒子(div)水平排列成一行**。

    3. **定位**

       * 将盒子****在某一个****置  自由的漂浮在其他盒子的上面  —— CSS 离不开定位,特别是后面的 js 特效。

    二、为什么使用定位

    1.  小黄色块**在图片上移动,**吸引用户的眼球

    2. 当我们滚动窗口的时候,盒子是固定屏幕某个位置的

     

    例如下面这种效果:图片中的两个左右箭头不能使用浮动,因为浮动不能盖住文字和图片,只能使用定位

    将盒子****在某一个****置  自由的漂浮在其他盒子(包括标准流和浮动)的上面 

    所以,我们脑海应该有三种布局机制的上下顺序

    标准流在最底层 (海底)  -------    浮动 的盒子 在 中间层  (海面)  -------   定位的盒子 在 最上层  (天空)

    三、定位详解

    定位 = 定位模式 + 边偏移

    3.1 边偏移

    3.2 定位模式

    选择器 { position: 属性值; }

     3.2.1 静态定位

    - **静态定位**是元素的默认定位方式,无定位的意思。它相当于 border 里面的none, 不要定位的时候用。

    - 静态定位 按照标准流特性摆放位置,它没有边偏移。

    - 静态定位在布局时我们几乎不用的

    3.2.2 相对定位(重要)

    相对定位的特点:(务必记住)

    - 相对于 自己原来在标准流中位置来移动的

    - 原来**在标准流的区域继续占有**,后面的盒子仍然以标准流的方式对待它。

    3.2.3 绝对定位(重要)

    **绝对定位**是元素以带有定位的父级元素来移动位置 (拼爹型)

    1. **完全脱标** —— 完全不占位置;  

    2. **父元素没有定位**,则以**浏览器**为准定位(Document 文档)。

    3. **父元素要有定位**

       * 将元素依据最近的已经定位(绝对、固定或相对定位)的父元素(祖先)进行定位。

    绝对定位的特点:(务必记住)
    
    - 绝对是以带有定位的父级元素来移动位置 (拼爹型) 如果父级都没有定位,则以浏览器文档为准移动位置
    
    - 不保留原来的位置,完全是脱标的。

     

    因为绝对定位的盒子是拼爹的,所以要和父级搭配一起来使用。

     如果父元素没有定位,就以文档为准移动位置,如果父元素有定位,就以父元素为准移动位置

     

    口诀:子绝父相

     为什么子元素使用绝对定位,父元素要使用相对定位呢?

    例如上面的图片案例,有上下两个盒子,第一个盒子左右两端有两个箭头,把鼠标放在肩头上,箭头下面的图片可以左右滚动

    要实现这种效果,第一个盒子的箭头元素必须使用绝对定位,第一个盒子也要使用一个定位,假如使用绝对定位,由于绝对定位不占位置,第一个盒子加上绝对定位以后,第二个盒子就会上浮占据第一个盒子的位置,因此需要使用相对定位,相对定位是占有位置的,下面第二个盒子就不会上浮

    1. **方向箭头**叠加在其他图片上方,应该使用**绝对定位**,因为**绝对定位完全脱标**,完全不占位置。

    2. **父级盒子**应该使用**相对定位**,因为**相对定位不脱标**,后续盒子仍然以标准流的方式对待它。

       * 如果父级盒子也使用**绝对定位**,会完全脱标,那么下方的**广告盒子**会上移,这显然不是我们想要的。

     

    **结论**:**父级要占有位置,子级要任意摆放**,这就是**子绝父相**的由来。

    3.2.4 固定定位(重要)

    固定定位**是**绝对定位**的一种特殊形式: (认死理型)   如果说绝对定位是一个矩形 那么 固定定位就类似于正方形

    1. **完全脱标** —— 完全不占位置;

    2. 只认**浏览器的可视窗口** —— `浏览器可视窗口 + 边偏移属性` 来设置元素的位置;

       * 跟父元素没有任何关系;单独使用的

       * 不随滚动条滚动。

    四、定位的扩展

    4.1 绝对定位/固定定位的盒子居中

    绝对定位/固定定位的盒子**不能通过设置 `margin: auto` 设置**水平居中

    1. `left: 50%;`:让**盒子的左侧**移动到**父级元素的水平中心位置**;

    2. `margin-left: -100px;`:让盒子**向左**移动**自身宽度的一半**

    3.此外,在CSS3中有一个translate值,可以实现盒子移动自身宽度的一半,这个方法在移动web端尤其针对盒子宽度不确定的时候可以使用

    transform: translate(-50%);

    4.2 堆叠顺序

    `z-index` 的特性如下:

    1. **属性值**:**正整数**、**负整数**或 **0**,默认值是 0,数值越大,盒子越靠上;

    2. 如果**属性值相同**,则按照书写顺序,**后来居上**;

    3. **数字后面不能加单位**。

     

    **注意**:`z-index` 只能应用于**相对定位**、**绝对定位**和**固定定位**的元素,其他**标准流**、**浮动**和**静态定位**无效。

    4.3 改变display属性

    display 是 显示模式, 可以改变显示模式有以下方式:

     

    * 可以用inline-block  转换为行内块

    * 可以用浮动 float 默认转换为行内块(类似,并不完全一样,因为浮动是脱标的)

    * 绝对定位和固定定位也和浮动类似, 默认转换的特性 转换为行内块。

    行内块的宽度默认是内容的宽度

    一个行内的盒子,如果加了**浮动**、**固定定位**和**绝对定位**,不用转换,就可以给这个盒子直接设置宽度和高度

     

    定位的盒子很多情况下需要单写宽度,如果需要通栏,宽度给100%

    五、淘宝轮播图案例分析

    分析:

    第一步.、确定布局

    一个大盒子先装里面包括四个子盒子:一张图片、两个左右箭头、一个轮播盒子

    <body>
        <div class="taobao">
            <!-- 左按钮 -->
            <!-- 浮动压不住图片和文字,定位可以 -->
            <a href="#" class="arr-l"> < </a>
            <!-- 图片 -->
            <img src="images/taobao.jpg" alt="">
            <!-- 右按钮 -->
            <a href="#" class="arr-r"> > </a>
            <!-- 小圆点 -->
            <ul class="circle">
                <li></li>
                <li class="current"></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>
    </body>

    第二步、左右箭头盒子

    由于箭头盒子是要位于图片上方

    1.标准流无法实现这种布局

    2.如果使用浮动,因为图片和文字是不能被覆盖住的,因此不能使用浮动

    3.使用定位,如果使用相对定位,子盒子在标准流中的位置仍然会保存

    使用绝对定位,子盒子在标准流中的位置不会被保存——因此使用绝对定位(子绝父相)

    4. 圆角矩形的设置

    圆角矩形可以为4个角分别设置圆度, 但是是有顺序的
    
    ```
    border-top-left-radius:20px;
    border-top-right-radius:20px;
    border-bottom-right-radius:20px;
    border-bottom-left-radius:20px;
    ```
    * 如果4个角,数值相同
    border-radius: 15px;
     
    
    * 里面数值不同,我们也可以按照简写的形式,具体格式如下:
    border-radius: 左上角 右上角  右下角  左下角;
    
    还是遵循的顺时针。
    .arr-l {
                /* 必须使用定位 */
                /* 相对定位会占据位置,只能使用绝对定位 子绝父相*/
                position: absolute;
                /* 垂直居中公式:1.先走父亲高度的50%  */
                top: 50%;
                /* 2.再往上走自己高度的一半 */
                margin-top: -15px;
                left: 0;
                /* 绝对定位的盒子 无需转换 直接给大小就可以 */
                width: 20px;
                height: 30px;
                background: rgba(0,0,0,.2);
                /* 设置文字的颜色位置 */
                text-decoration: none;
                color: #fff;
                /* 文字水平居中 */
                text-align: left;
                /* 单行文本垂直居中 */
                line-height: 30px;
                /* 圆角矩形 */
                border-top-right-radius: 15px;
                border-bottom-right-radius: 15px;
            }
    .arr-l:hover,
    .arr-r:hover {
            background: rgba(0,0,0,.4);
    }

    第三步、轮播盒子

    这个盒子和左右箭头一样也需要使用绝对定位,然后让绝对定位的盒子水平居中,然后写里面的小圆点的样式,用到了border-radius

    .circle {
                position: absolute;
                /* 绝对定位的盒子水平居中 */
                left: 50%;
                margin-left: -35px;
                bottom: 15px;
                width: 70px;
                height: 17px;
                background-color: pink;
                background: rgba(255,255,255,.3);
                border-radius: 7px;
            }
            .circle li {
                float: left;
                width: 8px;
                height: 8px;
                background-color: #fff;
                border-radius: 50%;
                list-style: none;
                margin: 4px 3px;
            }
            .circle .current {
                background-color: #ff5000;
            }

     六、固定定位案例

    蓝色矩形,紫色版心宽度为1200px
    .fixedbar
    { position: fixed; top: 0; left: 50%; margin-left: -780px; width: 180px; height: 420px; background-color: blue; }

    七、定位总结

    注意:

    1. 边偏移需要和定位模式联合使用,单独使用无效
    2. top和bottom不要同时使用
    3. left和right不要同时使用

     

  • 相关阅读:
    解决:Ubuntu12.04下使用ping命令返回ping:icmp open socket: Operation not permitted的解决
    【Magenta 项目初探】手把手教你用Tensorflow神经网络创造音乐
    python表达式操作符【学习python必知必会】
    关于提高python程序执行效率的思路和想法
    动手前的构思在编写程序中的重要性
    python 之禅
    HTTP 访问学习笔记 留坑
    软件工程与方法学——面向对象程序设计例子
    python 英文字串首字母改为大写
    Objective-C:方法缓存
  • 原文地址:https://www.cnblogs.com/ccv2/p/12939847.html
Copyright © 2011-2022 走看看