css布局教程 — 这一篇足够了

一、display属性

display 是CSS中最重要的用于控制布局的属性。每个元素都有一个默认的 display 值,这与元素的类型有关。对于大多数元素它们的默认值通常是 blockinline 。一个 block 元素通常被叫做块级元素。一个 inline 元素通常被叫做行内元素。

1.1、 block(块元素)

div是一个标准的块级元素。一个块级元素会新开始一行并且尽可能撑满容器。其他常用的块级元素包括 p 、form和HTML5中的新元素:header、footer、section等等。

1.2、inline(行内元素)

span是一个标准的行内元素。一个行内元素可以在段落中 , 像这样 包裹一些文字而不会打乱段落的布局。a元素是最常用的行内元素,它可以被用作链接。

1.3、none

另一个常用的display值是none。一些特殊元素的默认 display 值是它,例如script。display:none通常被 JavaScript 用来在不删除元素的情况下隐藏或显示元素。

它和visibility属性不一样。把display设置成 none元素不会占据它本来应该显示的空间,但是设置成 visibility: hidden;还会占据空间。

二、margin:auto

设置块级元素的 width 可以防止它从左到右撑满整个容器。然后你就可以设置左右外边距为 auto 来使其水平居中。元素会占据你所指定的宽度,然后剩余的宽度会一分为二成为左右外边距。

唯一的问题是,当浏览器窗口比元素的宽度还要窄时,浏览器会显示一个水平滚动条来容纳页面。让我们再来改进下这个方案…

<style>
    #test{
        width: 600px;
        margin: 0 auto;
    }
</style>

<body>
    <div id="test">
        测试
    </div>
</body>

三、max-width

在这种情况下使用 max-width 替代 width 可以使浏览器更好地处理小窗口的情况。这点在移动设备上显得尤为重要,调整下浏览器窗口大小检查下吧!

顺便提下, 所有的主流浏览器包括IE7+在内都支持max-width,所以放心大胆的用吧。

<style>
    #test{
        max-width: 600px;
        margin: 0 auto;
    }
</style>

<body>
    <div id="test">
        测试
    </div>
</body>

四、盒模型

在我们讨论宽度的时候,我们应该讲下与它相关的另外一个重点知识:盒模型。当你设置了元素的宽度,实际展现的元素却超出你的设置:这是因为元素的边框和内边距会撑开元素。看下面的例子,两个相同宽度的元素显示的实际宽度却不一样。

<style>
    #simple {
    width: 500px;
    height: 100px;
    margin: 20px auto;
    background-color: rgb(189, 82, 182);
    }

    #fancy {
      width: 500px;
      height: 100px;
      margin: 20px auto;
      padding: 50px;
      border-width: 10px;
      background-color: rgb(189, 82, 182);
    }
</style>

<body>
    <div id="simple"></div>
    <div id="fancy"></div>
</body>

请添加图片描述

五、box-sizing

人们慢慢的意识到传统的盒子模型不直接,所以他们新增了一个叫做box-sizing的CSS属性。当你设置一个元素为box-sizing: border-box;时,此元素的内边距和边框不再会增加它的宽度。这里有一个与盒子模型相同的例子,唯一的区别是两个元素都设置了box-sizing: border-box;

<style>
    #simple {
        width: 500px;
        height: 100px;
        margin: 20px auto;
        background-color: rgb(189, 82, 182);
        -webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
        box-sizing: border-box;
    }

    #fancy {
        width: 500px;
        height: 100px;
        margin: 20px auto;
        padding: 50px;
        border: solid blue 10px;
        background-color: rgb(189, 82, 182);
        -webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
        box-sizing: border-box;
    }
</style>

<body>
    <div id="simple"></div>
    <div id="fancy"></div>
</body>

既然没有比这更好的方法,一些CSS开发者想要页面上所有的元素都有如此表现。所以开发者们把以下CSS代码放在他们页面上:

