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

css菜鸡的自我救赎

作为一个不喜欢写样式的前端,遇到了直接对外的活动页面的需求,一下炸出一堆问题:看到百度的顶部,你会想到什么方案呢?我们看百度搜索的顶部,顶部的#head(搜索框这一行都是)是fixed的,紧接着的那个div是一个tab。当然fixed脱离文本流,就用padding把自己的主要内容顶到下面去,不

作为一个不喜欢写样式的前端,遇到了直接对外的活动页面的需求,一下炸出一堆问题:

  • 单位乱用,rem、vh、vw、px乱用甚至混在一起用
  • html冗余,有时候一个div只是为了取margin
  • 一个页面用多种布局方案,flex、float、relative+top、absolute+top、margin,自己坑自己
  • 各种随意,不严格按照视觉稿 理论倒是熟悉,但用起来还是一塌糊涂。于是,回头自我救赎一波,好好复习基础。flex、grid后面不多作研究,尤其是grid这种一两行就可以搞定很多复杂样式。如果我们不知道新技术是为了什么而来的,解决什么痛点,没有体验一下刀耕火种的时代,又没有一个良好的团队合作能力,做起项目来还真的不一定是“写页面太简单了”这种事情。

1. 一些实践方案深入浅出

1.1 padding

看到百度的顶部,你会想到什么方案呢?

css菜鸡的自我救赎

我们看百度搜索的顶部,顶部的#head(搜索框这一行都是)是fixed的,紧接着的那个div是一个tab。当然fixed脱离文本流,就用padding把自己的主要内容顶到下面去,不然内容就直接置顶了。

没错,就是很简单的一个css,实现的方法有很多。然后我们再看一下这个视觉效果要怎么实现:

css菜鸡的自我救赎

img+脱离文本流的方法?双div+定位?

其实,一个div+padding马上解决,div背景100%然后center+padding-top,div里面的文字就自然到下面去了,然后定位定准就好了。另外,文字换成伪元素也可以。

控制宽高比

一些人也知道,padding的百分比相对于width,那么这样就可以实现了一个等比例的盒子,然后随便缩放都可以了。比如做一个正方形,边长是屏幕宽度一半:

.scale50 {
  background: #aaa;
  width: 50%;
  height: 0;
  text-align: center;
  padding-top: 50%;
}

很多时候,我们需要什么4:3,16:9的图片,就可以用这样的方法解决了。

1.2 margin

再看看百度的右边栏

css菜鸡的自我救赎

对于这个栏的左边部分,用margin还是padding呢?这个情况当然是padding,因为有一个边线:blush:。对于这个栏的上面,是padding还是margin呢?实际上,在这个情况下都是一样的,但是有一个潜在问题:如果有两行,而且水平方向还有其他盒子的margin,那么就会发生水平方向的margin坍塌(取较大值);或者当有父盒子包裹,他的margin会走到外面影响外面。这时候,又要加上转化为bfc的代码。

  • case1:
    css菜鸡的自我救赎
  • case2:
    css菜鸡的自我救赎

还敢乱来居中吗

比如,有一个设计稿是这样的:

css菜鸡的自我救赎

可能看起来是居中,然后很快写出来子绝父相的万金油居中。然后设计突然走过来说,怎么总是感觉有点不对啊,于是看一下下半部分:

css菜鸡的自我救赎

真的不是居中啊,水平方向的也是。那么,这时候,写死margin不就搞定了,保证视觉不来找你。

:bird:...许多天后,测试说,某某手机视觉就出问题了。当然,写死px肯定药丸啊,所以移动端就是要用rem解决。我这里一个rem等于50px,那换算一下,图上第一个div(绿色的钩)的margin就是176 148 0 151,换成rem是3.52 2.96 0 3.02,后面的样式问题只要不是横屏或者ipad的(无视觉稿的前提)都不是你的锅了。

负的margin

正的就是撑开整个margin-box,那负的我们就可以想象出来,吃掉这个margin-box。一般的情况下,就是平移。如果加上了float就神奇了,还能跨行平移。双飞翼和圣杯布局其中一部分就是利用这个原理

前面都是废话,不就是一个盒子模型嘛。没错,盒子模型,谁都知道,但是用起来谁用的好,这就难说了

2. 开始试试水

接下来,准备用n种方法实现三列布局,中间自适应,两边固定宽度

绝对定位

html:

中间
左边
右边

css:

#container{
  position: relative;
  height: 100px;
}
.l, .m, .r {
  height: 100px;
  position: absolute;
}

.l {
  background: #f00;
  width: 100px;
}

.m {
  background: #0f0;
  width: calc(100% - 150px);
  margin: 0 50px 0 100px;
}

.r {
  background: #00f;
  width: 50px;
  right: 0;
}

分析:不论顺序,流式布局,中间先加载,但用了calc

"calc?! 避免recalculate啊"

这时候,去吧,ie盒模型:

