2022-05-24 牛客网前端CSS布局题目汇总

一.纯CSS做圣诞树
1.代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <style type="text/css">
            .topbranch {
                width: 0px;
                height: 0px;
                /*
                * TODO: 上枝叶效果
                */
                float: left;
                margin-left:100px;
                border:100px solid rgba(0,0,0,0);
                border-bottom:100px solid green ;
            }
            .middleBranch {
                width: 0px;
                height: 0px;
                /*
                * TODO: 中枝叶效果
                */
                border:200px solid rgba(0,0,0,0);
                border-bottom:200px solid green ; 
            }
            .base {
                /*
                * TODO: 树干效果
                */
                margin-left:165px;
                width: 70px;
                height: 200px;
                background: grey;
            }
        </style>
    </head>
    <body>
    	<section class="topbranch"></section>
        <section class="middleBranch"></section>
        <section class="base"></section>
    </body>
</html>
2.效果

二.解决垂直方向上下盒子的外边距折叠
1.代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            .top,.bottom{
                width:100px;
                height:100px;
                margin:10px;
                background:green;
            }
            .bottom{
               
               position:absolute;
            }
        </style>
    </head>
    <body>
        <section class="top"></section>
        <section class="bottom"></section>
    </body>
</html>
2.说明

想要清除两个盒子之间的外边距折叠,可以给目标盒子设置以下属性:

  1. display: inline-block
  2. float属性值不是"none"的元素
  3. 绝对定位
三.使用绝对定位实现古诗词评注框
1.代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            article {
                margin-left: 10rem;
            }
            aside {
                width: 5rem;
                padding: 1rem;
                color: white;
                background-color: pink;
                border-radius: 0.5rem;
               position: absolute;
               margin-left:-9rem;
            }
            aside:after {
                content: '';
                position: absolute;
                display: block;
                width: 0;
                height: 0;
                border: 0.5rem solid pink;
                border-bottom-color: transparent;
                border-right-color: transparent;
                right: -1rem;
                top: 0.5rem;
            }
            .note {
                color: green;
                text-decoration-line: underline;
            }
        </style>
    </head>
    <body>
    	<section>
            <article>
                <p>煮豆燃豆萁,</p>
                <p>豆在釜中泣。</p>
                <p>本是同根生,</p>
                <aside>豆秸怎能这样急迫地煎熬豆子呢?</aside>
                <p class='note'>相煎何太急?</p>
            </article>
        </section>
    </body>
</html>
2.效果

在这里插入图片描述

3.说明

绝对定位非常适合创建弹出层、提示和对话框等覆盖于其他内容之上的组件。
 比如有一篇文章,可以给文章添加一些行内的评注,最好以气泡图的样式显示在文章外部的空白区域中。
 绝对定位的元素默认会待在自己还在流中时的地方,

 现在给"aside"盒子设置绝对定位属性"position: absolute",
 此时"aside"盒子从流中出来并且覆盖住了下方的元素,
 现在可以将它向左移动一些,把它定位到文章内容的左边。"article"盒子的左外边距为10rem,
 想让"aside"评注放在左边空白处的中间,需要进行计算,
 这里省略计算步骤。现在只需要将评注组件向左移动9rem即可
四.使用固定定位使盒子不随进度条下拉
1,代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            nav{
                position:fixed;
                top:0;
                width:50px;
                background:pink;
            }
            section{
                margin:1rem;
            }
        </style>
    </head>
    <body>
    	<nav><br /></nav>
        <section>1<br />2<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></section>
    </body>
</html>
2.效果

在这里插入图片描述

3.说明

固定定位是由绝对定位衍生出来的,不同之处在于,固定定位元素的父级始终是视口。
 因此固定定位可以用来创建始终停留在窗口相同位置的元素。
 比如:固定侧栏、固定顶栏等。这样方便用户,不必再费事寻找栏目。

