热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

构建一个杂志布局(译文)

与以往的Web布局不同的杂志布局,原文地址 HighlightsFromBuildingaMagazineLayout 25Nov2019一个

构建一个杂志布局(译文)

与以往的Web布局不同的杂志布局,原文地址 Highlights From Building a Magazine Layout 25 Nov 2019

一个杂志的照片

时至今日,我们掌握的web技术已经是今非昔比。日新月异。由我们来决定:要么接受挑战,要么不学习新事物。我想选择一种可以使用新CSS技术的设计,并尝试进一步掌握它们。今天,我选择一个杂志布局,其中包含一些非常有趣,具有挑战性的设计细节。

内容

为了正确地用HTML标记,首先我浏览了所有内容。对我来说,它读起来就像一篇带有标题和描述段落的文章。我想象成像下面的设计模型。

当然,我们不会构建它,但是我想向你们展示在不用杂志版面的情况下设计的外观。

在HTML中,我添加了以下内容:

<div class="magazine">
  <div class="item item-72">div>
  <div class="item item-50">
    <span>...Has lived quietly in harvard square for nearlyspan>
    <span class="num">50span>
    <span>yearsspan>
  div>
  
div>

注意,我将内容放置在内,以便以后可以通过CSS轻松控制它。初始HTML的外观如下:

Grid

网格布局具有三列,每列具有唯一的大小。我认为这就是为什么布局首先看起来很有创意的原因。

.magazine {
  display: grid;
  grid-template-columns: 1.35fr 1fr 110px;
}

定义网格后,需要使用grid-columngrid-row将每个元素放置在其位置。借助Firefox DevTools的网格,这很容易。确保激活“Display line numbers”。

例如,编号为“50”的项目的位置如下:

.item-50 {
    grid-row: 1/3;
    grid-column: 2/3;
}

与其余项目类似。完成后,它应该像这样:

百分比边距

我很少使用百分比作为边距的值,但是对于这种布局,我发现它适合某些情况。我重点突出了可以用到的项目。

我在每个项目中添加了以下内容:

.item-72 { margin-left: 25%; }

.item-50 { margin-top: 6%; }

.item-decades { margin-left: 10%; }

…等等。这些值是通过反复试验选择的,所以不是使用的特定数字。完成后,它应如下所示:

弹性盒

如果你尚未发现,布局中的某些项目可以使用flexbox完成。我将向您展示如何构建其中两个项目。不用说,项目的突出显示是由Firefox DevTools完成的。

case 1

<div class="item item-friends">
    <span>She wrote a new drama aboutspan> 
    <span class="num">4span> 
    <span>cambridge friendsspan>
div>
.item-friends {
    display: flex;
}

.item-friends span:last-child {
    align-self: flex-end;
}

case 2

在这种情况下,弹性项目的方向是垂直的(列)。

 

<div class="item item-50">
    <span>...Has lived quietly in harvard square for nearlyspan> 
    <span class="num">50span> 
    <span>years.span>
div>
.item-50 {
    display: flex;
    flex-direction: column;
}

.item-50 span:last-child {
    align-self: flex-end;
}

强制换行

根据设计,有两个项目,每个项目都有一个句子,每个单词都要换行。我需要一种在每个词后强制换行的方法。

最初,我考虑过使用min-content作为元素宽度的值。根据元素内容来计算最小宽度来运行。

.elem {
    width: min-content;
}

虽然这可能在所有情况下都行不通。我稍微改变了文字可以了:

另一个更保险的解决方案是使用word-spacing大像素值或视窗值的字间距。

.elem {
    word-spacing: 9999px;
    /* Or */
    word-spacing: 100vw;
}

使字体大小适应容器宽度

无论屏幕大小如何,具有深珊瑚色背景的句子都必须保持一行。我尝试使用视窗单位,但没用。经过研究,我了解了fittext.js而不是其父容器中的合适文本。

但是,我考虑过使用ResizeObserver,对于我的用例来说,就好像有一种魔力!我试着算出一个关键值将除以父容器的宽度。

let itemBar = document.querySelector(".item-bar");

const ro = new ResizeObserver(entries => {
  for (let entry of entries) {
    let w = entry.contentRect.width; /* Width of parent */
    let fz = w/29; /* Font size */
    itemBar.style.fontSize = fz + "px";
  }
});

ro.observe(itemBar);

难道不比使用脚本好吗?ResizeObserver更好。这是显示的GIF:

视窗单位

因为值大小的改变是流畅,所以我使用了视窗单位。使用它时,请不要忘记设置字体的最大值,以免在大屏幕上显得太大。

我使用了一个工具将像素值转换为视窗单位。它是基于视窗宽度和字体大小(以像素为单位)工作的。

我还使用它将文本与其对应的数字对齐。我使用CSS Calc()组合了vwvh值,如下所示。

.elem {
    position: relative;
    bottom: calc(-2vw - 9vh);
}

可变字体

这是网络上最令人兴奋和最有用的功能之一。在布局中,我考虑过使用可变字体来改变调整字的粗细。

最初,我为字体的宽度和粗细定义了两个CSS变量。然后,我用它来定义font-variation-settings的值。如果您好奇的话,这是有关可变字体的精彩介绍。

:root {
  --width: 100;
  --weight: 500;
}

.num {
    font-variation-settings: "wdth" var(--width), "wght" var(--weight);
}

为了控制调整大小的变量,我为此使用了ResizeObserver。字体粗细将根据其父元素进行更改。

const ro_2 = new ResizeObserver(entries => {
  for (let entry of entries) {
    let w = entry.contentRect.width;
    let wdth = parseInt(getComputedStyle(document.documentElement).getPropertyValue("--width"));
    let f = wdth + w;
    document.documentElement.style.setProperty("--weight", w*1.5);
  }
});

在网格中自身对齐

署名(右边的突出显示)应在横条和杂志设计末端之间的中间。

起初,我认为简单的上边距就能解决问题,因此我加了以下内容。

.item-byline {
    margin-top: -100%;
}

在这种情况下,边距等于项目的宽度。没用!而不是将项目推到顶部,就像加了padding

由于该行是网格项,因此我应该将对齐方式从默认更改为start

.item-byline {
    margin-top: -100%;
    align-self: start;
}

最终效果

 


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 本文介绍了Foundation框架中一些常用的结构体和类,包括表示范围作用的NSRange结构体的创建方式,处理几何图形的数据类型NSPoint和NSSize,以及由点和大小复合而成的矩形数据类型NSRect。同时还介绍了创建这些数据类型的方法,以及字符串类NSString的使用方法。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
author-avatar
只属于我一个人的秘密
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有