zoukankan      html  css  js  c++  java
  • css layout(布局) 两列/两栏

      很久之前在知乎看到一个很有趣的观点,某位用户说css为什么难学,是因为它们不正交,也就是说逻辑关联性不强,然后学了这么久的前端,js(react、umi、dva、node.js、egg),对于html和css没有怎么认真研究,于是前段时间看了《Head First Html and CSS》2.1,看完了感觉就是写页面的时候,要考虑到页面的语义化,然后css好像没有学到什么技巧,就是简单的页面流,布局,margin border padding content(简称MBPC),感觉学到了点东西,又感觉什么都没学到。

      现在用自己的话描述一下css中最重要的组成,布局。

      用布局中的两列布局的实现,一探究竟。众所周知,页面中有三种基本的定位机制,普通文档流(块状元素上到下,行内元素从左上到右下),浮动定位(float),绝对定位(absolute)。

      所以第一种方式,用绝对定位的方式进行两列布局(两栏布局)。

      html所示:

       css:

    效果:

     总结一下,父元素(标签)position relative,子元素absolute,父元素“框”住子元素,也就是俗称的“子绝父相”的定位模板。其中也用到了left top等定位(absolute relative fixed)之后可以用到的属性。

    第二种方式就是浮动了。

    html:

     css:

     效果图我就不贴了,反正都是一样的。

    在做这个float以及前面的absolue的时候,我都是固定了子元素的宽高(50%,height:200px),在选谁是浮动定位/绝对定位的时候左右都有过尝试,发现了一些问题,总得来说就是“谁主张谁举证”,谁要违反普通页面流的特性,谁就要做出“定位”。但元素right进行float:right之后,,尽管进行margin或者css3的transform:translateY()进行位移,原本元素占据的空间还会存在的。

    第三种就是 弹性盒子(flex布局)

    html:

    css:

     

    第四种:table布局

    html

    css

    第五种,grid

    html

    css

     

     一共五种方法,就是 绝对定位,浮动,flex,table,grid,那各自有什么优缺点呢?

    参考:https://segmentfault.com/a/1190000014015687

    绝对定位:优点是快捷,缺点是脱离文档流,子元素也要脱离,导致使用性变差。(??)

    浮动:优点:快捷,缺点:脱离文档流,常见问题是怎么清除浮动。 延伸:怎么清除浮动?各有什么利弊?

    flex:参考答案里的说法是解决前两个方案的不足,那么是不会脱离文档流吗?但是我查到jianshu.com/p/1d666502c9a3 确实会脱离文档流的呀?优点??

    table:历史上说起麻烦,操作繁琐,对seo不友好,当某一个单元格高度变化时,其余表格跟着调整高度,但有的场景不需要;优点:兼容性非常好,pc可兼容ie8;

     grid:新技术,960宽,12列,代码简单;

    ----------------------------------------------------------------------------------------------------------

    增加一项条件,使之便困难。

    ----------------------------------------------------------------------------------------------------------

    要求左列定宽,右列自适应

    第一种:绝对定位法。

    html

    css

     发现了没,这里没有用“谁主张谁举证”的原则,而是将本来在左边的列设为absolue,使之脱离文本流,这样子,右列的宽度就不用指定了,而不用指定宽度就是我们的目的-自适应。再使用margin-left就可以将content显示在视野之中。

    第二种:浮动法

    html

    css

    使用浮动法,直接用左列浮动到左边,这样子也是脱离文档流了,然后再把右列高度设定好,因为块级元素自动占满一行,所以宽度自适应了。但是这里没有考虑到一个很严肃的问题,那就是有右列里面的文字、图片、子元素块等内容怎么办?所以 还要margin-left 左列的宽度,这样子才完美。

    第三种,flex

    html:

    css

     注:flex:1 是flex-grow:1的简写。就是放大的倍数。

     http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

    第四种 table布局,https://segmentfault.com/a/1190000004424442这个答主说table是上个世纪的产物(哭)

    html

    css

    第五种:grid布局

    html

     css

    https://segmentfault.com/a/1190000014015687

  • 相关阅读:
    ubuntu安装jdk的两种方法
    LeetCode 606. Construct String from Binary Tree (建立一个二叉树的string)
    LeetCode 617. Merge Two Binary Tree (合并两个二叉树)
    LeetCode 476. Number Complement (数的补数)
    LeetCode 575. Distribute Candies (发糖果)
    LeetCode 461. Hamming Distance (汉明距离)
    LeetCode 405. Convert a Number to Hexadecimal (把一个数转化为16进制)
    LeetCode 594. Longest Harmonious Subsequence (最长的协调子序列)
    LeetCode 371. Sum of Two Integers (两数之和)
    LeetCode 342. Power of Four (4的次方)
  • 原文地址:https://www.cnblogs.com/1024hack/p/12608585.html
Copyright © 2011-2022 走看看