五.固定定位实现广告弹出小窗口
1.代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            .advert {
                width: 300px;
                height: 200px;
                background-color: black;
                position:fixed;
                right:0;
                bottom:0;
            }
            .x{
                position:absolute;
                right:0;
            }
            .advert:first-line {
                color: white;
            }
        </style>
    </head>
    <body>
    	<section class="advert">
            广告文案
            <button class="x">x</button>
        </section>

        <script>
            document.querySelector('button').onclick = function() {
                this.parentNode.style.display = 'none'
            }
        </script>
    </body>
</html>
2.效果

3.说明

固定定位可以用于控制中心、广告、重要提示内容等。
本示例使用固定定位实现一个广告牌功能,关闭按钮和该按钮的功能已给出,
当点击按钮时,广告牌会消失。

六.使用flex属性控制对盒子分配宽度
1.代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            nav {
                width: 500px;
            }
            nav ul {
                display: flex;
                list-style: none;
            }
            ul>li{
                flex:1 0 0%;
            }
            li:first-child{
                flex-grow:2
            }
        </style>
    </head>
    <body>
    	 <nav>
            <ul>
                <li>home</li>
                <li>spaceships</li>
                <li>planets</li>
                <li>stars</li>
            </ul>
        </nav>
    </body>
</html>
2.效果

3.说明

Flexbox支持对弹性项的灵活控制。Flex的意思为可伸缩,这体现在以下三个属性中:

  1. flex-basis:基础值
  2. flex-grow:拉伸弹性系数,如果容器宽度减去弹性项的基础值之和之后还有剩余空间,那么就按照弹性系数比例去分配剩余空间
  3. flex-shrink:缩减弹性系数,和拉伸弹性系数逻辑相反
     这三个属性应用给弹性项,而不是容器。
首先给所有的"li"添加"flex: 1 0 0%"属性,
该属性的三个值分别为flex-grow、flex-shrink和flex-basis,
表示:当有剩余空间时均匀分配剩余空间、当超出容器宽度时不进行缩放、弹性项的基础值都为容器的0%。
此时可以看到四个每个"li"标签的宽度都为125px,分别占据了容器的1/4。
现在再单独给第一个"li"标签设置"flex-grow: 2"属性,
此时又会发现所有"li"标签的宽度比值为2:1:1:1
七.使用flex-wrap: wrap进行换行
1.代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
                font-size: 12px;
                box-sizing: border-box;
            }
            nav ul {
                display: flex;
                flex-wrap:wrap;
                padding: 0.5rem;
                list-style: none;
            }
            nav ul li {
                margin: 0.2rem;
                flex:1 0 auto;
                max-width:10rem;
            }
            nav ul li a {
                position: relative;
                display: block;
                padding: 0.2rem 0.6rem;
                color: white;
                line-height: 1rem;
                background-color: black;
                border-radius: 0.2rem;
                text-decoration: none;
                text-align: center;
            }
            nav ul li a:before {
                position: absolute;
                content: '';
                width: 0;
                height: 0;
                border: 0.7rem solid transparent;
                border-right-width: 0.7rem;
                border-right-color: black;
                left: -1.2rem;
                top: 0;
            }
        </style>
    </head>
    <body>
    	<nav>
            <ul>
                <li><a href="">Fillithar</a></li>
                <li><a href="">Berzite</a></li>
                <li><a href="">Galidraan</a></li>
                <li><a href="">Gravlex Med</a></li>
                <li><a href="">Cato Neimoidia</a></li>
                <li><a href="">Coruscant</a></li>
                <li><a href="">Dantooine</a></li>
                <li><a href="">Dhandu</a></li>
                <li><a href="">Iktotchon</a></li>
                <li><a href="">Hosnian Prime</a></li>
                <li><a href="">Harkrova I</a></li>
                <li><a href="">Livno III</a></li>
                <li><a href="">Karfeddion</a></li>
                <li><a href="">Eriadu</a></li>
                <li><a href="">Jestefad</a></li>
                <li><a href="">Iridonia</a></li>
                <li><a href="">Malachor</a></li>
                <li><a href="">Gan Moradir</a></li>
                <li><a href="">Kethmandi</a></li>
                <li><a href="">Mirrin Prime</a></li>
                <li><a href="">Ezaraa</a></li>
                <li><a href="">Muunilinst</a></li>
                <li><a href="">Itapi Prime</a></li>
                <li><a href="">Nam Chorios</a></li>
            </ul>
        </nav>
    </body>
