标签 css 下的文章

CSS 定位机制

CSS 有三种基本的定位机制:

  • 普通流
  • 浮动
  • 绝对定位

一、普通流

除非专门指定,否则所有框都在普通流中定位。普通流中元素框的位置由元素在(X)HTML中的位置决定。块级元素从上到下依次排列,框之间的垂直距离由框的垂直margin计算得到。行内元素在一行中水平布置。

二、定位

1、相对定位

被看作普通流定位模型的一部分,定位元素的位置相对于它在普通流中的位置进行移动。使用相对定位的元素不管它是否进行移动,元素仍要占据它原来的位置。移动元素会导致它覆盖其他的框。

<html>
<head>
<style>
    .box1{
        background-color: red;
        width:100px;
        height:100px;
    }
    .box2{
        background-color: yellow;
        width:100px;
        height:100px;
        position: relative;
        left: 20px;
    }
    .box3{
        background-color: blue;
        width:100px;
        height:100px;
        position: relative;
        right: 20px;
    }
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="box2">box2</div>
<div class="box3">box3</div>
</body>
</html>

效果如下图所示:

2、绝对定位

相对于已定位的最近的祖先元素,如果没有已定位的最近的祖先元素,那么它的位置就相对于最初的包含块(如body)。绝对定位的框可以从它的包含块向上、右、下、左移动。
绝对定位的框脱离普通流,所以它可以覆盖页面上的其他元素,可以通过设置Z-Iindex属性来控制这些框的堆放次序。

<html>
<head>
<style>
    .box1{
        background-color: red;
        width:100px;
        height:100px;
    }
    .box2{
        background-color: yellow;
        width:100px;
        height:100px;
        position: relative;
        left: 20px;
    }
    .box3{
        background-color: blue;
        width:100px;
        height:100px;
        position: relative;
        right: 20px;
    }
</style>
</head>
<body>
<div class="box1">box1</div>
<div class="box2">box2</div>
<div class="box3">box3</div>
</body>
</html>

效果如下图所示:

备注:相对于已相对定位的祖先元素对框进行绝对定位,在大多数现代浏览器中都可以实现的很好。

3、固定定位

相对于浏览器窗口,其余的特点类似于绝对定位。

三、浮动

浮动的框可以在左右移动,直到它的外边框边缘碰到包含框或另一个浮动框的边缘。浮动的框脱离普通流。
如果包含块太窄,无法容纳水平排列的浮动元素,那么其他浮动块向下移动,直到有足够多的空间。如果浮动元素的高度不同,那么当它们向下移动时可能会被其他浮动元素卡住。
行内元素会围绕着浮动框排列。

请看下图,当把框 1 向右浮动时,它脱离文档流并且向右移动,直到它的右边缘碰到包含框的右边缘:

再请看下图,当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边缘。因为它不再处于文档流中,所以它不占据空间,实际上覆盖住了框 2,使框 2 从视图中消失。

如果把所有三个框都向左移动,那么框 1 向左浮动直到碰到包含框,另外两个框向左浮动直到碰到前一个浮动框。

如下图所示,如果包含框太窄,无法容纳水平排列的三个浮动元素,那么其它浮动块向下移动,直到有足够的空间。如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“卡住”:

清除浮动

简单介绍下清除浮动的2中方法。

方法一:结合:after选择器清除浮动。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    .box1 {
        border: 1px solid red;
        background-color: yellow;
    }
    
    .clear:after {
        content: "." ;
        display: block;
        height: 0;
        visibility: hidden;
        clear: both;
    }
    
    .box2 {
        width: 50px;
        height: 50px;
        float: left;
        background-color: orange;
    }
    
    p {
        float: right;
    }
    </style>
</head>
<body>
    <div class="box1 clear">
        <div class="box2">
            box2        </div>
        <p>
            lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦        </p>
    </div>
</body>
</html>