* {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

请添加图片描述

六、position

为了制作更多复杂的布局,我们需要讨论下position属性。它有一大堆的值,名字还都特抽象,别提有多难记了。让我们先一个个的过一遍。

  1. static
  2. relative
  3. fixed
  4. absolute

6.1、static

static是默认值。任意position: static;的元素不会被特殊的定位。一个static元素表示它不会被“positioned”,一个position属性被设置为其他值的元素表示它会被“positioned”。

6.2、relative

relative表现的和static一样,除非你添加了一些额外的属性。

在一个相对定位(position属性的值为relative)的元素上设置top、right、bottom和left属性会使其偏离其正常位置。其他的元素的位置则不会受该元素的影响发生位置改变来弥补它偏离后剩下的空隙,具体演示可以看下面的例子。

<style>
.relative1 {
  position: relative;
  background-color: rgb(255, 152, 152);
}
.relative2 {
  position: relative;
  top: -20px;
  left: 20px;
  background-color: rgb(137, 255, 178);
  width: 500px;
}
</style>

<body>
    <div class="relative1">这个是1</div>
    <div class="relative2">这个是2</div>

请添加图片描述

6.3、fixed

一个固定定位(position属性的值为fixed)元素会相对于视窗来定位,这意味着即便页面滚动,它还是会停留在相同的位置。和relative一样,top、right、bottom和left属性都可用。一个固定定位元素不会保留它原本在页面应有的空隙,即之后添加的元素会占用他之前的位置。

<style>
.fixed {
  position: fixed;
  margin-left: 200px;
  width: 200px;
  background-color: rgb(95, 187, 227);
}
.a{
    margin: 0 auto;
    width: 100%;
    height: 2000px;
    background-color: rgb(186, 255, 101);
}
</style>
<body>
    <div class="fixed">测试</div>
    <div class="a">我是来扩大页面的</div>
</body>

请添加图片描述

6.4、absolute

absolute是最棘手的position值。 absolute与fixed的表现类似,但是它不是相对于视窗而是相对于最近的“positioned”祖先元素*。如果绝对定位(position属性的值为absolute)的元素没有“positioned”祖先元素,那么它是相对于文档的 body 元素,并且它会随着页面滚动而移动。记住一个“positioned”元素是指 position 值不是static的元素。

<style>
.relative {
  position: relative;
  width: 600px;
  height: 400px;
  background-color: rgb(253, 116, 116);
}
.absolute {
  position: absolute;
  top: 120px;
  right: 0;
  width: 300px;
  height: 200px;
  background-color: rgb(116, 255, 148);
}
</style>

<body>
    <div class="relative">
        这个元素是相对定位的。如果它是 position: static; ,那么它的绝对定位子元素会跳过它直接相对于body元素定位。
        <div class="absolute">
            这个元素是绝对定位的。它相对于它的父元素定位。
        </div>
    </div>
</body>

在这里插入图片描述

七、float

在学习该属性前,首先要了解到浮动的属性,该性质会使元素向左或向右移动,其周围的元素也会重新排列。

7.1、clear

float属性被用于控制浮动。即元素浮动之后,周围的元素会重新排列,为了避免这种情况,使用clear属性,clear属性指定元素两侧不能出现浮动元素。

来看一下下面的例子:

首先这个是正常的浮动:

<style>
.box {
  float: left;
  width: 200px;
  height: 100px;
  margin: 1em;
  background-color: rgb(143, 255, 112);
}
section{
  background-color: rgb(255, 134, 134);
  width: 200px;
}
.after-box {
  clear: left;
}
</style>

<body>
    <div class="box">1111111111</div>
    <section>22222222</section>
</body>

请添加图片描述

接下来使用clear属性,来指定该元素附近不能出现浮动元素

<style>
.box {
  float: left;
  width: 200px;
  height: 100px;
  margin: 1em;
  background-color: rgb(143, 255, 112);
}
.after-box {
  clear: left;
}
section{
  background-color: rgb(255, 134, 134);
  width: 200px;
}
</style>

<body>
    <div class="box">1111111111</div>
    <section class="after-box">22222222</section>
</body>

请添加图片描述

7.2、清除浮动(clearfix hack)

在一个div中放一张图片,有时候图片会超出div的范围,这个时候我们需要这样做,给div加上此属性

.clearfix {
  overflow: auto;
}

八、百分比宽度

百分比是一种相对于包含块的计量单位。它对图片很有用:如下我们实现了图片宽度始终是容器宽度的50%。

article img {
  float: right;
  width: 50%;
}

九、媒体查询

可以针对不同的媒体类型(包括显示器、便携设备、电视机,等等)设置不同的样式规则。但是这些多媒体类型在很多设备上支持还不够友好。可以理解为该元素在某一区间是什么样式、什么状态,是否显示等。

@media (min-width:600px) {
  nav {
    float: left;
    width: 25%;
  }
  section {
    margin-left: 25%;
  }
}
@media (max-width:599px) {
  nav li {
    display: inline;
  }
}

十、inline-block

你可以创建很多网格来铺满浏览器。在过去很长的一段时间内使用 float 是一种选择,但是使用 inline-block 会更简单。让我们看下使用这两种方法的例子:

10.1、这是使用普通的float方法

<style>
    .a{
        width: 300px;
        height: 180px;
        float: left;
        margin-left: 10px;
        margin-top: 10px;
        background-color: rgb(206, 93, 251);
        color: #000;
        font-size: 12;
    }
    .b{
        clear: left;
    }
</style>
<body>
    <div class="a"> <h1>1</h1> </div>
    <div class="a"> <h1>2</h1> </div>
    <div class="a"> <h1>3</h1> </div>
    <div class="a"> <h1>4</h1> </div>
    <div class="a"> <h1>5</h1> </div>
    <div class="a"> <h1>6</h1> </div>
    <div class="a"> <h1>7</h1> </div>
    <div class="a"> <h1>8</h1> </div>
    <div class="a"> <h1>9</h1> </div>
    <div class="a"> <h1>10</h1> </div>
    <div class="a b"><h1>我得使用clear才能不浮动</h1></div>
</body>

请添加图片描述

10.2、使用inline-block方法

<style>
    .a{
        display: inline-block;
        width: 300px;
        height: 180px;
        /* float: left; */
        margin-left: 10px;
        margin-top: 10px;
        background-color: rgb(206, 93, 251);
        color: #000;
        font-size: 12;
    }
    .b{
        display: inline-block;
        width: 1800px;
        height: 180px;
        margin-left: 10px;
        margin-top: 10px;
        background-color: rgb(206, 93, 251);
        color: #000;
        font-size: 12;
        clear: left;
    }
</style>
<body>
    <div class="a"> <h1>1</h1> </div>
    <div class="a"> <h1>2</h1> </div>
    <div class="a"> <h1>3</h1> </div>
    <div class="a"> <h1>4</h1> </div>
    <div class="a"> <h1>5</h1> </div>
    <div class="a"> <h1>6</h1> </div>
    <div class="a"> <h1>7</h1> </div>
    <div class="a"> <h1>8</h1> </div>
    <div class="a"> <h1>9</h1> </div>
    <div class="a"> <h1>10</h1> </div>
    <div class="b"><h1>我没有使用clear</h1></div>
</body>

请添加图片描述

10.3、inline-block 布局

你可以使用inline-block来布局(大多数用于有图片的布局)。有一些事情需要你牢记:

vertical-align属性会影响到inline-block元素,你可能会把它的值设置为top 。

你需要设置每一列的宽度

如果HTML源代码中元素之间有空格,那么列与列之间会产生空隙

十一、column

CSS 多列布局(CSS Multi-column Layout)是一种定义了多栏布局的模块,可支持在布局中建立列(column)的数量,以及内容如何在列之间流动(flow)、列之间的间距(gap)大小,以及列的分隔线(column rules)。

  1. column-count:指定了需要分割的列数
  2. column-gap:指定了列与列间的间隙
  3. column-rule-style:指定了列与列间的边框样式
  4. column-rule-width:指定了两列的边框厚度
  5. column-rule-color:指定了两列的边框颜色
  6. column-rule:是 column-rule-* 所有属性的简写,直接设置了列的边框的厚度,样式及颜色
  7. column-span:指定元素要跨越多少列
  8. column-width:指定了列的宽度

十二、flexbox

新的flexbox布局模式被用来重新定义CSS中的布局方式。很遗憾的是最近规范变动过多,导致各个浏览器对它的实现也有所不同。不过我仍旧想要分享一些例子,来让你知道即将发生的改变

<style>
.container {
  width: 100%;
  display: flex;
}
.initial {
  flex: initial;
  width: 200px;
  min-width: 100px;
  background-color: rgb(255, 103, 103);
}
.none {
  flex: none;
  width: 200px;
  background-color: rgb(223, 249, 106);
}
.flex1 {
  flex: 1;
  background-color: rgb(104, 225, 255);
}
.flex2 {
  flex: 2;
  background-color: rgb(161, 85, 255);
}


.center {
    height: 300px;
    display:flex;
    align-items: center;
    justify-content: center;
    background-color: aqua;
    border: 1px solid #000;
}

</style>

<body>
    <div class="container">
        <div class="initial">
            空间足够的时候,我的宽度是200px,如果空间不足,我会变窄到100px,但不会再窄了。
        </div>
    
        <div class="none">
            无论窗口如何变化,我的宽度一直是200px。
        </div>
    
        <div class="flex1">
            我会占满剩余宽度的1/3。
        </div>
    
        <div class="flex2">
            我会占满剩余宽度的2/3。
        </div>
    </div>
    
    
    <div class="center">
        我是内容,我直接居中
    </div>
</body>

border: 1px solid #000;
}

