Web前端从入门到精通-10 css简介

上节课呢,我们介绍了一个很重要的概念——盒模型

主要介绍了盒模型的一些基础知识:margin padding的概念 以及margin:0 auto;和margin的塌陷

如果对上述知识点还有不清楚的地方大家一定要弄懂

要不然再往下看的话比较费劲

这节课的话我们接着上节课的话题继续扯

实际上关于margin的话题还远远不止我们上节课说的那些问题

我们再看下面一个布局:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xxx</title>
    <style type="text/css">
    #div1{ width:300px; height:300px; background: gray;}
    #div2{ width:100px; height:100px; background: red;}
    </style>
</head>
<body>
    <div id="div1">
        <div id="div2"></div>
    </div>
</body>
</html>

预览之后结果很正常:

这时我们给div2加上margin:30px;

大家先不要看我贴出来的预览图,先想想会是什么样的

是不是应该在灰色的div1中有个红色的div2,然后这个div2距离div1的上边界和左边界各30px

没错,理论上应该是这样,但是浏览器没有按照这样解析,它解析成了

距离左边没什么问题,稍微一瞄大概就是30px那个样子

但是距离上面好奇怪,红色的div2居然直接顶上去了

再仔细一看,好像div1的上面距离浏览器可视区的边界好像和之前不一样了

给我们的感觉好像就是div2的margin-top传递给了div1

没错,就是这样,浏览器解析的有问题

其实像chrome、FireFox、IE8+等这些浏览器解析CSS还算是比较好了

在IE6 IE7这些老版本的浏览器下出的问题更多

好在现在的公司都不要求兼容IE6、7这种版本很低的浏览器了

当然,我们刚刚提到的这个问题是有解决方案的

我给大家说两种解决的方案

首先,第一种,我们其实可以转变一下思路

需求不就是想让div2距离div1的上面和左边有30px吗?

除了对div2下手,去设置它的margin之外难道就没有别的办法了吗?

肯定有,我们思考一下子元素的margin是不是就等同于父元素的padding呢?

那么在我们这里div2的margin是不是就可以用div1的padding代替呢?

所以,大家基本上可以猜出我要干什么了

没错,给div1加padding:30px;即可

顺便说句废话,记得把div2的margin去掉

再次预览:

不过,大家发现了没有,好像我们灰色的div1变大了

为什么变大了呢?

之前我们讲padding已经解释的很清楚了

给一个元素加padding是在width和height的基础之上加的

也就是说我们在页面上看起来的宽实际上应该是width加上padding-left,再加上padding-right

而页面上看起来的高实际上应该是height加上padding-top,再加上padding-bottom

好的,知道问题所在了,如果想让看起来的宽和高恢复到之前的大小怎么办呢?

很简单,把div1的width减去padding-left和padding-right不就可以了么?

div1的height减多少想必不用我多说了

好的,第一种方法我们介绍到这里

总结一下,其实就是将子元素的margin转换为了父元素的padding而已

那么接下来介绍的第二种方法,可以说就是先人们不断探索得到的一种方法了

为什么这么说呢?

因为初学CSS的人听了这种方法会感觉不可思议

其实方法内部蕴含了很深的东西,不是一时半会儿能理解了的

不小心又说了这么多废话,好的,直接给大家解决方案:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>xxx</title>
    <style type="text/css">
    #div1{ width:300px; height:300px; background: gray; border:1px solid gray;}
    #div2{ width:100px; height:100px; background: red; margin:30px;}
    </style>
</head>
<body>
    <div id="div1">
        <div id="div2"></div>
    </div>
</body>
</html>

大家可以发现,我给div1加了一个border就好了

此时大家一定有疑问,为什么加了border就好了呢?

对于这个问题,到目前为止我也没有弄的太明白

恕我才疏学浅

看到这里的朋友们有兴趣的话可以上网搜一些相关的资料找找原因

当然,我们给div1加了1px的border,而且是和div1的background一样的gray

那么div1看起来的宽度就会增加2px,成了302px了

这一点大家一定要注意

好了,至此为止我们的盒模型中的一些基础知识以及经常遇到的问题给大家介绍的差不多了

但是看了这么多例子不知道大家发现了没有

我们在页面中显示的每个div好像距离浏览器的可视区左边和上面都有一定的距离

其实,我这么跟大家说吧,如果我们的页面里面什么都不写

预览之后一片空白

但实际上还是有一个元素的

谁呢?

body

body是我们写的那些div、a、ul、li等等所有元素的根元素

那么知道了这一点之后我们再回想一下,上面的例子里面我们给div1加margin了吗?

没有吧?

那正常情况下div1是不是应该紧贴着浏览器的左边和上面的?

但实际情况却不是这样

那接下来我们就可以猜测这应该是body这个元素的margin或者padding

好的,大家脑子一定不要乱,认真想想为什么body的margin或者padding都可以造成这个间距

想好了之后我再告诉大家一个秘密:这个margin或者padding是浏览器自己加上去的

那么这个间距到底是margin还是padding呢?

摁下我们久违的F12

仔细观察我用橙色的箭头和框标注的样式,框的右上角有一行文字user agent stylesheet

不用管它翻译过来是什么意思了,就记住这是浏览器自带的样式就OK了

控制台已经很明白的告诉我们浏览器默认给body加的样式是margin了

好的,现在问题来了

浏览器既然自己会给body加个margin

那它会不会给其他元素,比如div ul li加什么东西呢?

实际的情况是有些标签加了,有些标签没有加

这样一来就会给我们造成一些麻烦,因为浏览器给我们加的那些乱七八糟的东西我们可能不太需要

所以我们就要把浏览器给我们加的那些东西干掉

干掉的方法有两种

第一种,我们需要把所有的元素挨盘儿检测一下

看看浏览器都给它们加了什么,然后自己去覆盖

实际上已经有人帮我们做过这个工作了

body, h1, h2, h3, h4, h5, h6, p, dl, dt, dd, ul, ol, li, form, fieldset, legend, button, input, textarea, th, td{ margin: 0; padding: 0;}

这个是我从网上随便拿了一小段过来的,这里面基本上涵盖了我们常用到的所有标签

怎么说呢?这个东西就是看起来啰嗦一些而已

在公司里面开发的时候可以直接在网上一搜,复制过来一个现成的就可以

第二种,很简洁

*{ margin:0; padding:0;}

*的意思就是所有的元素

写了这句话的话,浏览器加载我们的页面时

会将所有元素挨盘儿过一遍,不管浏览器有没有给它margin或padding

都会重新再设置它的margin为0,padding为0

这种方式显得貌似简单粗暴了一些

而且从我刚刚接触到CSS到正式参加工作的时候听很多人说过这样写不好

会使浏览器变卡,影响性能

不过我在之前的一家公司可以明目张胆的用*{margin:0; padding:0;}

而且项目都已经上线很长时间了

也没有发现什么性能不好之类的问题

所以具体用哪种方案就要看公司要求了

我平时也感觉第一种方式写那么一长串东西实在是烦死人了

说了这么多,我们还是看一下效果吧

在我们的style标签里的最前面加上*{margin:0; padding:0;}

预览之后得到

我们就会发现灰色的块紧紧贴着浏览器的边缘

这样一来,我们的愿望基本上实现了

当然在这里需要多说一句的是

浏览器给我们加的默认样式不是只有margin、padding

例如对于a标签默认的颜色是蓝色,而且还有很难看的下划线

点击之后默认变成紫色

还有对于li元素默认会有一个小黑点等等

这都是浏览器的默认样式

当然也都可以给它清掉

我们到后面遇到了再说

好的,这节课我们又介绍了关于盒模型的一些东西

当然我们的盒模型还没完,下节课接着来扯

时间: 2024-10-12 21:07:19

Web前端从入门到精通-10 css简介的相关文章

Web前端从入门到精通-9 css简介

欢迎大家回来,前段时间给大家介绍了浮动以及清除浮动的相关内容 上节课到最后我们留了一个小问题 如果所有的子元素都没有加浮动,父级不设置高度时,父级的高度会不会随子级的高度自动撑开 我们可以通过下面的代码来测试 .ul1{ width:102px; border:2px solid red;} .ul1 li{ width:100px; height:100px; border:1px solid black;} <ul class="ul1"> <li><

Web前端从入门到精通-7 css简介

欢迎回来,上节课没有给大家留什么问题,但是介绍了一个很重要的问题,那就是css的层叠优先级顺序: 行间样式>id选择器>类选择器>元素选择器 好的,复习到此结束,接下来我们继续学我们的css 这节课要讲一个很重要也是理解起来略有困难的东西——浮动 之前的课程中我们举了好几个列表的例子,但无一例外的是所有的列表都是竖着成一排的 那么怎么让它们横起来呢?——就是用我们的浮动(float) 在正式介绍浮动这个东西之前,我们先来说个知识点——块元素和内嵌元素 什么意思呢?不知道大家是否发现了一个

Web前端从入门到精通-13 css简介

欢迎回来,上节课的话我们做了一个导航 总体来说还能看,但是也有一些小问题 首先,当我们把鼠标移上去的时候不变成小手 这个看起来最不舒服了 所以先从这里开刀 说到这里了,想和大家沟通一个问题 我们平时上网的时候鼠标放到什么地方才变成小手呢? 是不是可以点的地方呢? 可以点的话意味着什么? 意味着是一个链接对不对 链接的话在我们的html里面毫无疑问就是a标签了 好的,说到这里脾气着急的马上就会说,那就用a标签包裹文字不就完事儿了? 话一说完,代码就会被改成这样 <!DOCTYPE html> &

Web前端从入门到精通-6 css简介

上节课我们主要介绍了三种css的选择器 结束的时候留了一个小问题,不知道大家还有没有记得 当多种选择器同时对一个元素操作时,会有什么情况呢? 不知道大家试了没有 先说句题外话,可能有的朋友说 你闲的蛋疼用多种选择器操作一个元素 我让一种选择器操纵一个元素不就可以了吗 我们学一个东西往往是为了用的,而不是为了装13的 所以我提出的这个问题自然有它的价值所在 接下来我会给大家分析 还拿我们的列表做例子,这次给大家举一个百度首页的例子 百度的推荐导航列表这里是不是我们的鼠标移上去的那一个块儿 外面会出

Web前端从入门到精通-11 css简介

欢迎大家回来,上节课我们又说了margin的一个bug 那就是子元素的margin-top会传递给父元素 解决方案也已经给出来了,在此不再废话 此外还说了默认样式的清零,这个的话我个人感觉无所谓了 平时自己写代码测试的时候就直接上*{margin:0; padding:0;} 之前我们讲解盒模型的时候一直都是拿div举例子 那么我们知道,div天生就是个块元素 所以我们之前见到的那一堆margin.padding的规则都是针对块元素的 那不知道大家有没有自己测试过内嵌元素的盒模型 我们接下来就和

Web前端从入门到精通-12 css简介

好的,在之前的11节课中 我们从对编程语言一无所知的状态循序渐进的了解了很多知识 包括html页面结构,css引入的几种方式,浮动,清除浮动,盒模型等等 现在是发挥这些知识用武之地的时候了 我们在上网浏览网页的时候不知道大家有没有注意过 在网页的最上面会有一个导航,比如 鼠标移入之后还会高亮显示 那么我们今天就利用我们之前学的东西做这样一个导航 首先,大家可以想象一下这个导航的大概结构是什么样子的呢? 可以不可以在外面有个大div作为父级 然后里面放上4个小div,一个div里面就是一项 当然没

Web前端从入门到精通-5 css简介

上节课我们说到了标签以及标签的属性 比如一个div标签,它的属性有width height background对吧? 也就是 <div width="100px" height="100px" background="red"></div> 如果你的回答是对 那么恭喜你,你已经学晕了 上面这段代码是错误的 div下辈子也不会有width height background这些属性的 上节课,关于div,我们只说了它的一个

Web前端从入门到精通-4 html简介

本节课我继续带着大家学习html 上节课的话我们已经有了一个页面,大概长成这个样子: <!DOCTYPE html> <html lang="en"> </html> 双击这个文件打开预览,什么都没有 好的,从现在开始我们给它加一些内容 根据html语法规定,html标签里的直系子标签有head body等 所以你的脑海中应该想着我们的页面变成了这样 <!DOCTYPE html> <html lang="en"

Web前端从入门到精通-2 关于html和开发工具

上节课呢,我们说到了html源文件在浏览器中打开就是一个网页了,那么html源文件是怎么来的呢? 很多教程为了让大家很快入门,就直接告诉大家说先创建一个记事本文件,然后把它的扩展名改成html,双击就会发现在浏览器中打开了 之后就对记事本里面怎么写html开始大讲特讲 但是个人认为,这样说忽略了初学者的感受 第一次接触html的朋友如果看到上面这样的讲解的话很容易会提出疑问 你为什么新建了一个txt改成了html就可以了?我新建一个别的文件比如word文件(扩展名为doc)改成html可不可以呢