方法二,在容器最后添加一个空元素并且清理它。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    .box1 {
        border: 1px solid red;
        background-color: yellow;
    }
    
    .empty{
        clear: both;
    }
    
    .box2 {
        width: 50px;
        height: 50px;
        float: left;
        background-color: orange;
    }
    
    p {
        float: right;
    }
    </style>
</head>
<body>
    <div class="box1 clear">
        <div class="box2">
            box2        </div>
       
        <p>
            lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦 lallalalalalal啦啦啦        </p>
        <br class="empty" />
    </div>
</body>
</html>

效果均如下所示:

附录:

CSS position 属性总结:

所有主流浏览器都支持 position 属性。position属性规定元素的定位类型,影响元素框生成的方式。
可能的值

描述
absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位,如果不存在这样的父元素,则依据最初的包含快。根据用户代理的不同,最初的包含块可能是画布或 HTML 元素。

元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定,也可以通过z-index进行层次分级。

(元素框从文档流完全删除,并相对于其包含块定位。包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭,就好像元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常流中生成何种类型的框。)
fixed 生成固定/绝对定位的元素,相对于浏览器窗口进行定位。

元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。

(元素框的表现类似于将 position 设置为 absolute,不过其包含块是视窗本身。)
relative 生成相对定位的元素,相对于其正常位置进行定位。

因此,"left:20" 会向元素的 LEFT 位置添加 20 像素。

(相对定位实际上被看作普通流定位模型的一部分,因为元素的位置相对于它在普通流中的位置。元素框偏移某个距离。元素仍保持其未定位前的形状,仍保留原本所占的空间。
static 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明,即上述声明无效)。

(元素框正常生成。块级元素生成一个矩形框,作为文档流的一部分,行内元素则会创建一个或多个行框,置于其父元素中。)
inherit 规定应该从父元素继承 position 属性的值。


CSS 定位属性
CSS 定位属性允许你对元素进行定位。

描述
position 把元素放置到一个静态的、相对的、绝对的、或固定的位置中。
top 定义了一个定位元素的上外边距边界与其包含块上边界之间的偏移。
right 定义了定位元素右外边距边界与其包含块右边界之间的偏移。
bottom 定义了定位元素下外边距边界与其包含块下边界之间的偏移。
left 定义了定位元素左外边距边界与其包含块左边界之间的偏移。
overflow 设置当元素的内容溢出其区域时发生的事情。
clip 设置元素的形状。元素被剪入这个形状之中,然后显示出来。
vertical-align 设置元素的垂直对齐方式。
z-index 设置元素的堆叠顺序。

CSS 框模型(Box Model)

所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。

CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容。

盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。

下面的图片说明了框模型(Box Model):

CSS 框模型的介绍

术语翻译:

Margin - 清除边框区域。Margin没有背景颜色,它是完全透明

Border - 边框周围的填充和内容。边框是受到盒子的背景颜色影响

Padding - 清除内容周围的区域。会受到框中填充的背景颜色影响

Content - 盒子的内容,显示文本和图像

为了在所有浏览器中的元素的宽度和高度设置正确的话,你需要知道的盒模型是如何工作的。

元素的宽度和高度

重要: 当您指定一个CSS元素的宽度和高度属性时,你只是设置内容区域的宽度和高度。要知道,完全大小的元素,你还必须添加填充,边框和边距。.

下面的例子中的元素的总宽度为300px:


width:250px;padding:10px;border:5px solid gray;margin:10px;

让我们自己算算:

250px (宽)
+ 20px (left + 右填充)
+ 10px (left + 右边框)
+ 20px (left + 右边距)
= 300px

试想一下,你只有250像素的空间。让我们设置总宽度为250像素的元素:

实例


width:220px;padding:10px;border:5px solid gray;margin:0px;

最终元素的总宽度计算公式是这样的:

总元素的宽度=宽度+左填充+右填充+左边框+右边框+左边距+右边距

元素的总高度最终计算公式是这样的:

总元素的高度=高度+顶部填充+底部填充+上边框+下边框+上边距+下边距

浏览器的兼容性问题