空间足够的时候,我的宽度是200px,如果空间不足,我会变窄到100px,但不会再窄了。
    <div class="none">
        无论窗口如何变化,我的宽度一直是200px。
    </div>

    <div class="flex1">
        我会占满剩余宽度的1/3。
    </div>

    <div class="flex2">
        我会占满剩余宽度的2/3。
    </div>
</div>


<div class="center">
    我是内容,我直接居中
</div>

请添加图片描述

I will.874
关注 关注
  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSS面试问题准备-----CSS布局篇之Flex布局
QAQTHREE的博客
03-22 412
CSS布局 弹性盒子(Flexbox) 概念:弹性盒子是用于按行或按列布局元素的一维布局方法。元素可以膨胀以填充额外空间,收缩以适应更小的空间。 为啥要使用弹性盒子呢? 我们知道传统的布局方式通常使用display、float和position来实现的。但是由于他们在某些方面的的局限性,让人难以完成任务或完成起来很复杂。比如以下需求: 在一个父内容里垂直居中一个块内容。 使容器的所有子项占用等量的可用宽度/高度,而不管有多少宽度/高度可用。 使多列布局中的所有列采用相同的高度,即使它们包含的内容量不同。
css之Flex布局(一)
CruellyJohn的博客
08-09 687
flexBox布局 使用flexBox布局前需要给容器添加样式display:flex; ... &amp;amp;amp;lt;style&amp;amp;amp;gt; .contain{ display:flex; } &amp;amp;amp;lt;/style&amp;amp;amp;gt; &amp;amp;amp;lt;div class=&amp;amp;quot;contain&amp;amp;
css教程
09-15
CSS基础教程css教程.pdf)
CSS 浮动
lzh17538073353的博客
07-20 320
本篇简介: 浮动属性的应用 、浮动元素的基础特性 、浮动产生的的问题 、清浮动的方法
CSS——布局
最新发布
Fan_web的博客
08-09 1182
本文详细介绍了CSS中的布局,包括文档流、盒子模型和大小、浏览器的默认样式介绍以及补充一些轮廓和圆角的一些知识点。
CSS 布局:40个教程、技巧、例子和最佳实践
weixin_33712881的博客
05-03 171
2019独角兽企业重金招聘Python工程师标准>>> ...
如何理解 CSS 布局和块级格式上下文
12-03
BFC 的概念始于 CSS2,是个蛮古老的 CSS 话题了,网上也到处能搜到 BFC 的介绍,...你可能没听过这个术语,但只要你曾经使用 过CSS 布局,你就能明白它。理解 BFC 是什么、它如何工作、如何创建一个 BFC 是非常有用的,
CSS布局
weixin_42597880的博客
08-26 298
1.流动布局(元素随着浏览器扩展调整到填满整个浏览器为止) 块元素垂直从头到尾流动,内联元素在水平方向一个接一个的流动。 当浏览器并排放置两个内联元素时:元素之间有足够的空间,该空间等于两个元素边界之和。 比如左边图片1的边界为10像素,右边图片2的边界为20像素,两个元素之间就会有30像素的空间。 当浏览器并列放置两个块元素时:两个块元素共同的边界重叠在一起,重叠的高度是最大边界的值。...
四种常见CSS布局
gyypwrs的博客
07-26 1216
在本文章中页面的内容由三部分组成 header,content,footer组成 单列布局 含义:页面的内容只有一列,并且这一列居中显示。 实现方法:最主要的就是让内容块居中显示,这里居中显示的方法就是使用margin:0 auto。还可以使用其他居中方法 ,下一篇文章整理主要的居中方法。 代码实现: HTML: <nav></nav> <div class="content"></div> <footer></footer> CS
Div+CSS布局入门教程
weixin_30851867的博客
03-08 227
在网页制作中,有许多的术语,例如:CSS、HTML、DHTML、XHTML等等。在下面的文章中我们将会用到一些有关于HTML的基本知识,而在你学习这篇入门教程之前,请确定你已经具有了一定的HTML基础。下面我们就开始一步一步使用DIV+CSS进行网页布局设计吧。 所有的设计第一步就是构思,构思好了,一般来说还需要用PhotoShop或FireWorks(以下简称PS或FW)等图片处理软件将...
CSS入门教程
Herr Apfel的专栏
03-12 1704
  CSS是“Cascading Style Sheets”的简称,中文翻译为“串接样式表”,也有人翻译为“样式表”。CSS用以作为网页的排版和风格设计,在web标准建站中,对CSS的熟悉和使用是相当重要的一个内容。CSS的作用是弥补HTML的不足,让网页的设计更为灵活。  这个文章只是为您介绍CSS的基础应用,指引您的一个入门的基础教程,主要目的是为推进web标准贡献自己的微
