1. 实现左中右三栏布局,左右固定宽度,中间自适应(五种方式)(清除浮动)

五种方法:1.浮动 float 2.定位 position 3.弹性盒子布局 flex 4.表格布局 table 5.网格布局 grid

方法1:浮动 --float (1)浮动原理:

当一个元素浮动之后,就会移出正常的文档流(内联元素与p标签会识别float为正常文档流。),向左或向右平移,直到碰到了所处容器的边缘,或者碰到另外一个浮动的元素。

一旦让div浮动起来,其父元素立刻会像inline一样产生包裹性(包裹性就是父元素的宽度会收缩到和内部元素宽度一样,float属性会改变元素display属性最终的值。),其容器的宽度会随内容自适应(这也是通常float元素需要手动指定width的原因)

(2)浮动特点:

元素在浮动之后有三个重要的特点:

脱离文档流。向左/向右浮动直到遇到父元素或者别的浮动元素。浮动会导致父元素高度坍塌。 (3)破坏性(父元素出现高度塌陷):

父容器的高度是内部容器撑开的,当子元素元素浮动后,脱离了正常文档流,导致父容器的高度塌陷,高度变为0px。

(4)清除浮动(即清除浮动引起的父元素塌陷、元素重叠等)的5种方法:

未添加浮动前:

添加浮动后(父元素高度塌陷):

1.overflow:hidden;

原理:BFC(Block Formatting Context)全称是块级格式化上下文,用于对块级元素排版,默认情况下只有根元素(body)一个块级上下文。

但是如果一个块级元素设置了float:left,overflow:hidden或position:absolute样式,就会为这个块级元素生产一个独立的块级上下文,使这个块级元素内部的排版完全独立。

作用:独立的块级上下文可以包裹浮动流,全部浮动子元素也不会引起容器高度塌陷(包含块会把浮动元素的高度也计算在内,所以就不用清除浮动来撑起包含块的高度)。

原理:使用overflow:hidden时,浏览器会自动检查浮动区域的高度。

优点:简单,代码少,浏览器支持好。

缺点:必须定义width或zoom:1(含有浮动子元素的元素),不能和position配合使用,因为超出的尺寸会被隐藏。

建议:只推荐没有使用position或对overflow:hidden理解的朋友使用。

2.结尾处加空div标签,并为其添加属性clear:both

表示在其左右两侧均不允许浮动元素

原理:添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度。

优点:简单,代码少,浏览器支持好,不容易出现怪问题。

缺点:不少初学者不理解原理;如果页面浮动布局多,就要增加很多空div,让人感觉很不爽。

建议:此方法是以前主要使用的一种清除浮动方法。

3. 直接为父级div定义height

原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。

优点:简单,代码少,容易掌握。

缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题。

建议:不推荐使用,只建议高度固定的布局时使用。

4.父级div定义overflow:auto

原理:如果宽度是由内容自适应撑开的,则overflow: auto;

问题:撑开容器至正好显示所有内容时,如果有滚动条,则滚动条会覆盖在内容上方,导致内容宽度再次被缩小,然后出现省略号。

由此推测渲染顺序:自适应宽度 → 根据高度显示滚动条 → 重新计算内部元素宽度

原理:同1,使用overflow:auto时,浏览器会自动检查浮动区域的高度。

优点:简单,代码少,浏览器支持好。

缺点:内部宽高超过父级div时,会出现滚动条。

建议:不推荐使用,如果你需要出现滚动条或者确保你的代码不会出现滚动条就使用吧。

5.父级div定义伪类:after和zoom

.container: after 表示在container的内容之后插入元素,插入的元素仍在container盒子模型之中

优点:浏览器支持好,不容易出现怪问题(目前:大型网站都有使用,如:腾迅,网易,新浪等等)。

缺点:代码多,不少初学者不理解原理,要两句代码结合使用,才能让主流浏览器都支持。

建议:推荐使用,建议定义公共类,以减少CSS代码。

注:不适用zoom也可以清除浮动

(5)实现三栏布局

方法2:定位---position

代码以及浏览器展示效果如上,浏览器拉伸也不会影响,可实现效果。但有两点需要注意:

1、页面布局的结构可正常写,如果布局中间位置与右部分对调,那么中间样式无需定位。

2、文案脱离文档流,实际应用是需要注意。

详细解释了相对和绝对定位:

(1)相对定位(relative):

仍然保留原来的位置,相对其自身的位置进行偏移。

(2)绝对定位(absolute):

删除原来的位置,相对添加了定位(position=relative、absolute、fixed)的最近的父元素进行偏移。

为第二块设置绝对定位absolute,相对父元素div02进行偏移(最近的添加了定位的父元素)

(3)实现三栏布局

方法3:弹性盒子布局--- flex (1)flex弹性布局

介绍:flex布局是W3C在2009年提出的一项新的布局方案,用来替代传统布局。目前已得到几乎所有浏览器的支持

概念:Flex弹性盒模型里, 有容器和项目之分. 设置display:flex的为容器, 容器内的元素称作它的子项目,

