- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码生成可无限平移的网格,还允许放大和缩小。网格是使用 css 绘制的。
我的问题是 css 网格在非常接近地放大或缩小很多时不能很好地工作。它也是不一致的,有时只会显示垂直或水平线。我不确定如何可靠地重现它,它有时会发生。
完美的解决方案将类似于 blender 中的网格,其中新线进来替换不再可见的较小线。
创建和设置 css 的部分:
private void reSetStyle(Pane pane) {
Scene scene = pane.getScene();
double startPointX = pane.getTranslateX()+(scene.getWidth()/2)+(0.5*scale);
double endPointX = pane.getTranslateX()+(scene.getWidth()/2)+(10.5*scale);
double zeroX = pane.getTranslateX()+(scene.getWidth()/2)*scale;
startPointX = Math.round(startPointX * 1000d)/1000d;
endPointX = Math.round(endPointX * 1000d)/1000d;
zeroX = Math.round(zeroX * 1000d)/1000d;
double startPointY = pane.getTranslateY()+(scene.getHeight()/2)+(0.5*scale);
double endPointY = pane.getTranslateY()+(scene.getHeight()/2)+(10.5*scale);
double zeroY = pane.getTranslateY()+(scene.getHeight()/2)*scale;
startPointY = Math.round(startPointY * 1000d)/1000d;
endPointY = Math.round(endPointY * 1000d)/1000d;
zeroY = Math.round(zeroY * 1000d)/1000d;
pane.getParent().setStyle("-fx-background-color: #393939," +
"linear-gradient(from "+startPointX+"px "+zeroX+"px to "+endPointX+"px "+zeroX+"px, repeat, #2f2f2f 5%, transparent 6%)," +
"linear-gradient(from "+zeroY+"px "+startPointY+"px to "+zeroY+"px "+endPointY+"px, repeat, #2f2f2f 5%, transparent 6%);");
}
完整代码:
public class Main extends Application {
private double scale = 1d, minimumScale = 0.2, maximumScale = 2.5;
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
StackPane stackPane = new StackPane();
pane.translateXProperty().addListener((observableValue, number, t1) -> reSetStyle(pane));
pane.translateYProperty().addListener((observableValue, number, t1) -> reSetStyle(pane));
new Pannable(pane, stackPane);
stackPane.getChildren().add(pane);
stackPane.addEventFilter(ScrollEvent.ANY, scrollEvent -> {
scrollEvent.consume();
zoom(scrollEvent, pane);
});
primaryStage.setTitle("broken css");
primaryStage.setScene(new Scene(new BorderPane(stackPane), 640, 480));
primaryStage.show();
reSetStyle(pane);
}
private void zoom(ScrollEvent scrollEvent, Pane pane) {
if (scrollEvent.getDeltaY() == 0) return;
double SCALE_DELTA = 0.1;
double scaleFactor = (scrollEvent.getDeltaY() > 0) ? SCALE_DELTA : -1 * SCALE_DELTA;
double nonZoomedXOffset = pane.getTranslateX() / scale;
double nonZoomedYOffset = pane.getTranslateY() / scale;
//Rounding is needed because java will cause floating point errors otherwise
scale = clamp(minimumScale, Math.round((pane.getScaleX() + scaleFactor) * 1000d)/1000d, maximumScale);
pane.setScaleX(scale);
pane.setScaleY(scale);
pane.setTranslateX(nonZoomedXOffset * scale);
pane.setTranslateY(nonZoomedYOffset * scale);
reSetStyle(pane);
}
private void reSetStyle(Pane pane) {
Scene scene = pane.getScene();
double startPointX = pane.getTranslateX()+(scene.getWidth()/2)+(0.5*scale);
double endPointX = pane.getTranslateX()+(scene.getWidth()/2)+(10.5*scale);
double zeroX = pane.getTranslateX()+(scene.getWidth()/2)*scale;
startPointX = Math.round(startPointX * 1000d)/1000d;
endPointX = Math.round(endPointX * 1000d)/1000d;
zeroX = Math.round(zeroX * 1000d)/1000d;
double startPointY = pane.getTranslateY()+(scene.getHeight()/2)+(0.5*scale);
double endPointY = pane.getTranslateY()+(scene.getHeight()/2)+(10.5*scale);
double zeroY = pane.getTranslateY()+(scene.getHeight()/2)*scale;
startPointY = Math.round(startPointY * 1000d)/1000d;
endPointY = Math.round(endPointY * 1000d)/1000d;
zeroY = Math.round(zeroY * 1000d)/1000d;
pane.getParent().setStyle("-fx-background-color: #393939," +
"linear-gradient(from "+startPointX+"px "+zeroX+"px to "+endPointX+"px "+zeroX+"px, repeat, #2f2f2f 5%, transparent 6%)," +
"linear-gradient(from "+zeroY+"px "+startPointY+"px to "+zeroY+"px "+endPointY+"px, repeat, #2f2f2f 5%, transparent 6%);");
}
public static void main(String[] args) {
launch(args);
}
private static class Pannable implements EventHandler<MouseEvent> {
private double lastMouseX = 0, lastMouseY = 0;
private final Node eventNode;
private final Node dragNode;
public Pannable(final Node dragNode, final Node eventNode) {
this.eventNode = eventNode;
this.dragNode = dragNode;
this.eventNode.addEventHandler(MouseEvent.ANY, this);
}
@Override
public final void handle(final MouseEvent event) {
if(!event.isPrimaryButtonDown() && !event.isMiddleButtonDown()) return;
if (MouseEvent.MOUSE_PRESSED == event.getEventType()) {
if (this.eventNode.contains(event.getX(), event.getY())) {
this.lastMouseX = event.getSceneX();
this.lastMouseY = event.getSceneY();
event.consume();
}
} else if (MouseEvent.MOUSE_DRAGGED == event.getEventType()) {
((Node) event.getSource()).setCursor(Cursor.MOVE);
final double deltaX = (event.getSceneX() - this.lastMouseX);
final double deltaY = (event.getSceneY() - this.lastMouseY);
final double initialTranslateX = dragNode.getTranslateX();
final double initialTranslateY = dragNode.getTranslateY();
dragNode.setTranslateX(initialTranslateX+deltaX);
dragNode.setTranslateY(initialTranslateY+deltaY);
this.lastMouseX = event.getSceneX();
this.lastMouseY = event.getSceneY();
}
}
}
}
最佳答案
据我所知,您采用的方法非常简单明了,与其他方法相比,这简化了逻辑。
话虽如此,不受欢迎的行为的原因是由于依赖于颜色停止的 % 值,它将根据基值不断变化。我没有对此进行深入调查,但我非常确信这可能是原因:)。
所以 % 的替代方法是依靠“px”。 但是这里有问题... JavaFX CSSParser.java 类中存在错误,其中通过 CSS 应用基于“px”的颜色停止的线性渐变无法正常工作。
要解决这个问题,请使用“setBackground”API 设置背景,而不是通过“setStyle”设置背景。我的意思是,而不是像这样设置
String grad = "linear-gradient(from "+xStart+"px 0px to " + xEnd + "px 0px , repeat, transparent " + (gridSize - 1) + "px, #ffffff50 1px)";
pane.getParent().setStyle("-fx-background-color:"+grad);
使用以下方法设置背景:
String grad = "linear-gradient(from "+xStart+"px 0px to " + xEnd + "px 0px , repeat, transparent " + (gridSize - 1) + "px, #ffffff50 1px)";
Background background = new Background(new BackgroundFill(LinearGradient.valueOf(grad ), CornerRadii.EMPTY, Insets.EMPTY));
((StackPane) pane.getParent()).setBackground(background);
使用“%”色标还有另一个问题。网格线的宽度将不一致。我的意思是你不能在不同的尺度上保持相同的 px(比如 1px)。您可以在演示中注意到这一点。
private void reSetStyle(Pane pane) {
Scene scene = pane.getScene();
double defaultBlockSize = 50;//px Default size of the grid at 100% scale
double gridSize = Math.ceil(defaultBlockSize * scale);
double xStart = Math.ceil(pane.getTranslateX()+scene.getWidth()/2);
double xEnd = xStart+ gridSize;
double yStart = Math.ceil(pane.getTranslateY()+scene.getHeight()/2);
double yEnd = yStart+gridSize;
double linePx = 2; // the line thickness in px
String vLines = "linear-gradient(from "+xStart+"px 0px to " + xEnd + "px 0px , repeat, transparent " + (gridSize - linePx) + "px, #ffffff50 1px)";
String hLines = "linear-gradient(from 0px "+yStart+"px to 0px " + yEnd + "px , repeat, transparent " + (gridSize - linePx) + "px , #ffffff50 1px )";
Background background = new Background(new BackgroundFill(Paint.valueOf("#393939"), CornerRadii.EMPTY, Insets.EMPTY),
new BackgroundFill(LinearGradient.valueOf(vLines), CornerRadii.EMPTY, Insets.EMPTY),
new BackgroundFill(LinearGradient.valueOf(hLines), CornerRadii.EMPTY, Insets.EMPTY));
((StackPane) pane.getParent()).setBackground(background);
}
<color1 stop1>, <color2 stop2>
<color1>
渲染到
<stop1>
数量(px)然后从那里
<color2>
开始渲染直到
<stop2>
.在这种情况下,stop2 值无关紧要(可以是 1px 或 2px 甚至 100px)。所以几乎 stop1 值将决定线条粗细(又名第二颜色渲染)。下面的图片可以给你一些快速的解释。
关于JavaFX css网格不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67626783/
您能否建议如何在 Bootstrap 或 IE 兼容的 CSS 网格中,在没有 CSS 网格的情况下进行以下布局。 在大屏幕中 头部,左侧堆叠的 body 和右侧覆盖头部和 body 高度的图像。 [
我想在 Objective-C 中绘制一个 15*15 的网格。格子颜色是蓝色的,就像在诺基亚制作“贪吃蛇”游戏的棋盘一样。 我试过使用 for 循环来创建 subview ,但它似乎不起作用,我查看
我正在尝试将 CSS 网格与 grid-template-columns: repeat(auto-fill, auto) 一起使用,单元格被设置为最大宽度,导致每行一个元素。 p> 是否可以让元素宽
我正在努力在网格的自定义列上添加一个指向网站的简单、简单的链接。我用了 Inchoo blog为列添加自定义渲染器,它可以工作。我认为只需修改渲染并添加标签就足够了。但我的希望破灭了,行不通。 如何做
使用 Gnuplot 我绘制了下图 - 现在,正如您在图像中看到的那样,很难在线条之间识别出其末端的块。所以我想用不同的颜色或样式交替着色网格。 我现在用来给网格着色的代码是 - set style
假设我有一个非常简单的 WPF 网格(6 行 x 6 列),定义如下:
我有一个希望绑定(bind)到 WPF 网格的集合。 我面临的问题是列数是动态的并且取决于集合。这是一个简单的模型: public interface IRows { string Messa
我正在使用 Vaadin 8,我想制作某种混淆矩阵。我想知道是否可以根据单元格位置而不是数据提供者手动填充表格/网格的值。 referenceTable.addColumn(reference ->
我在 http://jsfiddle.net/TsRJy/ 上创建了一个带有 div 框的网格. 问题 我不知道如何使 a:hover 工作。 信息 重写 HTML 代码,因为表格不适合我。 http
银光处女在这里。如何使网格周围的用户控件自动调整大小以适应内部网格宽度?目前,当浏览器窗口更宽时,用户控件的显示尺寸约为 300 或 400 像素。它在数据网格周围呈现垂直和水平滚动条,这很丑陋。我想
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我想使用 CSS Grid 的 grid-template-areas。 但问题是我正在使用的 CMS 添加了大量额外的包装器。有没有办法忽略额外的包装?因为它弄乱了漂亮的网格区域...... 我正在
在我的Grid中,当我单击“操作”按钮(下面的代码中显示的“删除和编辑”按钮)时,我需要弹出一个窗口,而不用警告消息提醒用户; 在下面的代码中,我正在使用HANDLER handler: button
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我需要模拟一个仓库,其中有几辆自动驾驶车辆在给定的布局上移动,并具有简单的优先级规则。根据我的理解,这个问题可以通过离散事件模拟(DES)轻松解决,我会使用 SimPy为了这。 我看到的问题是,我似乎
在 ASP.NET 中,我可以让用户控件在页面上的表格中占据多个单元格: 用户控件1: foo bar 第1页: 并且自动调整列宽以适应最大的用户控件。 这也可以在 WPF
我正在寻找一种方法来实时搜索我的网格+要过滤的复选框。我有一个包含学生的网格(照片和姓名)。我想要的是有一个复选框,可以过滤学生所在的不同类(class)。还有一个搜索栏,我可以在其中输入学生姓名。
我正在使用 jQuery 和 jQuery UI 构建一个 Web 应用程序。我陷入了僵局。我需要的是一个 jQuery 网格,它具有可编辑字段,并以某种方式在这些可编辑单元格之一上合并一个自动完成字
我想知道是否有其他 JavaScript 组件可以提供具有多个分组的网格表示。下面是jqGrid的截图我扩展了允许该功能,但它需要获取所有数据。我希望在扩展分组时加载数据。 另一个修改后的 jqGri
我一直在为我将在此处描述的 CSS 问题而烦恼: 在下面的示例 ( https://codesandbox.io/s/jjq4km89y5 ) 中,您可以看到一个可滚动的内容(紫色背景)和一个被左侧面
我是一名优秀的程序员,十分优秀!