.m {
  background: #0f0;
  width: 100%;
  box-sizing: border-box;
  padding: 0 50px 0 100px;
}

圣杯与双飞翼布局

还是一样的html

.container {
  height: 100px;
  width: 100%;
  padding: 0 50px 0 100px;
}

.m, .l, .r {
  height: 100px;
  float:left;
}

.m {
  background: #f00;
  width: 100%;
}

.l {
  background: #0f0;
  width: 100px;
  margin-left: -100%;
  position: relative;
  left: -100px;
}

.r {
  background: #00f;
  width: 50px;
  margin-right: -50px;
}

很多人说这个难懂,其实我们可以一步步来:先放好容器设好宽高背景,三个div是mlr顺序。然后float,显然m自己占一行,其他两个占一行。接着,用到负margin,先把左边到移动一行,即是-100%,右边就移动一个身位-50px就ok,现在已经是视觉上的3列。最后,中间部分开头被遮住,而且占了100%行宽。那么我们只能用容器的padding或者自己的margin压自己。如果是用容器padding,将左右两边腾出来,刚刚好放下lr两个div。最后,l和r还是在m里面,所以还要移一下,relative就好。这就是圣杯布局

如果是用自己的margin压自己,那么就需要多一个div包住自己。前面步骤一样,包住自己的div占满一行,但是自身有margin,完美解决。这就是双飞翼布局。

中间

这是传统css+div的一套比较好的解决方案,不过我们愁的是高的问题了,需要自己设

float+calc

左边
这是中间内容
右边

这次的html不能调换顺序写了

.container {
  height: 100px;
  width: 100%;
}

.m, .l, .r {
  height: 100px;
  float: left;
}

.m {
  background: #f00;
  width: calc(100% - 150px);
}

.l {
  background: #0f0;
  width: 100px;
}

.r {
  background: #00f;
  width: 50px;
}

类似于前面的absolute方案,calc可以用ie盒子替代

行内元素

是不是遇到过行内元素总是有间隔的问题,html加注释就可以去掉分隔符,当然这里要实现3列布局:

左边
中间
右边

css:

.l, .m, .r {
  height: 100px;
  display: inline-block;
}

.l {
  background: #f00;
  width: 50px;
}

.m {
  background: #0f0;
  width: calc(100% - 150px);
}

.r {
  background: #00f;
  width: 100px;
}

特点:样式及其脆弱,内容换行马上崩了,只能在没文字的情况好一点。calc还是一样的方法,ie盒子完美解决

两个div实现三列

中间
右边

左边的内容用attr抓

.container {
  float: left;
  height: 100px;
  background: #f00;
}

.container::before {
  content: attr(l);
  display: block;
  width: 100px;
  float: left;
  height: 100px;
  background: #0f0;
}

.r {
  height: 100px;
  width: 50px;
  float: left;
  background: #00f;
  margin-right: -100%;
}

用content做的内容,注定了左边不能再放html元素了

flex与grid

html还是按顺序:

左边
这是中间内容
右边

大家都知道的flex实现:

.container {
  display: flex;
  height: 100px;
}

.l {
  background: #f00;
  min-width: 100px;
}

.m {
  background: #0f0;
}

.r {
  background: #00f;
  min-width: 50px;
}

不过,我更看好grid,符合 程序员 思维,一个配置,两行代码,基本搞定大部分场景

.container {
  display: grid;
  grid-template-columns: 100px auto 50px;
  grid-template-rows: 100px;
}

.container div:nth-of-type(1) {
  background: #f00;
}

.container div:nth-of-type(2) {
  background: #0f0;
}

.container div:nth-of-type(3) {
  background: #00f;
}

一个div实现

css:

div {
  background: #f00;
  height: 100px;
  margin: 0 50px 0 100px;
  position: relative;
}

div::before {
  content: '左边';
  display: block;
  background: #0f0;
  height: 100px;
  width: 100px;
  position: absolute;
  left: -100px;
}

div::after {
  content: '右边';
  display: block;
  background: #00f;
  height: 100px;
  width: 50px;
  position: absolute;
  right: -50px;
  top: 0;
}

当然,只是娱乐而已,项目上谁会写这个。某些小装饰可能有机会上

又瞎搞一堆乱七八糟的,先冷静一下


以上所述就是小编给大家介绍的《css菜鸡的自我救赎》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • 前端开发工程师必读书籍有哪些值得推荐?我们直接进入代码复杂版式设置,如下所示,先写些标签,源码在这个链接里面:https://codepen.io/Shadid ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了如何在Jquery中通过元素的样式值获取元素,并将其赋值给一个变量。提供了5种解决方案供参考。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • 为什么下一个5年,软件定义市场将暴涨32%
    Technavio公司的市场调研分析预测,到2020年全球软件定义一切(SDx)市场年复合增长率将超过32%,向虚拟化的转化是市场增长的主要驱动力。近来 ... [详细]
author-avatar
谁会心如刀割_590
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有