css-布局
简简单单,仔仔细细,只是一个开发者
01-26 340
css布局分为三种类型:流布局、浮动布局、层布局。 流布局布局是默认的网页布局,在流布局中,块状元素会按上下结构排列,因为块状元素宽度是100%,而内敛元素按左右方向排列。 浮动布局 .div1{float:right;}//元素向右浮动 .div2{float:left;}//向左浮动 .div3{float:none;}//不浮动 浮动元素可以向左向右浮动,直到碰到边
CSS网页布局
微风洋洋的博客
02-10 7787
介绍一下CSS网页布局这个核心知识,大家一定要重视!
css常见布局解决方案及教程
楠之枫雪的博客
01-25 291
目录: 一般布局解决方案有哪些 传统方案,display 属性 + position属性怎么使用 flex布局使用 1、一般布局解决方案有哪些 布局的传统解决方案:基于盒状模型,依赖 display 属性 + position属性 + float属性 Flex 布局,可以简便、完整、响应式地实现各种页面布局,如实现垂直布局等更加简单 2、传统方案,display 属性 + position属性怎么使用 其中最常用的是position属性的使用,下面是例子说明: position:absolute使
三. CSS layout(布局
scyllake的博客
10-24 1135
1.文档流(normal flow) 网页是一个多层的结构,一层摞着一层,通过CSS可以分别为每一层来设置样式,作为用户来讲只能看到最顶上一层,这些层中,最底下的一层称为文档流,文档流是网页的基础, 我们所创建的元素默认都是在文档流中进行排列, 对于我们来元素主要有两个状态: 在文档流中 不在文档流中(脱离文档流) 元素在文档流中有什么特点: 块元素 块元素会在页面中独占一行(自上向下垂直排列) 默认宽度是父元素的全部(会把父元素撑满) 默认高度是被内容撑开(子元素) 行内元素 行内元素不会独
写文章

热门文章

  • css布局教程 — 这一篇足够了 4012
  • 在IDEA中配置Servlet 3560
  • JavaWeb实现学生管理系统 2714
  • Vue3给输入框绑定监听事件 2600
  • 在Vue中实现回车事件 1885

最新评论

  • 如何使用阿里云OSS进行前端直传以及分片上传

    I will.874: 自己项目练习用的,也可以把相关的参数放到后端,请求接口获取

  • 如何使用阿里云OSS进行前端直传以及分片上传

    zhanggy_2016: 你把accesskey写到前端不怕别人看到吗?

  • 前端高性能渲染 — 虚拟列表

    xiaxueying: 计算barHeight高度改成这个: barHeight(){ var height = this.items.length - this.end; return this.size * height + 'px' },底部就不会出现空白

  • Vue3给输入框绑定监听事件

    桥豆麻袋~。~: 感觉不太对啊哥

  • JavaWeb实现学生管理系统

    洛书入黄泉: 大佬,求源码

最新文章

  • ERROR in ./src/components/datePicker/index.less (./node_modules/css-loader/dist/cjs.js!./node_module
  • D:\MySQL\bin>net start mysql MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。 请键入 NET HELPMSG 3534 以获得更多的帮
  • Vue 模版编译原理
2024年11篇
2023年33篇
2022年14篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

天下网标王网站优化 书深圳网站推广外包优化赣州浙江网站建站优化推广智能网站优化黄石工厂网站优化公司合肥网站推广优化白云网站推广优化教程永州网站关键词优化正规公司金华网站优化常识网站结构优化的目的是什么fsx.cfg优化网站苏州网站seo优化灵寿互联网网站优化系统合肥网站快速排名优化松岗网站优化哪家好长宁区公司网站优化排名优化网站软文房山网站建设及优化网站关关键词优化眉山怎么优化网站应该从哪些方面对网站优化凉山彝族自治州正规网站优化江苏正规的网站seo优化推广南昌网站优化推荐温州网站优化公司随州市网站线上推广优化浙江测试网站优化质量保障保定整站网站优化多少钱台州网站优化效果武侯区网站优化认证香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化