Christian Heilmann 最近遇到了一个 有趣的 CSS 困境。 这个想法是将标题标签旋转 90 度,并沿内容博客的左侧对齐,而不是在顶部对齐。

很容易,对吧?
应该很简单吧? 只需将标题绝对定位在左上角(这样它就不会占用任何垂直空间),然后使用 CSS 转换从其左上角旋转 90 度即可。 是的……这很酷,但问题是: **支持绝对定位的浏览器远远多于支持转换的浏览器**。 这是有问题的,因为对于那些浏览器,标题现在将位于内容之上并遮挡内容。

我的做法: 特征检测
我认为处理这个问题的最佳方法是使用 Modernizr 进行特征检测。 创建一个快速自定义版本,测试转换,将其加载到页面顶部,然后仅在可以处理转换的浏览器中应用绝对定位和转换(以及其他调整)。
因此……
完整的 CSS
aside {
position: relative;
}
aside h3 {
background: #369;
color: #fff;
padding: 5px 10px;
margin: 0 0 10px 0;
}
/* Class name via Modernizr */
.csstransforms aside {
border-left: 34px solid #369;
/* Make a little room */
padding-left: 10px;
}
.csstransforms aside h3 {
/* Abs positioning makes it not take up vert space */
position: absolute;
top: 0;
left: 0;
/* Border is the new background */
background: none;
/* Rotate from top left corner (not default) */
-webkit-transform-origin: 0 0;
-moz-transform-origin: 0 0;
-ms-transform-origin: 0 0;
-o-transform-origin: 0 0;
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
-o-transform: rotate(90deg);
}
这种技巧的 **缺点** 是,如果标题比可用空间长,它不会向下推动 aside 的高度以进行补偿。 基本上,仅用 CSS 无法做到这一点(你无法将某物的高度设置为与某物的宽度匹配)。 据了解,你可以使用 JavaScript 来实现。
我们可以在没有 Modernizr 的情况下做到吗?
Christian 等人不想使用 Modernizr(原因我无法理解;)。 Lennart Schoors 在他的帖子评论中提出了 这种技巧,其中段落元素本身也进行了转换(移动)。 默认情况下,aside 顶部会有很多空白,转换将它们向上移动以填补该空白。 如果没有转换,间隙仍然存在,为绝对定位的标题腾出空间。 相当聪明!
我发现的唯一不足是它专门针对段落元素。 在实际环境中,你可能无法依赖这一点,因此你要么编写一个选择器来涵盖所有可能要移动的元素,要么使用一个非语义包装器。 此外,这与我上面描述的关于标题长度的相同缺点有关。
欢迎改进!
我不确定是否真的存在一种仅用 CSS 的方法可以在所有情况下都能正常工作。 当然,没有一种方法能让所有人都满意。 我认为我最喜欢 Lennart Schoors 的方法。
我可能会像转换不可用一样进行设计,然后让 JavaScript 旋转文本并根据需要移动相关内容。 没错,你需要 JavaScript 来看到真正漂亮的东西,但它仍然应该对所有人看起来都还不错。
旋转在 Internet Explorer 5.5 及更高版本中也可用,可以使用矩阵和旋转过滤器。 矩阵过滤器更好,因为它允许所有 0-360 度,而旋转仅允许 90 度的步进。
CSS3Please.com 为这个难用的过滤器提供了一个很棒的计算器!
很酷的技术。 我认为文本应该旋转使其更容易阅读,以目前的形式它不太容易访问,或者可能只是我个人问题。
你所说的旋转是什么意思? 如果有长词,难道它不会占用更多空间吗? 也许是我没有正确理解你的陈述。
我的意思是让每个字母都保持正确的方向,这样字母就会上下堆叠,而不是侧着放。
像
H
E
A
D
I
N
G
在我看来,以及我在学校学到的东西,堆叠(你所展示的)比大多数方向的标准行副本更难阅读。 观看者的眼睛会将字母的形成联系起来,使大脑能够在不阅读每个字符的情况下阅读单词。 我认为,堆叠的类型会破坏这种联系。
Barry,我明白你的意思,这很有道理,因为像 Internet Exploder 这样的旧浏览器不支持转换。
如果你像那样堆叠字母,你也会被限制使用等宽字体。 我曾经为客户做过类似的事情。 它看起来很丑陋……
将字母对齐到中心难道不是更有意义吗?
我注意到,我倾向于将头向左转(而不是向右)来阅读垂直文本。 在这种情况下,文本似乎“倒着”。 我更希望它从下到上阅读,就像你的页眉一样。
我不知道这是不是普遍现象,或者我是不是个例外(因为书脊通常是从上到下书写的)。
是的,你的文本应该始终从右侧(和底部)可读。
因此,文本的旋转角度应在 270°(-90°)和 360°(= 0°)之间,这是我始终采用的规则。
对于几度的旋转,这条规则并不重要。
但你需要
left: -30px;
bottom:0;
以使其重新定位。
并且你需要找到一种方法将它放在顶部而不是底部,因为标题应该在顶部。(我找不到一个好的方法来做到这一点……)
这与语言有关,例如,法语的书脊是从下到上书写的,而英语则相反。 如果你有一个多语言网站,这可能很麻烦,但如果不是,我认为大多数人已经习惯了从上到下的阅读方式。
好吧,我决定尝试改进这两个解决方案。
因此,我提供了这个 小提琴。
它解决了高度问题,背景会扩展以匹配内容的高度。 我的问题是,支持 :before 的浏览器比支持转换的浏览器更多,所以我可能会将 Modernizr 与 css 一起使用来检查对转换的支持。
我想,一些更聪明的人有更多时间可以改进它 :)
哦,我忘了说它解决了将内容限制为仅 P 标签的问题,但我不知道它是否修复得很好。 使用 * 可能会有一些性能问题等等,而且我无法弄清楚为什么 P 标签最终会获得正确的定位,而 H2 标签却没有。 哦,好吧,我想还有更多东西需要改进。
哦,更新了 Modernizr 以检查对转换的支持。 小提琴。 现在工作效果好多了。
我们在 http://www.macprime.ch 的新 Startpage 上使用了相同的概念来实现 Content-Slider。
我不确定这是否是一个错误,Stefan,但在你的内容滑块上。 当我将鼠标从左侧快速移动到右侧,并在滑块的左边缘停止时,会显示一个空白幻灯片。
我在 XP SP3 上使用 Chrome 1.4
提醒一下
是的,我也看到了,但是出现了一个推土机类型的图片,所以我假设这是故意的…?
是的,我们也注意到了,这就是我们把那张推土机图片放在那里的原因 ;-) … 嗯,问题是由于悬停效果的 css-transition,浏览器/引擎实际上太慢了,无法同时以流畅的方式最大化悬停的“选项卡”并最小化所有其他选项卡… 如果我们移除 transition,它就可以工作,但是当然它就不流畅了… :-/ … 也许这里有人有提示?
它实际上是一台反铲挖掘机 :)
我在那个页面上实现了类似的效果(但首先,在你的浏览器中禁用 JS,然后尝试将鼠标悬停在图像上)
http://www.david-goliath.com/ad_uottawa01_en.html
为了解决这种类型的错误,我所做的是将所有图像调整大小,但最后一个图像始终保持全尺寸。因此,当你将鼠标悬停在左侧的图像上时,它们只会将右侧图像推到查看器之外。
也许它对你不完全适用… 但它可以帮助你找到完美的解决方案。
超级粗略的演示.
此技术使用具有与转换相当的浏览器支持的 selector,即 :nth-of-type 伪类,其值为“n”以触发所有匹配项。当然,这是很hacky的,但它是纯粹的 CSS“功能检测”。
什么?不使用 CSS3 的
通过一些隐藏的溢出来限制空间或一些花哨的 JavaScript 来检测容器的高度并截断标题,你将为未来做好更多准备。
没有吗?
是的。兄弟,你真棒。谢谢。
正是这样的事情让我真正意识到,尽管取得了所有进步,但网络设计仍然受到其背后固有技术的限制。
这很奇怪,因为在创建初步设计时,我甚至没有意识到这些限制。我很少遇到 CSS 无法完美处理我的设计的问题。
我制作了这个 Fiddle 并快速在 IE7/8 中测试了它(只是将 aside 更改为 div 以使其在 IE7/8 中工作)http://jsfiddle.net/Gabri/t9u26/2/ 使用 Lea verou 的技巧http://leaverou.me/2011/05/rule-filtering-based-on-specific-selectors-support/ ,我认为它可以工作
Ie 支持写入模式,例如 .rotate{ writing-mode: tb-rl} 顶部 底部 右侧 左侧
如果使用 Modernizr 有问题,也许可以在服务器端进行功能检测?我们可以编译具有功能的浏览器列表,然后在服务器端检测浏览器并检查它是否支持 CSS 转换。
我在半年多以前就解决了这个问题,并且想出了跨浏览器解决方案,但我没有使用“语义”代码(甚至没有使用 HTML5)
在所有主流浏览器(IE7+、Opera、Safari/Chrome、Firefox)中都能正常工作
如果有人感兴趣,你可以在此处查看实时效果:http://potterymili.cz(网站尚未完成,永远不会完成)
嗨,
谢谢
嗨,
很酷的技术。我认为文本应该旋转,以便更容易阅读。
[email protected]
谢谢
我不明白你如何在一天内发布一篇关于捍卫和推广语义类别的文章,而在第二天又发布一篇关于推广使用 modernizr 的文章。如果 modernizr(以及大多数其他此类脚本)有一件事做得很好,那就是引入大量的非语义类名?
正如我在那篇文章中所说,我不相信语义类别,但我相信有意义的类名。modernizr 的类名不仅是非语义的,而且在脚本使用之外也毫无意义;如果你从网站中删除 modernizr,这些类将与任何东西都无关。
不要误会我的意思,modernizr 是一款很棒的脚本,我在匆忙的时候用过它,但就我个人而言,我不会把它作为标准或最佳实践来推广。
但这不是 Chris 这里要说的… 他只是在解决问题。在撰写本文时,除了仅使用 JavaScript 的解决方案(它远没有 Modernizr 那么“完美”)之外,这确实是你的唯一选择。
要想成为一名现在的网页设计师,你必须“遵守互联网的规则”,并且(更重要的是)“做客户想做的事情”。为什么要花更多时间为一次性设计工作编写自定义脚本,而有其他更具成本效益的方法来完成它?他并不是说把所有东西都扔到表格里,或者为每个标题设置一个图像替换脚本。
当前的局限性要求现代设计师宣扬标准,但在非标准环境中工作。尽可能努力追求理想主义,在其他时间你只需要让它工作!
@Douglas:我完全同意你在标准与“让它工作”之间的争论。
但 Chris 说,我引用
[…] 不想使用 Modernizr(原因是我无法理解;)
这就是我回复的原因。我能理解他为什么不想使用它。Chris 也应该理解,因为他在此写道:https://css-tricks.cn/13423-semantic-class-names/
在这种情况下,我会建议客户(如果需要任何建议)使用图像来旋转文本,就像我们过去一样。
CSS3 在此功能方面还不够成熟,无法使用。仅仅为了“走在前沿”而引入 modernizr 只是为了使用而使用,同时你也会让自己陷入非标准/非最佳实践。
在 Opera mini 上无法使用
你能截个图或更详细地描述一下“无法使用”吗?
一个小建议(与 Paul Irish 的建议一致)是为所有浏览器编写现代样式,只使用 no-* 类来提供回退。否则,现代浏览器仍然依赖 modernizr 来应用样式。
不错的技巧!旋转文本,以便你能够更好地阅读它,将完美地完成它。
在 IE6/IE7 中,标题的文本被遮挡并混淆了内容。
这是在小题大做。我已经这样做了 6 年,没有使用 JavaScript。
我只是用 Irfan View 旋转我的标题,将其保存为 headerL.jpg,然后将其浮动。
这比写这段评论花费的时间还要少。
只需将整个网站制作成 JPG,为什么还要编写代码呢?
这有点尖酸刻薄,但我试图说明一个观点。如果需要重新设计,你/新人想对这些标题的任何视觉方面进行更改,他们需要创建新的 JPG,这非常不实用。
Chris,很久没有访问过这个网站了,因为一些疯狂的 3G 代理配置问题.. 我只想说一件事,新网站看起来很棒!感谢你将这种美带到现实中 :)
嗯,如果你要将标题文本硬编码为旋转…
…如何添加 CSS
min-height
来设置容器的最小高度?例如,在 Christian 的 fiddle 中,我尝试将第二个 aside(第一个被转换)的标题更改为Heading and stuff and stuff and STUFF
,并将style="min-height: 16em;"
添加到包含的aside
中。这给出了一个功能性且视觉上可接受的结果。哦,对了,史前浏览器不支持
min-height
。真是糟糕。总是可以参考 David Walsh 的 解决方法 来解决 Internet Exploder 6(以及更早版本,$DEITY
保佑;或者也许你工作在代码太平间)。我更喜欢使用 modernizr 来检测缺乏支持而不是支持
“我所能看到的一个缺点是,它专门针对段落元素。在实际环境中,你可能无法依赖这一点,因此你必须编写一个 selector 来覆盖所有可能需要移动的元素,或者使用非语义包装器。”
非语义包装在我看来不是个坏主意。效果很好 http://jsfiddle.net/sTcTF/5/
只需使用 :not(.foo) 伪选择器,IE 就会忽略您放入其中的任何标签,因此将绝对定位和转换分组到该定义中。
在 Firefox 中旋转后,标题文本变得非常像素化,而且将其垂直化会使其更难阅读,但我可以看到在少数情况下它会很酷。
看起来很棒,在我的作品集网站上很有效 :)
谢谢
关于跨浏览器 CSS 转换(是的,即使在 IE 中),UserAgentMan 的博客上有一篇文章。
这是一篇关于跨浏览器 CSS 转换的完整文章,展示了如何进行转换所需的微积分计算。
以下是链接
http://www.useragentman.com/blog/2010/03/09/cross-browser-css-transforms-even-in-ie/
另外,如果我没记错的话,有一个特定的过滤器属性可以旋转对象。
我喜欢这个 CSS 技巧
但它在愚蠢的浏览器探索中不起作用 ^^
非常感谢 Chris ^^
嘿,我在 http://clarite.co.uk 上做了这个(它只是一个健康美容水疗网站,没什么特别的),使用 IE8 特定的 CSS(ta,Modernizr),一切都很顺利,直到我升级到 IE9,现在 IE9 开始变得很奇怪(今天会修复),但 IE8 模式看起来很好,然而在我的客户的 IE8 上,它看起来像我的 IE9 上的……总之,我只是使用了 .ie 类并将它们放到列表中……相对定位了所有东西。
在 Chrome 等浏览器中运行良好,但今天我要调试 IE :o(
对于 IE,我使用了
整个背景颜色处理解决了 IE8 中的糟糕字体渲染问题,一旦你转换它,我不记得缩放比例是什么,但也有一个原因。
总之,调试要做了!
这真的很酷。我很快就会尝试一下。谢谢
使用 Modernizr 确实更容易!
我认为垂直标题并不理想。我认为这会使可读性更难,我不得不说标题是文章最重要的部分。
是的,这确实很花哨,但不适用于可用性。
来自读者 Ethan Herbertson 的一个有趣花絮,他写信讲述了俄罗斯书籍脊柱上的文字是如何“旋转”的。
另一个替代方法是为内容的顶部和左侧设置填充。