<pre>会撑开父辈<fieldset>的宽度,怎么能让pre的宽度随filedset的宽度

第一个问题,fieldset的设置宽度以后,为何会被撑宽。

fieldset在没有内部元素时,是以block方式解析的,即外部100%宽度自适应;但设置width以后,本应当维持这个宽度了,为何会被撑宽呢?

因为它的min-width属性,在CSS的属性的权重中,min-width > width,在chrome里面:

fieldset { min-width: -webkit-min-content; }

改变它的min-width就可以,复写它的值,或者改为inherit(考虑到是手机端开发,inherit是全支持的)都可以。

fieldset { min-width: inherit; }
/*or*/
fieldset { min-width: 100px; }

IE和chrome的相应问题已经解决,但是还剩firefox。查看fieldset的默认样式:

fieldset {
  display: block;
  margin-left: 2px;
  margin-right: 2px;
  padding: 0.35em 0.625em 0.75em;
  border: 2px groove ThreeDFace;
}
*|*::-moz-fieldset-content {
  display: block;
  unicode-bidi: inherit;
  text-overflow: inherit;
  height: 100%;   
}

抱歉,没有能够找到使得其宽度固定时,使得其被子元素撑宽的属性。等今后有空了再细细研究吧。

至此,已经能符合楼主的一半要求,在手机端大部分浏览器(非firefox浏览器)下面,fieldset的宽度不再被子元素撑宽
第二个问题,pre元素为何会自动撑宽。

因为其white-space属性:

pre { white-space: pre; }

pre的语义既是预保留格式,这意味着(外部标签无法决定pre标签的宽度,pre标签自动包裹内部的文本节点,不忽略空白//有误,见下)。

pre标签的宽度是由如下机制进行的:

在内部内容不宽过父容器时,其宽度自适应于父容器;
在内部内容比父容器宽的时候,其宽度包裹内部内容。
这个机制类似于min-width,但比min-width还多了对于换行/空白符的处理,下面是w3school对于white-space属性值的解释:

normal  默认。空白会被浏览器忽略。
pre 空白会被浏览器保留。其行为方式类似 HTML 中的 <pre> 标签。
nowrap  文本不会换行,文本会在在同一行上继续,直到遇到 <br> 标签为止。
pre-wrap    保留空白符序列,但是正常地进行换行。
pre-line    合并空白符序列,但是保留换行符。
inherit 规定应该从父元素继承 white-space 属性的值。

把white-space改为除了nowrap和pre以外的值即可符合你的要求。不过我想问,你真的需要修改pre标签的默认行为吗?改变pre标签的默认行为,即意味着你放弃了pre标签的原本语义。

感谢分享https://segmentfault.com/q/1010000000271095

猜你喜欢

转载自blog.csdn.net/qq_32963841/article/details/82998474