一旦为页面设置了恰当的 DTD,大多数浏览器都会按照上面的图示来呈现内容。然而 IE 5 和 6 的呈现却是不正确的。根据 W3C 的规范,元素内容占据的空间是由 width 属性设置的,而内容周围的 padding 和 border 值是另外计算的。不幸的是,IE5.X 和 6 在怪异模式中使用自己的非标准模型。这些浏览器的 width 属性不是内容的宽度,而是内容、内边距和边框的宽度的总和。

虽然有方法解决这个问题。但是目前最好的解决方案是回避这个问题。也就是,不要给元素添加具有指定宽度的内边距,而是尝试将内边距或外边距添加到元素的父元素和子元素。

IE8 及更早IE版本不支持 填充的宽度和边框的宽度属性设。

解决IE8及更早版本不兼容问题可以在HTML页面声明 即可。

HTML编码规范:

  • 使用小写元素名:<session>
  • 关闭所有HTML元素:<p></p>
  • 使用小写属性名:<div class=”menu”>
  • 属性值使用引号:<table class=”table striped”>
  • 图片通常使用alt属性:<img src=”html5.gif” alt=”HTML5″>
  • 等号前少用空格:<link rel=”stylesheet” href=”style.css”>
  • 不要随便添加空行,缩进使用两个空格,不建议使用TAB
  • 布尔型属性不用赋值:<input type=”text” disabled>
  • 尽量避免多余的父元素

HTML属性顺序:

  1. class
  2. id,name
  3. data-*
  4. src,for,type,href
  5. title,alt
  6. aria-*,rolo

CSS编码规范:

  • 用二个空格代替tab
  • 为选择器分组时,将单独的选择器单独放在一行
  • 每个声明块的左花括号前添加一个空格
  • 声明块的右花括号单独成行
  • 每条声明语句的 :后应该插入一个空格
  • 每条声明独占一行
  • 所有声明语句都应当以分号结尾 ;
  • 对于以逗号分隔的属性值,每个逗号后面都应该插入一个空格
  • 对于属性值或颜色参数,省略小于1的小数前面的0
  • 避免为0值指定单位:用margin:0 代替 margin:0px
  • 媒体查询@media放在尽可能相关规则的附近
  • 只包含一条声明的样式,建议将语句放在同一行。
  • 对于通用元素使用class
  • 选择器尽可能短,并且尽量限制组成选择器的元素个数不超过3

序言

使用技巧会让人变的越来越懒,没错,我就是想让你变懒。

下面是我收集的CSS高级技巧,希望你懒出境界。

1. 黑白图像

这段代码会让你的彩色照片显示为黑白照片,是不是很酷?


    img.desaturate {    
             filter: grayscale(100%);    
             -webkit-filter: grayscale(100%);    
             -moz-filter: grayscale(100%);    
             -ms-filter: grayscale(100%);    
             -o-filter: grayscale(100%);
    }

2. 使用 :not() 在菜单上应用/取消应用边框

先给每一个菜单项添加边框



    /* add border */
    .nav li {  
         border-right: 1px solid #666;
    }

……然后再除去最后一个元素……



    // remove border /
    .nav li:last-child {
      border-right: none;
    }


……可以直接使用 :not() 伪类来应用元素:



    .nav li:not(:last-child) {  
           border-right: 1px solid #666;
    }

这样代码就干净,易读,易于理解了。

当然,如果你的新元素有兄弟元素的话,也可以使用通用的兄弟选择符(~):



    ..nav li:first-child ~ li {  
             border-left: 1px solid #666;
    }


3. 页面顶部阴影

下面这个简单的 CSS3 代码片段可以给网页加上漂亮的顶部阴影效果:



    body:before {          
              content: "";          
              position: fixed;          
              top: -10px;          
              left: 0;          
              width: 100%;          
              height: 10px; 
              
              -webkit-box-shadow: 0px 0px 10px rgba(0,0,0,.8);          
              -moz-box-shadow: 0px 0px 10px rgba(0,0,0,.8);          
              box-shadow: 0px 0px 10px rgba(0,0,0,.8); 
              
              z-index: 100;
    }

