热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

css的结构与布局

1.自适应内部元素在css中,不给元素一个height值时,元素会自适应其内部的元素高度,有时我们想让元素的宽度也达到此效果,

1.自适应内部元素

在css中,不给元素一个height值时,元素会自适应其内部的元素高度,有时我们想让元素的宽度也达到此效果,应用场景如下。

如下当前的这种布局,想要改成最外层的div的宽度由当前的图片撑开的效果,这时就要用到min-content这个属性值。

clipboard.png

css代码如下:

div {/*只需要给最层的div的宽度值设置成min-content即可 */width: min-content;
}

最终效果:

clipboard.png

min-content将解析这个容器内部最大的不可断行元素的宽度(即最宽的单词,图片或具有固定宽度的盒元素)

张鑫旭有一篇文章对这个属性做了详细的讲解,地址如下:
http://www.zhangxinxu.com/wor...

2.精确的控制表格的列宽

在使用表格布局时,当表格的内容不确定时,布局很难预测,因为表格的列宽是根据它的内容进行计算的,即使显示的设置了width,也不会生效,还是会根据它的内容生成宽度。会根据加载的内容不停的重绘,直到加载完。
平时生成的表格如下:

clipboard.png

为了让设置的宽度生效,并且能让过多的文字省略号显示,解决办法就是使用table-layout: fixed这个样式
代码如下:

table {table-layout: fixed;width: 100%; /*必须指定一个width,否则不生效*/
}

最终的效果如下:

clipboard.png

3.根据兄弟元素的数量设置样式

在一些应用场景中,我们可能需要根据元素的数量来设置样式,比如说列表越来越长的时候,我们可能需要调整间隔或者大小,来减少长度,提升用户的体验
例如当列表项中共有4项的时候,选中所有列表,可以通过使用scss这种预处理器,编写mixin
代码如下:

/*定义mixin*/
@mixin n-items($n) {&:first-child:nth-last-child(#{$n}),&:first-child:nth-last-child(#{$n}) ~ & {@content;}
}/*调用方法*/
li {
/*当列表正好包含四项时 命中所有列表项*/
/*定义样式*/@include n-items(4) {width: 40px;height: 100px;background: red;float: left;margin: 10px;}
}

效果如下:

clipboard.png

4.根据兄弟元素的数量范围匹配元素

应该场景同上,解决办法也是编写mixin
例如,当列表的总数是4或者更多时,选中所有列表项
代码如下:

/*定义mixin*/
@mixin n-items($n) {/*当列表的总数是4或者更多时,选中所有列表项*/&:first-child:nth-last-child(#{$n + 4}),&:first-child:nth-last-child(#{$n + 4}) ~ & {@content;}
}// 改写成 -n + 4 表示列表中有4个或者小于4时,选中所有// 同理,如2 ~ 6时,设置 n + 2 ~ -n + 6
@mixin n-items($n) {&:first-child:nth-last-child(#{$n + 2}):nth-last-child(#{$ -n + 6}),&:first-child:nth-last-child(#{$n + 2}):nth-last-child(#{$ -n + 6}) ~ & {@content;}
}

5.满幅的背景,定宽的内容

页面上有很多布局是那种内容是固定宽的,背景是占满整个视口的宽的,比如下面这种布局:

clipboard.png
实现方式有很多种,一般我们实现的代码结构都是这种的:


/* css样式*/
footer {background: "#333";
}
.wrapper {max-width: 900px;margin: 1em auto;
}

其中margin: 1em auto;就是为了让内容div居中,我们有一种更好的方式,只用一层DOM结构实现上面的布局,就是使用calc这个属性。
实现代码如下:

/* 内容 */
/* css样式*/
footer {background: "#333";/* 当浏览器不支持calc的时候回退一下*/padding: 1em;padding: 1em calc(50% - 450px);
}

原理:百分比是按照视口的宽度来解析的,所以即使里面的内容不设置宽,也会给里面的内容留出 450*2的空间,达到了之前设置 max-width: 900px;的效果。

6.垂直居中

在css中水平居中比较简单,对于行级元素,对它的父元素使用text-align: center;对于块级元素,就对它自身使用margin: auto;对于垂直居中比较难处理,目前的解决方法有:

1.基于绝对定位的方法

(1) 当元素是定宽高的时候:

div {width: 200px;height: 100px;position: absolute;top: 50%;left: 50%;margin-top: -50px;margin-left: -100px;
}

通过calc代码可以简化成下面这样:

div {width: 200px;height: 100px;position: absolute;top: calc(50% - 50px);left: calc(50% - 100px);
}

(2) 对于那些宽高不定的元素,实现方法如下:

div {position: absolute;top: 50%;left: 50%;transfrom: translate(-50%, -50%);
}

以上方案也有一个弊端就是必须是绝对定位的元素。

2.基于视口单位的方法

css3中定义了一些视口相关的单位:

  • vw 是与视口宽度相关的。1vw 实际上表示视口宽度的1%,而不是100%。

  • 同样,1vh表示视口高度的 1%

  • 当视口宽度小于高度时,1vmin等于 1vw,否则等于 1vh。

  • 当视口宽度大于高度时,1vmax等于 1vw,否则等于 1vh。
    所以我们的垂直居中可以这样实现:

div {width: 200px;padding: 2px 4px;margin: 50vh auto 0;transform: translateY(-50%);
}
**注:这里不使用50%,而是视口单位的原因是,margin的百分比是以父元素的宽度作为解析基准的,不论是margin-top or margin-left**

这种的方法是有局限性的,只能用在视口中居中的场景。

3.基于flex的方法

这种应该算是最佳的解决办法:
实现方法:

body {display: flex;
}div {margin: auto;
}

当使用flex布局时,使用margin: auto; 在水平和垂直方向都会居中。在不指定width的情况下,width: max-content;

flexbox还有一个公共就是可以将匿名的容器(就是那些没有被标签包住的文本节点)垂直居中:

text
div {width: 100px;height: 50px;display: flex;align-items: center;justify-content: center;
}

7.紧贴底部的页脚

具有块级样式的页脚&#xff0c;当页面内容足够长的时候&#xff0c;页脚会紧贴视口的底部&#xff1b;但是当页面内容的长度 <视口height - 页脚height的时候&#xff0c;页脚就会紧贴在内容的下面。一般的设计是给页脚一个固定的height&#xff0c;这种显然不健壮&#xff0c;在css3中有更好的解决方案。

&#xff08;1&#xff09; 最原始的固定高度的解决方案

html结构如下&#xff1a;

hello



this is ...



Made in ...

Made in ...


header {height: 10px
}
footer p {line-height: 1.5px;padding: 1px;margin: 1px;
}

假设当前的页脚文字永远不会折行&#xff0c;可以计算当前的页脚的高度是&#xff1a;2 &#xff0a; 行高 &#43; 3 &#xff0a; 段落垂直外边距 &#43; 页脚垂直内边距 &#61; 2 &#xff0a; 1.5px &#43; 3 &#xff0a; 1px &#43; 1px &#61; 7px;

main {min-height: calc(100vh - 7px - 10px);/* 避免内边距或外边距对高度记得算影响 */border-sizing: border-box;
}

当header和main放在一个div里时&#xff0c;css样式可以直接写成 div{min-height: calc(100vh - 7px)};
这种方法的局限性是不允许文字折行&#xff0c;并且布局是这种简单的布局&#xff0c;并且每当页脚的尺寸变化时&#xff0c;都需要跟着调整min-height的值。

&#xff08;2&#xff09;基于flex的解决方案

body {display: flex;flex-flow: columm;min-height: 100vh; /* 至少会占据整个视口的高度 */
}main {flex: 1;
}


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文详细介绍了解决全栈跨域问题的方法及步骤,包括添加权限、设置Access-Control-Allow-Origin、白名单等。通过这些操作,可以实现在不同服务器上的数据访问,并解决后台报错问题。同时,还提供了解决second页面访问数据的方法。 ... [详细]
author-avatar
绝恋love2502860291
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有