美文网首页
CSS 响应式布局案例(一)

CSS 响应式布局案例(一)

作者: 陈鑫呀 | 来源:发表于2019-03-02 17:05 被阅读0次

    本文转载自我的个人博客

    本文讲解如何利用纯原生的CSS实现响应式布局。

    前段时间在freeCodeCamp看到几个响应式布局的案例。这几个案例把原生CSS实现响应式布局的知识点囊括得比较全面。想着可以总结一下,于是就有了这篇文章,文章应该会分为三期,这是第一期。

    案例一

    案例演示以及源码网址进去以后点击Fork即可看到源码。

    知识点:图片的响应式布局

    tribute-page-1.gif

    从上图我们可以观察到,图片的大小可以随页面可视区域的变化而变化,但是图片并不会超过它的原始大小。这种方案既保证了图片的完整显示,又不至于被放得过大而失真。实现这一功能的CSS代码其实很简单,让我们来看一看img标签相关的代码:

      //html
      <img id="image" src="https://c2.staticflickr.com/4/3689/10613180113_fdf7bcd316_b.jpg" alt "pic from flickr">
    
      //css
      img{
        max-width: 100%;  //关键代码
        display: block; 
        height: auto;
        margin: auto;
      }
    

    max-width表示img标签可以达到的最大宽度,100%是基于其父级容器元素而言的。一个img标签,如果我们不对它的长宽进行任何设定,那么它的大小将是它所包含的图片的原始大小。但是加上max-width: 100%之后表示,img的宽度将不会超过其容器元素的宽度。这个时候可以分两种情况:

    1.容器元素的宽度大于img图片的原始宽度:此时满足max-width: 100%img将以其图片的原始大小显示。

    1. 容器元素的宽度小于img图片的原始宽度,这个时候会将img的宽度调整为其容器元素的宽度。

    margin: auto保证img标签永远在容器元素内居中。

    display: blockheight: auto在本例中其实是不必须的。当你只设定了img标签的widthheight中的一个时,图片会自动按比例的缩小或放大。

    案例二

    案例演示以及源码网址进去以后点击Fork即可看到源码。

    知识点:CSS3 新增单位 vw、vh、vmin、vmax

    personal-portfolio-1.gif

    在上图中我们可以看到,无论我们怎么改变视窗的大小,首屏内容始终恰好占据整个视窗的大小。我们来看一下这一部分的代码:

      //html
      <div id="welcome-section" class="intro">
        <h1>Hey i'am Mimic</h1>
        <p>a web developer</p>
      </div>
    
      //css
      .intro {
        background: #e0ebe8;
        height: 55vh;  //关键代码
        padding-top: 45vh;  //关键代码
      }
    

    这其中就用到了css的新增单位vhvh是一个表示浏览器视窗高度的单位,所谓视窗,就是浏览器用来真正显示内容的区域,不包括工具栏等。1vh表示视窗高度的百分之一,100vh表示整个视窗的高度。注意,我们这里虽然是使用了百分号的机制,但是书写的时候不用写百分号,只用写数字就好了。在上端代码中,heightpadding-top加起来正好是100vh,所以首屏内容恰好占据整个视窗的大小。

    类似于vh的新增单位还有vwvminvmax。大家可以通过这篇文章了解一下。

    知识点:媒体查询(@media)

    personal-portfolio-2.gif

    在上图中我们可以看到,几个圆形链接随着视窗宽度的缩小在不断改变排列方式,到最后变为了长方形,这其中就用到了媒体查询。我们先看一下这部分的相关代码:

      //html
      </div>
        <a href="https://facebook.com/freecodecamp" target="_blank" class="contact-details">Facebook</a>
        <a id='profile-link' href="https://github.com/freecodecamp" target="_blank" class="contact-details">GitHub</a>
        <a href="https://twitter.com/freecodecamp" target="_blank" class="contact-details">Twitter</a>
        <a href="mailto:example@example.com" class="contact-details">Send a mail</a>
        <a href="tel:555-555-5555" class="contact-details">Call me</a>
      </div>
    
      //css
      .contact-details {
        display: inline-block;   //关键代码
        font-weight: bold;
        margin: 0 35px 45px 35px;
        list-style-type: none;
        border: 2px solid #90C695;
        border-radius: 100%;
        width: 100px;
        height: 100px;
        line-height: 100px;
        background: #e0ebe8;
        color: #008080;
        text-decoration: none;
      }
      .contact-details:hover {
        background: #E4F1FE;
        color: green;
      }
      @media (max-width: 367px) {  //关键代码
        .contact-details {
          border: 2px solid #90C695;
          border-radius: 0;
          width: 90px;
          height: 20px;
          padding: 10px;
          line-height: normal;
        }
      }
    

    圆形链接随着视窗宽度的缩小在不断改变排列方式是通过display: inline-block实现的。inline-block是一种介于inlineblock之间的样式。

    1. display: inline-blockdisplay: inline最大的区别是inline-block可以设置自己的宽和高,inline样式不可以。
    2. display: inline-blockdisplay: block最大的区别是inline-block元素后面不会自动加上换行符,所以几个inline-block元素可以排列成一行,而block元素却不可以。

    链接由圆形变为长方形是通过媒体查询实现的,媒体查询的标识符是@media。而上段代码中@media (max-width: 367px) {css-code}的含义就是当视窗宽度小于367px时,执行其代码块中的代码css-code

    上例只是媒体查询最简单的一种写法,其完整写法应该为:

      @media not|only mediatype and (expressions) {
        CSS-Code;
      }
    

    其中,mediatype表示媒体类型,有四个可选项:all表示所有类型,print表示打印机,screen表示屏幕(电脑,手机,平板),speech表示屏幕阅读器。具体用法如下:

      @media only screen and (min-width: 480px) {
        body {
          background-color: lightgreen;
        }
      }
    

    上例的含义是,当且仅当媒体类型为屏幕,宽度大于480px时,将body标签的背景色改为浅绿色。而对于别的媒体类型,比如打印机,则不会生效。更多关于媒体查询的用法,可以参考这个网站

    以上就是第一期的内容,我们下期见。

    相关文章

      网友评论

          本文标题:CSS 响应式布局案例(一)

          本文链接:https://www.haomeiwen.com/subject/ddcyuqtx.html