4. 给 body 添加行高

你不需要分别添加 line-height 到每个p,h标记等。只要添加到 body 即可:



    body {  
         line-height: 1;
    }


这样文本元素就可以很容易地从 body 继承。

5. 所有一切都垂直居中

要将所有元素垂直居中,太简单了:



    html, body {  
         height: 100%;  
         margin: 0;
    }
    body {  
         -webkit-align-items: center;  
        -ms-flex-align: center;  
        align-items: center;  
         display: 
         -webkit-flex;  
         display: flex;
    }


看,是不是很简单。

注意:在IE11中要小心flexbox。

6. 逗号分隔的列表

让HTML列表项看上去像一个真正的,用逗号分隔的列表:



    ul > li:not(:last-child)::after {  
          content: ",";
    }


对最后一个列表项使用 :not() 伪类。

7. 使用负的 nth-child 选择项目

在CSS中使用负的 nth-child 选择项目1到项目n。



    li {
      display: none;
    }
    /* select items 1 through 3 and display them */
    li:nth-child(-n+3) {
      display: block;
    }

8. 对图标使用 SVG

我们没有理由不对图标使用SVG:



    .logo {
      background: url("logo.svg");
    }


SVG对所有的分辨率类型都具有良好的扩展性,并支持所有浏览器都回归到IE9。这样可以避开.png、.jpg或.gif文件了。

9. 优化显示文本

有时,字体并不能在所有设备上都达到最佳的显示,所以可以让设备浏览器来帮助你:



    html {
      -moz-osx-font-smoothing: grayscale;
      -webkit-font-smoothing: antialiased;  
      text-rendering: optimizeLegibility;
    }

注:请负责任地使用 optimizeLegibility。此外,IE /Edge没有 text-rendering 支持。

10. 对纯 CSS 滑块使用 max-height

使用 max-height 和溢出隐藏来实现只有CSS的滑块:



    .slider ul {
      max-height: 0;  
      overlow: hidden;
    }
    .slider:hover ul {
      max-height: 1000px;  
      transition: .3s ease;
    }

11. 继承 box-sizing

让 box-sizing 继承 html:



    html {
      box-sizing: border-box;
    }
    *, *:before, *:after {
      box-sizing: inherit;
    }


这样在插件或杠杆其他行为的其他组件中就能更容易地改变 box-sizing 了。

12. 表格单元格等宽

表格工作起来很麻烦,所以务必尽量使用 table-layout: fixed 来保持单元格的等宽:



    .calendar {
      table-layout: fixed;
    }

13. 用 Flexbox 摆脱外边距的各种 hack

当需要用到列分隔符时,通过flexbox的 space-between 属性,你就可以摆脱nth-,first-,和 last-child 的hack了:



    .list {
      display: flex;  
      justify-content: space-between;
    }
    .list .person {
      flex-basis: 23%;
    }

现在,列表分隔符就会在均匀间隔的位置出现。

14. 使用属性选择器用于空链接

当a元素没有文本值,但 href 属性有链接的时候显示链接:



    a[href^="http"]:empty::before {
      content: attr(href);
    }

相当方便。

15. 检测鼠标双击

HTML:



    

CSS:



    .test3 span {
      position: relative;
    }
    .test3 span a {
      position: relative;  
      z-index: 2;
    }
    .test3 span a:hover, .test3 span a:active {
      z-index: 4;
    }
    .test3 span input {
      background: transparent;  
      border: 0;  
      cursor: pointer;  
      position: absolute;  
      top: -1px;  
      left: 0;  
      width: 101%;  /* Hacky */
      height: 301%; /* Hacky */
      z-index: 3;
    }
    .test3 span input:focus {
      background: transparent;  
      border: 0;  
      z-index: 1;
    }

