diff --git a/examples/semi-transparent-layer.css b/examples/semi-transparent-layer.css new file mode 100644 index 0000000000..fa8d7cfa3f --- /dev/null +++ b/examples/semi-transparent-layer.css @@ -0,0 +1,3 @@ +.bw { + filter: grayscale(100%); +} diff --git a/examples/semi-transparent-layer.html b/examples/semi-transparent-layer.html index 5367196352..3a96d2b9cc 100644 --- a/examples/semi-transparent-layer.html +++ b/examples/semi-transparent-layer.html @@ -3,7 +3,7 @@ layout: example.html title: Semi-Transparent Layer shortdesc: Example of a map with a semi-transparent layer. docs: > - This example will display a tiled MaxBox layer semi-transparently over an OSM background. + This example will display a tiled MaxBox layer semi-transparently over an OSM background. The OSM layer is changed to back and white by using a CSS filter. tags: "transparent, osm, tilejson" ---
diff --git a/examples/semi-transparent-layer.js b/examples/semi-transparent-layer.js index 08505b6520..776653a781 100644 --- a/examples/semi-transparent-layer.js +++ b/examples/semi-transparent-layer.js @@ -9,6 +9,7 @@ import TileJSON from '../src/ol/source/TileJSON.js'; const map = new Map({ layers: [ new TileLayer({ + className: 'bw', source: new OSM() }), new TileLayer({ diff --git a/rendering/cases/linestring-style-css-filter/expected.png b/rendering/cases/linestring-style-css-filter/expected.png new file mode 100644 index 0000000000..c2d039de8b Binary files /dev/null and b/rendering/cases/linestring-style-css-filter/expected.png differ diff --git a/rendering/cases/linestring-style-css-filter/index.html b/rendering/cases/linestring-style-css-filter/index.html new file mode 100644 index 0000000000..11dee51983 --- /dev/null +++ b/rendering/cases/linestring-style-css-filter/index.html @@ -0,0 +1,25 @@ + + + + + + +
+ + + + diff --git a/rendering/cases/linestring-style-css-filter/main.js b/rendering/cases/linestring-style-css-filter/main.js new file mode 100644 index 0000000000..925909548b --- /dev/null +++ b/rendering/cases/linestring-style-css-filter/main.js @@ -0,0 +1,70 @@ +import Map from '../../../src/ol/CompositeMap.js'; +import View from '../../../src/ol/View.js'; +import Feature from '../../../src/ol/Feature.js'; +import LineString from '../../../src/ol/geom/LineString.js'; +import VectorLayer from '../../../src/ol/layer/Vector.js'; +import VectorSource from '../../../src/ol/source/Vector.js'; +import Style from '../../../src/ol/style/Style.js'; +import Stroke from '../../../src/ol/style/Stroke.js'; + + +const vectorSource = new VectorSource(); +let feature; + +feature = new Feature({ + geometry: new LineString([[-60, 60], [45, 60]]) +}); +vectorSource.addFeature(feature); + +feature = new Feature({ + geometry: new LineString([[-60, -50], [30, 10]]) +}); +feature.setStyle(new Style({ + stroke: new Stroke({color: '#f00', width: 3}) +})); +vectorSource.addFeature(feature); + +feature = new Feature({ + geometry: new LineString([[-110, -100], [0, 100], [100, -90]]) +}); +feature.setStyle(new Style({ + stroke: new Stroke({ + color: 'rgba(55, 55, 55, 0.75)', + width: 5, + lineCap: 'square', + lineDash: [4, 8], + lineJoin: 'round' + }) +})); +vectorSource.addFeature(feature); + +feature = new Feature({ + geometry: new LineString([[-80, 80], [80, 80], [-40, -90]]) +}); +feature.setStyle([ + new Style({ + stroke: new Stroke({color: '#F2F211', width: 5}) + }), + new Style({ + stroke: new Stroke({color: '#292921', width: 1}) + }) +]); +vectorSource.addFeature(feature); + + +new Map({ + pixelRatio: 1, + layers: [ + new VectorLayer({ + className: 'bw', + source: vectorSource + }) + ], + target: 'map', + view: new View({ + center: [0, 0], + resolution: 1 + }) +}); + +render(); diff --git a/src/ol/layer/Base.js b/src/ol/layer/Base.js index 124841f1e9..e601b7a3a7 100644 --- a/src/ol/layer/Base.js +++ b/src/ol/layer/Base.js @@ -10,6 +10,7 @@ import {assign} from '../obj.js'; /** * @typedef {Object} Options + * @property {string} [className='ol-layer'] A CSS class name to set to the layer element. * @property {number} [opacity=1] Opacity (0, 1). * @property {boolean} [visible=true] Visibility. * @property {import("../extent.js").Extent} [extent] The bounding extent for layer rendering. The layer will not be @@ -57,6 +58,13 @@ class BaseLayer extends BaseObject { properties[LayerProperty.MIN_RESOLUTION] = options.minResolution !== undefined ? options.minResolution : 0; + /** + * @type {string} + * @private + */ + this.className_ = properties.className !== undefined ? options.className : 'ol-layer'; + delete properties.className; + this.setProperties(properties); /** @@ -67,6 +75,13 @@ class BaseLayer extends BaseObject { } + /** + * @return {string} CSS class name. + */ + getClassName() { + return this.className_; + } + /** * @return {import("./Layer.js").State} Layer state. */ diff --git a/src/ol/renderer/canvas/IntermediateCanvas.js b/src/ol/renderer/canvas/IntermediateCanvas.js index a3d9565676..3c27a015bf 100644 --- a/src/ol/renderer/canvas/IntermediateCanvas.js +++ b/src/ol/renderer/canvas/IntermediateCanvas.js @@ -44,7 +44,10 @@ class IntermediateCanvasRenderer extends CanvasLayerRenderer { * @type {CanvasRenderingContext2D} */ this.layerContext = createCanvasContext2D(); - this.layerContext.canvas.style.position = 'absolute'; + + const canvas = this.layerContext.canvas; + canvas.style.position = 'absolute'; + canvas.className = this.getLayer().getClassName(); } /** diff --git a/src/ol/renderer/canvas/VectorLayer.js b/src/ol/renderer/canvas/VectorLayer.js index cd6ec664d8..6864bda9c9 100644 --- a/src/ol/renderer/canvas/VectorLayer.js +++ b/src/ol/renderer/canvas/VectorLayer.js @@ -83,6 +83,7 @@ class CanvasVectorLayerRenderer extends CanvasLayerRenderer { const canvas = this.context.canvas; canvas.style.position = 'absolute'; + canvas.className = this.getLayer().getClassName(); listen(labelCache, EventType.CLEAR, this.handleFontsChanged_, this); }