元素继承(块状元素内的border)

今天想要实现绘制一个三角形,具体代码如下

<div class="outer"><div class="inner"></div></div>

css样式:

.outer{width: 300px; height: 300px; background: #ff0;}
.inner{border-top: solid 30px pink; border-bottom: solid 30px blue; border-left: solid 30px red; border-right: solid 30px #000;}

1、此时的效果:

 

2、如果inner的css样式加上width:0;height:0; 效果:

3、如果inner的css样式加上width:100%; 效果:

 

如此看来,设置宽度了以后inner元素所占的空间就是content+border。网上搜了一下:

不可继承的:display、margin、border、padding、background、height、min-height、max- height、width、min-width、max-width、overflow、position、left、right、top、 bottom、z-index、float、clear、table-layout、vertical-align、page-break-after、 page-bread-before和unicode-bidi。

所有元素可继承:visibility和cursor。
内联元素可继承:letter-spacing、word-spacing、white-space、line-height、color、font、 font-family、font-size、font-style、font-variant、font-weight、text- decoration、text-transform、direction。
块状元素可继承:text-indent和text-align。
列表元素可继承:list-style、list-style-type、list-style-position、list-style-image。

表格元素可继承:border-collapse。

但是实际上,width属性是会被继承的,默认情况下是在outer元素的内部,如果设置了width:100%的话,那么我想应该是浏览器执行顺序的问题,浏览器先获取width,渲染结束后再添加上border,这样就会导致上述情况的出现了。

 


  

今天又发现了一个类似的现象,先上代码

       <li id="a"><button></button></li>
       <li id="b"></li>
       <li id="c"><div></div></li>
    *{margin: 0; padding: 0; border: 0;}
    #a button{width: 300px; height: 40px; background: #00af50; border: solid 5px #ccc;}
    #b{width: 300px; height: 40px; background: #3166ff; border: solid 5px #ccc;}
    #c{width: 300px; height: 40px; background: #00af50; border: solid 5px #ccc;}

效果如图:

对button设置的宽度后,边框是向内缩的,这是否是li中元素是置换元素的缘故呢?

行内元素又分置换元素和非置换元素;

置换元素是一个很特殊的元素,包括:<img>、<input>、<textarea>、<select>、<object>

这些元素是可以设置宽高,其实这一点与声明了display:inline-block的元素相似。

【1、line-height就是相当于块状元素的height;

   2、行内元素与其他元素在同一行中时(1、行内元素在前,块状元素在后,2、两个都是行内元素),若是后面的元素向左浮动,那么该元素就会跑到前面去

 3、行内元素和其他元素的对齐方式是底部对齐

 

于是测试了下,发现

1、input标签中,还有search、submit有发生了同样的情况,而type属性为text、password等input标签是正常的;

2、img的表现是正常的;

3、textarea的默认值与正常现象相同;

4、select也发生了和button同样的状况;

5、最后还剩label和object,前者严格意义上来说不是置换元素,只是它可以包含置换元素罢了,所以它默认为行内元素;object不知为何,我没有设置出宽高。。。

看来不是置换元素的问题,button、submit(input)、search(input)、select标签设置了宽度以后边框是内敛的,虽然知道了这一种现象,但只是知其然而不知其所以然,网上搜了一下也没有相关的解释,看来只能用“特例”一词来解释这“内边框”了。


 2017-05-04

另外table元素也出现了同样的情况 ,并且还要特殊一些,如图:  ,代码如下

tr{width: 80px;height: 60px; border: 1px solid #E9754C;}
th{background: #fff;border: 5px solid #FFB8B8;}
td{border: 1px solid #E9754C;}

由此可见,tr只具备宽高,border不管用,th、td可以设置border,但是整个元素是宽高不变。

button、submit(input)、search(input)、select、table,这几个元素,仔细一看,很容易发现这些元素都是已经存在特定的样式了,仔细地检查了一番,发现前面4个标签是因为

box-sizing属性导致的;box-sizing有三个值:inherit,content-box,border-box;   border-box就是元素总体大小不变,border向内,content-box就是常规的border向外;

这个属性的兼容性还是很好的,所有浏览器都支持,以后想调整边框,元素大小又要固定,不妨考虑一下box-sizing;

至于table,则是因为display:table-row的缘故,至于具体是什么原因,若是读者兴趣的可以去研究一下(现在table本身用的就很少了)。

 

posted @ 2016-11-09 11:05  烽花血月  阅读(432)  评论(0编辑  收藏  举报