16. CSS 写出三角形



    /* create an arrow that points up */
    div.arrow-up {  
       width:0px;  
       height:0px;  
       border-left:5px solid transparent;  /* left arrow slant */
      border-right:5px solid transparent; /* right arrow slant */
      border-bottom:5px solid #2f2f2f; /* bottom, add background color here */
      font-size:0px;  
       line-height:0px;
    }
     /* create an arrow that points down */
    div.arrow-down {
      width:0px;  
      height:0px;  
      border-left:5px solid transparent;  
      border-right:5px solid transparent;  
      border-top:5px solid #2f2f2f;  
      font-size:0px;  
      line-height:0px;
     }
     /* create an arrow that points left */
     div.arrow-left {
       width:0px;  
       height:0px;  
       border-bottom:5px solid transparent;  /* left arrow slant */
       border-top:5px solid transparent; /* right arrow slant */
       border-right:5px solid #2f2f2f; /* bottom, add background color here */
       font-size:0px;  
       line-height:0px;
     }
     /* create an arrow that points right */
     div.arrow-right {
       width:0px;  
       height:0px;  
       border-bottom:5px solid transparent;  /* left arrow slant */
       border-top:5px solid transparent; /* right arrow slant */
       border-left:5px solid #2f2f2f; /* bottom, add background color here */
       font-size:0px;  
       line-height:0px;
     }

17. CSS3 calc() 的使用

calc() 用法类似于函数,能够给元素设置动态的值:



    /* basic calc */
    .simpleBlock {
      width: calc(100% - 100px);
    }
     /* calc in calc */
    .complexBlock {
      width: calc(100% - 50% / 3);  
      padding: 5px calc(3% - 2px);  
      margin-left: calc(10% + 10px);
    }


18. 文本渐变

文本渐变效果很流行,使用 CSS3 能够很简单就实现:



    h2[data-text] {
      position: relative;
    }
    h2[data-text]::after {
      content: attr(data-text);
      z-index: 10;
      color: #e3e3e3;
      position: absolute;
      top: 0;
      left: 0;
        -webkit-mask-image: 
           -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,0)), 
           color-stop(50%, rgba(0,0,0,1)), to(rgba(0,0,0,0)));
    }

19. 禁用鼠标事件

CSS3 新增的 pointer-events 让你能够禁用元素的鼠标事件,例如,一个连接如果设置了下面的样式就无法点击了。



    .disabled { pointer-events: none; }

20. 模糊文本

简单但很漂亮的文本模糊效果,简单又好看!



    .blur {
       color: transparent;   
       text-shadow: 0 0 5px rgba(0,0,0,0.5);
    }

CSS max-width(height)属性设置对象的最大宽高

语法:


max-width : none | length
max-height : none | length

参数:

none :  无最大高度限制
length :  由浮点数字和单位标识符组成的长度值 | 或者百分数。不可为负数。

说明:

设置或检索对象的最大宽高度。
max-height属性的值小于min-height属性的值,将会被自动转设为min-height属性的值。
max-width属性的值小于min-width属性的值,将会被自动转设为min-width属性的值。
目前IE5.5尚不支持此属性。
对应的脚本特性为 maxHeight (maxWidth)。

示例:


       p { max-height: 200%; } 

        p { max-width: 200%; } 

定义和用法

max-width 定义元素的最大宽度。
max-height 属性设置元素的最大高度。

说明
该属性值会对元素的宽度设置一个最高限制。因此,元素可以比指定值窄,但不能比其宽。不允许指定负值。
该属性值会对元素的高度设置一个最高限制。因此,元素可以比指定值矮,但不能比其高。不允许指定负值。

注释:max-height 属性不包括外边距、边框和内边距。

可能的值

描述
none 默认。定义对元素的最大宽度没有限制。
length 定义元素的最大宽度值。
% 定义基于包含它的块级对象的百分比最大宽度。
inherit 规定应该从父元素继承 max-width 属性的值。

所有主流浏览器都支持 max-width 和 max-height 属性。

注:任何版本的 Internet Explorer (包括 IE8)都不支持属性值 "inherit"。