分析由浏览器对input框默认宽度的不同所导致的问题

AngelaGarne 5年前
   <p>最近后端同事让我帮他修改样式的兼容性,chrome与firefox下显示的不同(只兼容这两个浏览器),究其原因,应该是两个浏览器在input(不说类型的话,默认为text,下同)默认宽度不一致导致的。</p>    <ul>     <li> <p>先看效果</p>      <ul>       <li> <p>chrome下的显示(区块宽度为1673px)</p> <img src="https://simg.open-open.com/show/d98ad07e9d56cac706bb329cf21fdb7b.png"> <p>chrome父元素.png</p> </li>       <li style="text-align: center;"> <p>firefox下的显示(区块宽度为978px)</p> <img src="https://simg.open-open.com/show/11bef6835e9d99876f2bb9aaec8a96ac.png"> <p style="text-align: center;">火狐父元素.png</p> </li>      </ul> </li>     <li> <p>父元素设置display:inline-block后,其宽度由内容(子元素)决定;子元素设置百分比 ,宽度由父元素确定,这样就导致了父元素的宽度由子元素决定,而子元素的宽度由父元素决定,说的简单点</p>      <ul>       <li>父元素(inline-block)的宽度 <= 子元素宽度</li>       <li>子元素的宽度设置为百分比 <= 父元素的宽度</li>       <li> <p>通过在浏览器测试,先不设置子元素宽度百分比的情况</p>        <ul>         <li> <p>代码</p> <div style="display: inline-block;border: 1px solid red;"> <input type="text"> </div></li>         <li style="text-align: center;">chrome展示效果<br> <img src="https://simg.open-open.com/show/95b5bb152abe38a80bf085870929b2d8.png"> <p>chrome下未定义子元素宽度的展示.png</p> </li>         <li style="text-align: center;"> <p style="text-align: left;">子元素input的宽度</p> </li>        </ul> </li>      </ul> </li>    </ul>    <p style="text-align: center;">​​​​​<img src="https://simg.open-open.com/show/1a0a5e97c9b7617554c9dc25f266dabf.png"></p>    <p style="text-align: center;">chrome下未定义子元素宽度.png</p>    <ul>     <li>父元素div的宽度</li>    </ul>    <p style="text-align: center;"><br> <img src="https://simg.open-open.com/show/27ecad8c84df55f532d9a1969036c5ff.png"></p>    <p style="text-align: center;">chrome下父元素宽度.png</p>    <ul>     <li> <p>设置子元素宽度百分比</p> </li>    </ul>    <p>先看代码</p>    <p><div style="display: inline-block;border: 1px solid red;"> <input type="text" style="width: 50%;background: black"> </div></p>    <p style="text-align: center;">chrome的展示效果<br> <img src="https://simg.open-open.com/show/38d29cd40851537c387e469088f6648b.png"></p>    <p style="text-align: center;">chrome下的展示效果.png</p>    <ul>     <li> <p>子元素input的宽度</p> </li>    </ul>    <p style="text-align: center;"><br> <img src="https://simg.open-open.com/show/c2d990d08859031ee77034dfcc20bb00.png"></p>    <p style="text-align: center;">chrome下子元素的宽度.png</p>    <ul>     <li> <p>父元素div的宽度</p> </li>    </ul>    <p style="text-align: center;"><br> <img src="https://simg.open-open.com/show/27ecad8c84df55f532d9a1969036c5ff.png"></p>    <p>chrome下设置子元素宽度百分比的父元素宽度.png</p>    <ul>     <li>由此可见,无论子元素是否设置宽度百分比,都不影响父元素的宽度。</li>     <li> <p>根据子元素无论是否设置宽度百分比而不影响父元素的宽度(inline-block,宽度由内容决定),可以得出如下结论:</p>      <ul>       <li>先计算父元素的宽度,不考虑子元素宽度的百分比,这样父元素的宽度就通过子元素给撑开了;由于不同浏览器默认的Input框的宽度不一样,就导致了父元素的宽度不一样</li>       <li>然后再根据父元素的宽度来及其子元素的百分比来设置子元素的宽度。</li>      </ul> </li>     <li> <p>分析问题来源的原因</p>      <ul>       <li>其父元素设置了display:inline-block,宽度由内容决定        <ul>         <li>内容中,由于input框没有定义宽度,所以显示其默认的宽度(在火狐与谷歌中是不一致的)=> 父元素的宽度不一致</li>        </ul> </li>       <li>子元素设置了宽度百分比,由其父元素的宽度决定 => 子元素的宽度不一致</li>      </ul> </li>     <li> <p>各个浏览器下对input框的默认宽度</p>      <ul>       <li style="text-align: center;"> <p>谷歌</p> <img src="https://simg.open-open.com/show/58e1923563f8e2389c3d3dd5d090b7e4.png"> <p>chrome下input的默认宽度.png</p> </li>       <li style="text-align: center;"> <p>火狐</p> <img src="https://simg.open-open.com/show/c76211ae2ebf5a782fdeb9e46bcf7bad.png"> <p>firefox下input默认宽度.png</p> </li>       <li style="text-align: center;"> <p>IE</p> <img src="https://simg.open-open.com/show/6c5e92bfca4b4bb87b1ae79a11793ad2.png"> <p>IE10下input的默认宽度.png</p> </li>      </ul> </li>     <li> <p>解决方案</p>      <ul>       <li> <p>重置input框的宽度为数值,不要用浏览器默认的宽度,否则可能会导致在各个浏览器的表现不一致</p> </li>       <li> <p>重置input的宽度为百分比,而其父元素的宽度由内容决定(比如display:inline-block),就会出现本例中的情况,此时可以定义父元素的宽度,不让其宽度由内容决定</p> </li>      </ul> </li>    </ul>    <p> </p>    <p>来自:http://www.jianshu.com/p/0e01d96a3a58</p>    <p> </p>