如何在多个类中连接 html 转换? [复制]

Posted

技术标签:

【中文标题】如何在多个类中连接 html 转换? [复制]【英文标题】:How do I connect html transforms in multiple classes? [duplicate] 【发布时间】:2020-08-16 18:32:37 【问题描述】:

我正在尝试在单个元素中使用多个转换,以便最终产品是所有一起应用的转换的组合。

但是,当有多个时,唯一的一个变换属性将被忽略。

说,如果我想要一个由rotate(20deg)skewY(20deg) 转换的 div,这是行不通的:

.foo 
  transform: rotate(20deg);


.bar 
  transform: skewY(20deg);

<div class="foo bar"></div>

只会应用一个。尽管复合转换可能有效,但它是不切实际的,因为转换可能有许多组合。而不是这样做:

.one-one transform: rotate(10deg) skewY(1deg);
.one-two transform: rotate(10deg) skewY(2deg);
.one-three transform: rotate(10deg) skewY(3deg);
.one-four transform: rotate(10deg) skewY(4deg);
.two-one etc.

我想这样做,以便我可以在button 点击时应用转换,而不是用尽所有可能的转换组合:

.one transform: rotate(10deg);
.two transform: rotate(20deg);
.three transform: rotate(30deg);
.four transform: rotate(40deg);

.uno transform: skewY(10deg);
.dos transform: skewY(20deg);
.tres transform: skewY(30deg);

我认为目前可行的解决方案:

有一种方法可以添加到&lt;div&gt; 的变换属性中 以某种方式modify classes 使用 jQuery 更改 CSS,但似乎这也会用 css() 覆盖属性,而不是添加到 transform 样式

我更喜欢 css/js 解决方案,但也欢迎 jQuery 答案,我只是不熟悉它。

【问题讨论】:

来自副本:***.com/a/61433630/8620333 【参考方案1】:

您可以查看 CSS var(--X) (请参阅 sn-p 的演示下方的链接),然后将您打算的所有转换默认设置为 0 并通过 className 更新它们:(请注意使用前支持:https://caniuse.com/#feat=mdn-css_properties_custom-property_var 和最终的 polyfill https://github.com/nuxodin/ie11CustomProperties)

没有 javascript https://codepen.io/gc-nomade/pen/RwWLOWr 的可能示例:

.foo 
  --rotate: 20deg;


.bar 
  --skewY: 20deg;


div[class] 
  transform: rotate( var(--rotate, 0)) skewY( var(--skewY, 0));/* fallback value is here 0 */



/* demo purpose */

div[class] 
  float: left;
  border: solid;


html 
  display: flex;
  height: 100%;


body 
  margin: auto;
<div class="foo bar">foo bar</div>
<div class="foo ">foo</div>
<div class="bar">bar</div>
<div class="nop">no transform</div>

https://developer.mozilla.org/en-US/docs/Web/CSS/--*

-- 为前缀的属性名称,如--example-name,表示包含可在其他声明中使用var() 函数的值的自定义属性。

自定义属性的范围仅限于声明它们的元素,并参与级联:此类自定义属性的值是由级联算法决定的声明的值。

后备:https://drafts.csswg.org/css-variables/#example-abd63bac

注意:回退的语法与自定义属性的语法一样,允许使用逗号。例如,var(--foo, red, blue) 定义了红色、蓝色的后备;也就是说,第一个逗号和函数末尾之间的任何内容都被视为后备值。

如果支持来个问题,你可以看看:IE11 - does a polyfill / script exist for CSS variables?

【讨论】:

这是我正在研究的东西。但是 man 浏览器支持很差。但是,如果不考虑浏览器支持,这绝对是最短的解决方案。 @MosiaThabo 歌剧和老版本的 IE 确实在这里很麻烦 ;) JavascRipt 也需要注意这些 ;) 大声笑...正是@G-Cyrillus 我刚刚在上面使用了javascript。只是为了说明他如何解决这个问题。由他来决定如何设置/获取倾斜和旋转的值 @MosiaThabo 我更多的是考虑使用 polyfill 以使其易于在样式表中使用;)例如 github.com/nuxodin/ie11CustomProperties @MosiaThabo 这里是您的解决方案:***.com/questions/46429937/… ;)【参考方案2】:

有很多方法可以解决这个问题。下面这个怎么样? 我创建了两个 ` 来读取倾斜和旋转的值,然后它们会应用效果。

请记住,值的来源并不重要。它们可以在您的按钮中硬编码为data-* 属性(如果您想修复它们)。这只是为了向您展示如何使用 javascript 来处理它(我添加了一些建议以使其更易于理解):

var object = document.querySelector(".shape");

// this function takes care of Rotational effect
function rotate(event)

  var rotation_val = document.getElementById("rotationVal").value;
  
  // this get's the css transform expression for rotation which is 
  // stored as data-attribute on every button, because it tells you what button is resposible for what transformation. But you can store this anywhere you want.
  var css_transform = event.currentTarget.getAttribute("data-rotation");
  
  // this here just replaces say rotate(_r_) to rotate(15deg) if val was 15
  var effect = css_transform.replace("_r_",rotation_val + "deg");
  
  // Take not of this. ere I am not overriding the transform property. Instead
  // I am adding a transformation to it. more like compounding but dynamically.
  object.style.transform += effect;


// this function takes care of Skewing effect
function skewY(event)

  var skew_val = document.getElementById("skewVal").value;
  var css_transform = event.currentTarget.getAttribute("data-skew");
  var effect = css_transform.replace("_s_",skew_val + "deg");
  object.style.transform += effect;


function apply_all()
  var buttons = document.querySelectorAll(".effect_button");
  
  buttons.forEach( function(button)
    button.click();
  );
.container
  padding: 60px;
  border: thin solid #dbdbdb;


.shape
  width: 60px;
  height: 60px;
  background-color: green;
<div class="container">
  <div class="shape">
  </div>
</div>

<input id="rotationVal" />
<button class="effect_button" data-rotation="rotate(_r_)" onClick="rotate(event)">rotate</button>
<br />
<input id="skewVal" />
<button class="effect_button" data-skew="skewY(_s_)" onClick="skewY(event)">Skew</button>
<br />

Or Rotate and Skew at the same time:
<button onClick="apply_all(event)">Transform</button>

【讨论】:

以上是关于如何在多个类中连接 html 转换? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我可以在一个 xhtml 页面中使用多个 xhtml 页面以及如何访问(引用它们)托管 bean 类中的那些页面吗? [复制]

如何使用 Python 转换列表中的多个列表? [复制]

如何在 mysqli 准备语句中使用多个内部连接和多个 WHERE 子句? [复制]

如何连接多个字符串? [复制]

html如何转换成WORD

如何使用 RegEx 转换数据库连接字符串格式? [复制]