</html>
2.效果

在这里插入图片描述

3.说明

当前的"li"标签都是行内盒子,虽然看似实现了标签效果,但是每一行的宽度却没有保持一致,
当进行缩放时,布局会特别的混乱。现在使用Flex布局将当前的布局方式进行优化,
首先删除"li"标签的"display: inline-block"属性,给"ul"添加"display: flex"使该元素称为弹性容器。
再给容器添加"flex-wrap: wrap"属性表示换行,否则所有标签会在第一行排列。
此时标签已经分行排列了,但,每一行的宽度看起来依然是不同的,
这时候需要通过给弹性项添加属性,通过之前讲过的"flex"属性入手。
继续给所有的"li"标签添加"flex: 1 0 auto"属性,
auto代表在计算剩余空间时需要减去每个标签自身的宽度
而不是之前讲的0%那样忽略了自身的宽度。此时标签功能基本上是完成了,
但是注意,最后一行可能因为页面的缩放导致只有一个标签却占满了一整行。
那么继续给所有的"li"标签设置"max-width: 10rem"即可,
此时最后一行标签虽然少但是看起来依旧很和谐。

八.使用网格布局布置多个盒子的行列排布
1.代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }
            section {
                width: 500px;
                text-align: center;
                display:grid;
                grid-template-rows:100px;
                grid-template-columns:repeat(2,1fr);
                grid-gap:10px;
            }
            article {
                height: 100px;
                border: 1px solid black;
            }
        </style>
    </head>
    <body>
    	<section>
            <article>1</article>
            <article>2</article>
            <article>3</article>
            <article>4</article>
            <article>5</article>
            <article>6</article>
            <article>7</article>
            <article>8</article>
            <article>9</article>
        </section>
    </body>
</html>
2.效果

3.说明

Grid,即网格布局。它将页面划分为一个个网格,可以任意组合不同的形态,做出理想的布局效果。
 Grid布局与Flexbox布局的区别在于,Flexbox是根据轴线对弹性项进行排列,
 而Grid布局是将容器划分为行和列,产生单元格,然后再对单元格进行操作。
 采用网格布局的区域称为容器。容器内部采用网格定位的每个子元素称为容器项,也是单元格。
 划分网格的线称为网格线,比如,3x3的网格有4条水平网格线和4条垂直网格线。

 现在给section盒子设置"display: grid"属性,将该盒子变成一个容器。
 现在需要通过给该容器划分行和列来生成单元格,
 给容器设置"grid-template-rows: 100px""grid-template-columns: repeat(2, 1fr)"两条属性
 以生成一个Nx2的网格,且每个容器项的宽度比为1:1、第一行的高度为100px
 (注意:实际上行高度可以不用设置,会根据每个容器项自动撑开,
 但如果设置了,就要考虑清除需要多少行,当前的行值100px仅为第一行,
 如果需要前三行都为100px,需要设置为"grid-template-rows: 100px 100px 100px")。
 repeat方法可以简化属性值的书写,为了方便表示比例关系,
 网格布局提供了fr关键字,该关键字和flex-grow颇为相似。
 实际上如果想固定大小,完全可以将单位全部设置为固定的px值。
 现在继续给容器添加"grid-gap: 10px"属性,
 该属性为"grid-row-gap""grid-column-gap"两个属性的简写,分别代表行间距和列间距。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值