思想:Flex布局使得子项目能够"弹性"的改变其高宽, 自由填充容器剩余空间, 以适应容器变大, 或者压缩子项目自身, 以适应容器变小;

(2)flex属性(flex是flex-grow、flex-shrink、flex-basis的缩写)

1. flex-grow

用来“瓜分”父项的“剩余空间”。(当父元素的宽度大于所有子元素的宽度的和时(即父元素会有剩余空间),子元素如何索取分配父元素的剩余空间。值越大,索取的越厉害。)

2. flex-shrink

用来“吸收”超出的空间(父元素的宽度小于所有子元素的宽度的和时(即子元素会超出父元素),子元素如何缩小自己的宽度的。值越大,减小的越厉害。)

3. flex-basis

flex-basis 用于设置子项的占用空间(设置子项的宽度)。

如果设置了值,则子项占用的空间为设置的值;

如果没设置或者为 auto,那子项的空间为width/height 的值。

(3)实现三栏布局

方法4:表格布局 --- table

代码以及浏览器展示效果如下,浏览器拉伸也不会影响,可实现效果,而且兼容性相对很好。

方法5:网格布局 --- grid

代码以及浏览器展示效果如上,浏览器拉伸也不会影响,可实现效果,CSS3属性,若不考虑IE8,可以使用,而且网格布局有很多种形式,九宫格之类的样式都可以实现。

网格布局的行列设置示例:

Margin-left:图片宽度的一半

我们在浏览网站的时候发现,很多网站的banner图片都是全屏宽度。这种图片都是在不同分辨率下都是显示图片的中间部分,这里我们介绍两种方式,

第一种就是常见的方式,用定位

我简单定义为三部曲:

- 让包裹图片的盒子绝对定位,

- left:50%,

- Margin-left:图片宽度的一半

看例子吧:


<html lang="en">
<head>
    <title>Titletitle>
    <style>
        *{
            margin: 0 auto;
        }
        .bannerbox {
            position:relative;
            overflow:hidden;
            height:410px;
        }
        .banner {
            width:2000px; /*图片宽度*/
            position:absolute;
            left:50%;
            margin-left:-1000px; /*图片宽度的一半*/
        }
    style>
head>
<body>
<div class="bannerbox">
    <div class="banner">
        <img src="img/slide_04_2000x410.jpg">
    div>
div>
body>
html>

第二种方式,让图片做背景图,利用背景图的background-position:center center的属性实现图片居中显示

既然让图片自适应不同的屏幕,也就是说不光是pc端还有移动端。那我就根据一个例子详细介绍一下。这里我们用bootstrap框架做一个轮播效果图,来实现图片在不同屏幕下的图片的响应式效果。

对bootstrap封装好的代码进行改进。 我们重点修改了轮播图片的内容。

一步一步来介绍:

!-- Wrapper for slides 轮播的图片 轮播项 -->
<div class="carousel-inner" role="listbox">
  <div class="item active" style="background-image: url('img/slide_01_2000x410.jpg')">div>
 <div class="item" style="background-image: url('img/slide_02_2000x410.jpg')">div>
 <div class="item" style="background-image: url('img/slide_03_2000x410.jpg')">div>
 <div class="item" style="background-image: url('img/slide_04_2000x410.jpg')">div>
div>

我们给div设置好背景图之后,由于没有给div设置高度,背景图是看不到的。所以做如下调整:

#main_ad > .carousel-inner > .item{
    height: 410px;
    background-repeat:no-repeat;
    background-position: center center;
    background-size: cover;
}

简单解释一下:background-size

因为我们要考虑 :万一我们的背景图片没有410的高度,图片有可能只是居中展示一小块,所以用background-size去控制一下。

语法:background-size: length|percentage|cover|contain;

值描述

length设置背景图像的高度和宽度。

第一个值设置宽度,第二个值设置高度。

如果只设置一个值,则第二个值会被设置为 “auto”。

percentage 以父元素的百分比来设置背景图像的宽度和高度。

第一个值设置宽度,第二个值设置高度。

如果只设置一个值,则第二个值会被设置为 “auto”。

cover把背景图像扩展至足够大,以使背景图像完全覆盖背景区域。

背景图像的某些部分也许无法显示在背景定位区域中。

contain把图像图像扩展至最大尺寸,以使其宽度和高度完全适应内容区域。

这样就可以让图片自适应了,但是还是不够的,为什么呢。我们要知道:

实现图片响应式的目的是:各种终端都需要正常显示图片;移动端应该使用更小的图片,小指体积

如果我们用手机端去访问我们的页面,那么就需要把图片下载到本地,这就要需要流量 用户肯定希望流量越少越好啊。如果下载了超大的图,其实是并不需要的,那岂不是浪费很多流量。 那我们就希望针对不同的屏幕使用不同的图片, 大屏幕用大图,小屏幕呢就是用小图

针对pc端 图片自适应(因为pc端也有不同尺寸的屏幕),针对移动端就做一个单独的图片。

解决思路:

当屏幕的尺寸发生变化的时候,我们获取一下屏幕的宽度,当屏幕的宽度小于一定的值我们就认为是手机屏幕,就显示小图 ;大于一定尺寸就认为是pc端 使用大图。

