Skip to content

CSS 高级布局技巧 #14

Open
Open
@sorrycc

Description

@sorrycc

随着 IE8 逐渐退出舞台,很多高级的 CSS 特性都已被浏览器原生支持,再不学下就要过时了。

:empty 区分空元素

兼容性:不支持 IE8

Demo

假如我们有以上列表:

<div class="item">a</div>
<div class="item">b</div>
<div class="item"></div>

我们希望可以对空元素和非空元素区别处理,那么有两种方案。

:empty 选择空元素:

.item:empty {
  display: none;
}

或者用 :not(:empty) 选择非空元素:

.item:not(:empty) {
  border: 1px solid #ccc;
  /* ... */
}

:*-Of-Type 选择元素

兼容性:不支持 IE8

举例说明。

给第一个 p 段落加粗:

p:first-of-type {
  font-weight: bold;
}

给最后一个 img 加边框:

img:last-of-type {
  border: 10px solid #ccc;
}

给无相连的 blockquote 加样式:

blockquote:only-of-type {
  border-left: 5px solid #ccc;
  padding-left: 2em;
}

让奇数列的 p 段落显示红色:

p:nth-of-type(even) {
  color: red;
}

此外,:nth-of-type 还可以有其他类型的参数:

/* 偶数个 */
:nth-of-type(even)

/* only 第三个 */
:nth-of-type(3)

/* 每第三个 */
:nth-of-type(3n)

/* 每第四加三个,即 3, 7, 11, ... */
:nth-of-type(4n+3)

calc 做流式布局

兼容性:不支持 IE8

Demo

左中右的流式布局:

nav {
  position: fixed;
  left: 0;
  top: 0;
  width: 5rem;
  height: 100%;
}

aside {
  position: fixed;
  right: 0;
  top: 0;
  width: 20rem;
  height: 100%;
}

main {
  margin-left: 5rem;
  width: calc(100% - 25rem);
}

vwvh 做全屏滚动效果

兼容性:不支持 IE8

Demo

vwvh 是相对于 viewport 而言的,所以不会随内容和布局的变化而变。

section {
  width: 100vw;
  height: 100vh;
  
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  
  background-size: cover;
  background-repeat: no-repeat;
  background-attachment: fixed;
}

section:nth-of-type(1) {
  background-image: url('https://unsplash.it/1024/683?image=1068');
}
section:nth-of-type(2) {
  background-image: url('https://unsplash.it/1024/683?image=1073');
}
section:nth-of-type(3) {
  background-image: url('https://unsplash.it/1024/683?image=1047');
}
section:nth-of-type(4) {
  background-image: url('https://unsplash.it/1024/683?image=1032');
}

body {
  margin: 0;
}
p {
  color: #fff;
  font-size: 100px;
  font-family: monospace;
}

unset 做 CSS Reset

兼容性:不支持 IE

Demo

body {
  color: red;
}
button {
  color: white;
  border: 1px solid #ccc;
}

/* 取消 section 中 button 的 color 设置 */
section button {
  color: unset;
}

column 做响应式的列布局

兼容性:不支持 IE9

Demo

nav {
  column-count: 4;
  column-width: 150px;
  column-gap: 3rem;
  column-rule: 1px dashed #ccc;
  column-fill: auto;
}

h2 {
  column-span: all;
}

(完)

Activity

luobotang

luobotang commented on Dec 13, 2016

@luobotang

学习了!

fekata

fekata commented on Dec 14, 2016

@fekata

不知不觉, IE8 也逐渐退出舞台了,感觉IE6还是昨天

xinghunMeng

xinghunMeng commented on Dec 14, 2016

@xinghunMeng

mark

ascoders

ascoders commented on Dec 14, 2016

@ascoders

用 all + unset 做 CSS Reset

兼容性:不支持 IE

section button {
    all: unset;
}
MichealWayne

MichealWayne commented on Dec 15, 2016

@MichealWayne

已收,可惜calc、vw、vh等一些属性需要安卓4.4以上,还是没能用上

yuanxj1024

yuanxj1024 commented on Dec 16, 2016

@yuanxj1024

如今是等待安卓低版本系统淘汰-_-~

Demy-ouyang

Demy-ouyang commented on Dec 16, 2016

@Demy-ouyang

非常棒的分享,提示一下有错别字哦,(让奇数列的 p 段落先死红色)显示。。。

sorrycc

sorrycc commented on Dec 16, 2016

@sorrycc
OwnerAuthor

@Demy-ouyang 感谢提醒,已修正。

amowu

amowu commented on Dec 16, 2016

@amowu
ooodlx

ooodlx commented on Dec 19, 2016

@ooodlx

get~ 学习了

jstf9673

jstf9673 commented on Dec 19, 2016

@jstf9673

mark

JohnnieFucker

JohnnieFucker commented on Dec 21, 2016

@JohnnieFucker

calc 应该慎用,特别是在一些列表里。性能很差的。

zhiqiang21

zhiqiang21 commented on Dec 27, 2016

@zhiqiang21

很多属性移动端支持的都不好呀

shfshanyue

shfshanyue commented on Feb 4, 2017

@shfshanyue

让无内容的 a 标签显示其 href

a:empty::after {
  content: attr(href);
}
lkdghzh

lkdghzh commented on Jun 14, 2017

@lkdghzh

mark

jin5354

jin5354 commented on Jun 14, 2017

@jin5354

vw 和 vh 在 IE9-10 下行为与现代浏览器不同,要注意

Fiv5

Fiv5 commented on Dec 22, 2017

@Fiv5

mark!

pobing

pobing commented on Jan 16, 2018

@pobing

mark

yuanxj1024

yuanxj1024 commented on Jun 7, 2018

@yuanxj1024

请问 vw/vh ->rem 有比较好的转换方案么?

yilidan

yilidan commented on Jan 16, 2019

@yilidan

mark

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @sorrycc@amowu@JohnnieFucker@pobing@zhiqiang21

        Issue actions

          CSS 高级布局技巧 · Issue #14 · sorrycc/blog