使用 CSS 怎么实现宽高自适应的正方形?

宽高自适应的正方形

  • 方式一:使用rem
  • 方式二:使用vw
  • 方式三:使用 百分比+padding
  • 方式四:css属性aspect-ratio

方式一:使用rem

DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        body {
            font-size: 16px;
        }

        .rem {
            width: 10rem;
            height: 10rem;
            background: pink;
            margin: 0 auto;
        }

        @media only screen and (max-width: 1200px) {
            body {
                font-size: 12px;
            }
        }
    style>
head>

<body>
    <div class="rem">remdiv>
body>

html>

屏幕宽度大于1200px时,字体为16px,rem的盒子的大小为 160px * 160px;

屏幕宽度小于1200px时,字体为12px,rem的盒子的大小为 120px * 120px;

实际应用场景屏幕宽度变化会动态计算rem的值,这里只用于案例理解。

  • 优点
    在适配了rem的项目中,可以直接使用rem设置盒子宽高,即自适应正方形

  • 缺点
    在未设置rem的项目中,单独为了实现自适应正方形有点大材小用

方式二:使用vw

DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        .vw {
            width: 10vw;
            height: 10vw;
            background: yellow;
            margin: 0 auto;
        }
    style>
head>

<body>
    <div class="vw">vwdiv>
body>

html>
  • 优点
    vw为内置视口单位,可直接使用。

  • 缺点
    在实际的业务场景中,将设计稿的尺寸转化为vw相对麻烦

方式三:使用 百分比+padding

  • 当padding、margin取值为百分比时,百分比的值是以父元素的width为参考。
  • 我们给盒子的宽度设置20%,使用的padding的纵轴将盒子高度撑开,这样便得到了一个自适应正方形。
DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        .padding {
            width: 20%;
            padding-top: 20%;
            /* padding-top或padding-bottom都可以 */
            background: #696969;
            margin: 0 auto;
        }
    style>
head>

<body>
    <div class="padding">paddingdiv>
body>

html>
  • 现在是个自适应正方形没错了,但是高度被占满了,内容没地方放了。 是的,当前只是一个正方形;在实际业务场景中,内部不是图片就是其他内容,不止需要一个正方形的。
  • 解决办法:再嵌套一层内容盒子,外层方形盒为相对定位,内层内容盒为绝对定位;内层盒宽高基于外层方形盒,代码如下
DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        .box-wrap {
            position: relative;
            width: 20%;
            padding-top: 20%;
            margin: 0 auto;
        }

        .box-wrap>img {
            position: absolute;
            width: 100%;
            height: 100%;
            top: 0;
            left: 0;
            z-index: 1;
            object-fit: cover;
        }
    style>
head>

<body>
    <div class="box-wrap">
        <img src="./img.png" alt="">
    div>
body>

html>
  • 优点
    无需其他配置,设置灵活,扩展性强。

  • 缺点
    需要额外嵌套一层内容盒(个人拙见)

方式四:css属性aspect-ratio

aspect-ratio,简言之就是宽高比

DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
    <style>
        .box-square {
            aspect-ratio: 1 / 1;
            /* aspect-ratio: 1; 可简写 */
            width: 20%;
            background: chocolate;
            margin: 0 auto;
        }
    style>
head>

<body>
    <div class="box-square">我是内容div>
body>

html>

你可能感兴趣的:(css,前端,javascript)