但是一开始就不能显示图片吧,图片应该动态加载图片。div在某种状态显示某种图片,应该根据div的属性去展示吧 这就用使用data-属性,data属性专门记录与div相关的属性

代码修改为:


<div class="carousel-inner" role="listbox">
    <div class="item active" data-image-lg="img/slide_01_2000x410.jpg" data-image-xs="img/slide_01_640x340.jpg"></div>
    <div class="item" data-image-lg="img/slide_02_2000x410.jpg" data-image-xs="img/slide_02_640x340.jpg"></div>
    <div class="item" data-image-lg="img/slide_03_2000x410.jpg" data-image-xs="img/slide_03_640x340.jpg"></div>
    <div class="item" data-image-lg="img/slide_04_2000x410.jpg" data-image-xs="img/slide_04_640x340.jpg"></div>
</div>

需要小图的时候,尺寸等比例变化,所小图时使用img方式,在div中添加img标签。同时当使用小图的时候,父盒子的高度就不为410px了,这可以用媒体查询的方式控制盒子的高度。

当图片不足以撑满整个盒子时,图片的宽度为100%

css代码:

/*轮播项*/
#main_ad{
}
#main_ad > .carousel-inner > .item{
    background-repeat:no-repeat;
    background-position: center center;
    background-size: cover;
}
@media (min-width: 768px) {
    #main_ad > .carousel-inner > .item{
        height: 410px;
    }
}
#main_ad > .carousel-inner > .item > img{
    width:100%;
}

data-属性并不起作用,仅仅是记录数据的。当要显示图片时,用js脚本在不同屏幕下显示不同的图片尺寸。

js代码(这里用的是jquery):

/**
 * Created by Administrator on 2017/6/28.
 */
'use strict'
$(function () {
   function resize() {
       //获取屏幕宽度
       var windowWidth = $(window).width();
       //判断屏幕的大小
       var isSmallScreen = windowWidth < 768;
       //根据大小为界面上的每一张轮播图设置背景
       $('#main_ad > .carousel-inner > .item').each(function (i,item) {
          //因为获取的是dom对象,要把DOM对象转换成jquery对象
           var $item = $(item);
           //根据屏幕的大小来获取不同的图片 data()函数就是专门获取data属性的
           var imgSrc =
               isSmallScreen ? $item.data('image-xs') : $item.data('image-lg');
           //获得data属性后,给div设置背景图片
           $item.css('backgroundImage', 'url("' + imgSrc + '")');
           // 针对移动端,尺寸需要等比例变化,所以小屏幕使用img方式 ,在div中添加img标签
           if (isSmallScreen){
               $item.html('+imgSrc+'" alt="小图"/>')
           } else{
               // 当屏幕由小到大切换时,清空div中的img标签
               $item.empty();
           }
       });
   }
    $(window).on('resize', resize).trigger('resize');
});

完整html代码:


<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-COMPATIBLE" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
    <title>轮播图title>
    <link rel="stylesheet" href="lib/bootstrap/css/bootstrap.css">
    <link rel="stylesheet" href="css/main.css">
    
head>
<body>

<div id="main_ad" class="carousel slide" data-ride="carousel">
    
    <ol class="carousel-indicators">
        <li data-target="#main_ad" data-slide-to="0" class="active">li>
        <li data-target="#main_ad" data-slide-to="1">li>
        <li data-target="#main_ad" data-slide-to="2">li>
        <li data-target="#main_ad" data-slide-to="3">li>
    ol>
    
    <div class="carousel-inner" role="listbox">
        <div class="item active" data-image-lg="img/slide_01_2000x410.jpg" data-image-xs="img/slide_01_640x340.jpg">div>
        <div class="item" data-image-lg="img/slide_02_2000x410.jpg" data-image-xs="img/slide_02_640x340.jpg">div>
        <div class="item" data-image-lg="img/slide_03_2000x410.jpg" data-image-xs="img/slide_03_640x340.jpg">div>
        <div class="item" data-image-lg="img/slide_04_2000x410.jpg" data-image-xs="img/slide_04_640x340.jpg">div>
    div>
    
    <a class="left carousel-control" href="#main_ad" role="button" data-slide="prev">
        <span class="glyphicon glyphicon-chevron-left" aria-hidden="true">span>
        <span class="sr-only">Previousspan>
    a>
    <a class="right carousel-control" href="#main_ad" role="button" data-slide="next">
        <span class="glyphicon glyphicon-chevron-right" aria-hidden="true">span>
        <span class="sr-only">Nextspan>
    a>
div>
<script src="lib/jquery/jquery.min.js">script>
<script src="lib/bootstrap/js/bootstrap.min.js">script>
<script src="js/main.js">script> 
body>
html>

ok,通过以上方式就可以实现图片的居中显示并产生响应式效果。

本站内容来自用户投稿,如果侵犯了您的权利,请与我们联系删除。联系邮箱:835971066@qq.com

本文链接:http://news.xiuzhanwang.com/post/2970.html

发表评论

评论列表

还没有评论,快来说点什么吧~

友情链接: